]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
authorLinus Torvalds <torvalds@g5.osdl.org>
Fri, 18 Nov 2005 22:33:03 +0000 (14:33 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 18 Nov 2005 22:33:03 +0000 (14:33 -0800)
1292 files changed:
CREDITS
Documentation/00-INDEX
Documentation/DocBook/Makefile
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/stylesheet.xsl
Documentation/HOWTO [new file with mode: 0644]
Documentation/atomic_ops.txt
Documentation/block/biodoc.txt
Documentation/cciss.txt
Documentation/devices.txt
Documentation/early-userspace/README
Documentation/feature-removal-schedule.txt
Documentation/networking/dccp.txt [new file with mode: 0644]
Documentation/networking/ip-sysctl.txt
Documentation/oops-tracing.txt
Documentation/scsi/00-INDEX
Documentation/scsi/qlogicfas.txt
Documentation/scsi/qlogicisp.txt [deleted file]
Documentation/scsi/scsi_eh.txt
Documentation/scsi/scsi_mid_low_api.txt
Documentation/usb/bluetooth.txt [deleted file]
Documentation/video4linux/CARDLIST.bttv
Documentation/video4linux/CARDLIST.saa7134
Documentation/video4linux/CARDLIST.tuner
Documentation/x86_64/boot-options.txt
Documentation/x86_64/mm.txt
MAINTAINERS
Makefile
README
arch/arm/Kconfig
arch/arm/boot/compressed/head.S
arch/arm/common/locomo.c
arch/arm/common/sa1111.c
arch/arm/common/scoop.c
arch/arm/configs/enp2611_defconfig
arch/arm/configs/ixdp2400_defconfig
arch/arm/configs/ixdp2401_defconfig
arch/arm/configs/ixdp2800_defconfig
arch/arm/configs/ixdp2801_defconfig
arch/arm/configs/s3c2410_defconfig
arch/arm/kernel/apm.c
arch/arm/kernel/smp.c
arch/arm/lib/csumpartial.S
arch/arm/lib/csumpartialcopygeneric.S
arch/arm/lib/delay.S
arch/arm/lib/findbit.S
arch/arm/lib/io-acorn.S
arch/arm/lib/io-readsb.S
arch/arm/lib/io-readsw-armv3.S
arch/arm/lib/io-readsw-armv4.S
arch/arm/lib/io-writesb.S
arch/arm/lib/io-writesw-armv3.S
arch/arm/lib/io-writesw-armv4.S
arch/arm/lib/uaccess.S
arch/arm/mach-footbridge/common.c
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/akita-ioexp.c [new file with mode: 0644]
arch/arm/mach-pxa/corgi_lcd.c
arch/arm/mach-pxa/corgi_pm.c [new file with mode: 0644]
arch/arm/mach-pxa/corgi_ssp.c
arch/arm/mach-pxa/sharpsl.h
arch/arm/mach-pxa/sharpsl_pm.c
arch/arm/mach-pxa/spitz.c
arch/arm/mach-pxa/spitz_pm.c [new file with mode: 0644]
arch/arm/mach-realview/core.h
arch/arm/mach-realview/localtimer.c
arch/arm/mach-realview/platsmp.c
arch/arm/mach-s3c2410/mach-bast.c
arch/arm/mach-sa1100/neponset.c
arch/arm/plat-omap/dmtimer.c
arch/arm/plat-omap/ocpi.c
arch/arm/plat-omap/pm.c
arch/arm/plat-omap/sram-fn.S
arch/arm/tools/mach-types
arch/frv/kernel/pm.c
arch/i386/Kconfig
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/apm.c
arch/i386/kernel/cpu/amd.c
arch/i386/kernel/cpu/common.c
arch/i386/kernel/cpu/intel.c
arch/i386/kernel/cpu/intel_cacheinfo.c
arch/i386/kernel/cpu/mtrr/main.c
arch/i386/kernel/cpu/proc.c
arch/i386/kernel/crash.c
arch/i386/kernel/entry.S
arch/i386/kernel/smpboot.c
arch/i386/kernel/srat.c
arch/i386/kernel/timers/timer_pit.c
arch/i386/mm/init.c
arch/i386/pci/fixup.c
arch/ia64/Kconfig
arch/ia64/configs/sn2_defconfig
arch/ia64/defconfig
arch/ia64/kernel/efi.c
arch/ia64/kernel/ivt.S
arch/ia64/kernel/kprobes.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca_drv.c
arch/ia64/kernel/process.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/signal.c
arch/ia64/kernel/traps.c
arch/ia64/mm/discontig.c
arch/ia64/mm/tlb.c
arch/ia64/pci/pci.c
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/xpc.h
arch/ia64/sn/kernel/xpc_main.c
arch/ia64/sn/kernel/xpc_partition.c
arch/ia64/sn/pci/tioce_provider.c
arch/m68k/fpsp040/skeleton.S
arch/m68k/ifpsp060/iskeleton.S
arch/m68k/kernel/asm-offsets.c
arch/m68k/kernel/entry.S
arch/m68k/kernel/ptrace.c
arch/mips/Makefile
arch/mips/au1000/common/power.c
arch/mips/au1000/common/setup.c
arch/mips/au1000/common/usbdev.c
arch/mips/configs/atlas_defconfig
arch/mips/configs/bigsur_defconfig
arch/mips/configs/capcella_defconfig
arch/mips/configs/cobalt_defconfig
arch/mips/configs/db1000_defconfig
arch/mips/configs/db1100_defconfig
arch/mips/configs/db1200_defconfig
arch/mips/configs/db1500_defconfig
arch/mips/configs/db1550_defconfig
arch/mips/configs/ddb5476_defconfig
arch/mips/configs/ddb5477_defconfig
arch/mips/configs/decstation_defconfig
arch/mips/configs/e55_defconfig
arch/mips/configs/ev64120_defconfig
arch/mips/configs/ev96100_defconfig
arch/mips/configs/ip22_defconfig
arch/mips/configs/ip27_defconfig
arch/mips/configs/ip32_defconfig
arch/mips/configs/it8172_defconfig
arch/mips/configs/ivr_defconfig
arch/mips/configs/jaguar-atx_defconfig
arch/mips/configs/jmr3927_defconfig
arch/mips/configs/lasat200_defconfig
arch/mips/configs/malta_defconfig
arch/mips/configs/mipssim_defconfig
arch/mips/configs/mpc30x_defconfig
arch/mips/configs/ocelot_3_defconfig
arch/mips/configs/ocelot_c_defconfig
arch/mips/configs/ocelot_defconfig
arch/mips/configs/ocelot_g_defconfig
arch/mips/configs/pb1100_defconfig
arch/mips/configs/pb1500_defconfig
arch/mips/configs/pb1550_defconfig
arch/mips/configs/pnx8550-jbs_defconfig
arch/mips/configs/pnx8550-v2pci_defconfig
arch/mips/configs/qemu_defconfig
arch/mips/configs/rbhma4500_defconfig
arch/mips/configs/rm200_defconfig
arch/mips/configs/sb1250-swarm_defconfig
arch/mips/configs/sead_defconfig
arch/mips/configs/tb0226_defconfig
arch/mips/configs/tb0229_defconfig
arch/mips/configs/workpad_defconfig
arch/mips/configs/yosemite_defconfig
arch/mips/ddb5xxx/ddb5477/lcd44780.c
arch/mips/defconfig
arch/mips/jmr3927/common/rtc_ds1742.c
arch/mips/jmr3927/rbhma3100/setup.c
arch/mips/mips-boards/sead/sead_int.c
arch/mips/mips-boards/sead/sead_setup.c
arch/mips/momentum/ocelot_g/gt-irq.c
arch/mips/pci/Makefile
arch/mips/pci/ops-tx3927.c
arch/mips/pci/pci-jmr3927.c
arch/mips/sgi-ip32/crime.c
arch/parisc/kernel/drivers.c
arch/parisc/kernel/entry.S
arch/parisc/kernel/inventory.c
arch/parisc/kernel/ioctl32.c
arch/parisc/kernel/irq.c
arch/parisc/kernel/perf.c
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/signal.c
arch/parisc/kernel/smp.c
arch/parisc/kernel/syscall.S
arch/powerpc/Kconfig
arch/powerpc/Makefile
arch/powerpc/boot/Makefile [moved from arch/ppc64/boot/Makefile with 96% similarity]
arch/powerpc/boot/README [moved from arch/ppc64/boot/README with 100% similarity]
arch/powerpc/boot/addRamDisk.c [moved from arch/ppc64/boot/addRamDisk.c with 100% similarity]
arch/powerpc/boot/addnote.c [moved from arch/ppc64/boot/addnote.c with 100% similarity]
arch/powerpc/boot/crt0.S [moved from arch/ppc64/boot/crt0.S with 80% similarity]
arch/powerpc/boot/div64.S [moved from arch/ppc64/boot/div64.S with 100% similarity]
arch/powerpc/boot/elf.h [moved from arch/ppc64/boot/elf.h with 100% similarity]
arch/powerpc/boot/install.sh [moved from arch/ppc64/boot/install.sh with 100% similarity]
arch/powerpc/boot/main.c [moved from arch/ppc64/boot/main.c with 77% similarity]
arch/powerpc/boot/page.h [moved from arch/ppc64/boot/page.h with 100% similarity]
arch/powerpc/boot/ppc_asm.h [moved from arch/ppc64/boot/ppc_asm.h with 100% similarity]
arch/powerpc/boot/prom.c [moved from arch/ppc64/boot/prom.c with 100% similarity]
arch/powerpc/boot/prom.h [moved from arch/ppc64/boot/prom.h with 100% similarity]
arch/powerpc/boot/stdio.h [moved from arch/ppc64/boot/stdio.h with 100% similarity]
arch/powerpc/boot/string.S [moved from arch/ppc64/boot/string.S with 100% similarity]
arch/powerpc/boot/string.h [moved from arch/ppc64/boot/string.h with 100% similarity]
arch/powerpc/boot/zImage.lds [moved from arch/ppc64/boot/zImage.lds with 100% similarity]
arch/powerpc/configs/cell_defconfig
arch/powerpc/configs/g5_defconfig
arch/powerpc/configs/iseries_defconfig
arch/powerpc/configs/maple_defconfig
arch/powerpc/configs/ppc64_defconfig [moved from arch/ppc64/defconfig with 86% similarity]
arch/powerpc/configs/pseries_defconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/align.c [moved from arch/ppc64/kernel/align.c with 51% similarity]
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/dma_64.c [moved from arch/ppc64/kernel/dma.c with 100% similarity]
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/idle_64.c [moved from arch/ppc64/kernel/idle.c with 100% similarity]
arch/powerpc/kernel/ioctl32.c
arch/powerpc/kernel/iomap.c [moved from arch/ppc64/kernel/iomap.c with 100% similarity]
arch/powerpc/kernel/iommu.c [moved from arch/ppc64/kernel/iommu.c with 100% similarity]
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/kprobes.c [moved from arch/ppc64/kernel/kprobes.c with 100% similarity]
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/machine_kexec_64.c [moved from arch/ppc64/kernel/machine_kexec.c with 85% similarity]
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/module_64.c [moved from arch/ppc64/kernel/module.c with 100% similarity]
arch/powerpc/kernel/nvram_64.c [moved from arch/ppc64/kernel/nvram.c with 100% similarity]
arch/powerpc/kernel/paca.c
arch/powerpc/kernel/pci_64.c [moved from arch/ppc64/kernel/pci.c with 95% similarity]
arch/powerpc/kernel/pci_direct_iommu.c [moved from arch/ppc64/kernel/pci_direct_iommu.c with 100% similarity]
arch/powerpc/kernel/pci_dn.c [moved from arch/ppc64/kernel/pci_dn.c with 100% similarity]
arch/powerpc/kernel/pci_iommu.c [moved from arch/ppc64/kernel/pci_iommu.c with 100% similarity]
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/proc_ppc64.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/rtas-proc.c
arch/powerpc/kernel/rtas-rtc.c [new file with mode: 0644]
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/udbg.c [moved from arch/ppc64/kernel/udbg.c with 100% similarity]
arch/powerpc/kernel/udbg_16550.c [moved from arch/ppc64/kernel/udbg_16550.c with 100% similarity]
arch/powerpc/kernel/udbg_scc.c [moved from arch/ppc64/kernel/udbg_scc.c with 100% similarity]
arch/powerpc/kernel/vdso.c [moved from arch/ppc64/kernel/vdso.c with 68% similarity]
arch/powerpc/kernel/vdso32/Makefile [moved from arch/ppc64/kernel/vdso32/Makefile with 91% similarity]
arch/powerpc/kernel/vdso32/cacheflush.S [moved from arch/ppc64/kernel/vdso32/cacheflush.S with 97% similarity]
arch/powerpc/kernel/vdso32/datapage.S [moved from arch/ppc64/kernel/vdso32/datapage.S with 81% similarity]
arch/powerpc/kernel/vdso32/gettimeofday.S [new file with mode: 0644]
arch/powerpc/kernel/vdso32/note.S [moved from arch/ppc64/kernel/vdso32/note.S with 100% similarity]
arch/powerpc/kernel/vdso32/sigtramp.S [moved from arch/ppc64/kernel/vdso32/sigtramp.S with 100% similarity]
arch/powerpc/kernel/vdso32/vdso32.lds.S [moved from arch/ppc64/kernel/vdso32/vdso32.lds.S with 97% similarity]
arch/powerpc/kernel/vdso32/vdso32_wrapper.S [moved from arch/ppc64/kernel/vdso32/vdso32_wrapper.S with 79% similarity]
arch/powerpc/kernel/vdso64/Makefile [moved from arch/ppc64/kernel/vdso64/Makefile with 100% similarity]
arch/powerpc/kernel/vdso64/cacheflush.S [moved from arch/ppc64/kernel/vdso64/cacheflush.S with 97% similarity]
arch/powerpc/kernel/vdso64/datapage.S [moved from arch/ppc64/kernel/vdso64/datapage.S with 82% similarity]
arch/powerpc/kernel/vdso64/gettimeofday.S [new file with mode: 0644]
arch/powerpc/kernel/vdso64/note.S [moved from arch/ppc64/kernel/vdso64/note.S with 100% similarity]
arch/powerpc/kernel/vdso64/sigtramp.S [moved from arch/ppc64/kernel/vdso64/sigtramp.S with 100% similarity]
arch/powerpc/kernel/vdso64/vdso64.lds.S [moved from arch/ppc64/kernel/vdso64/vdso64.lds.S with 97% similarity]
arch/powerpc/kernel/vdso64/vdso64_wrapper.S [moved from arch/ppc64/kernel/vdso64/vdso64_wrapper.S with 79% similarity]
arch/powerpc/mm/fsl_booke_mmu.c
arch/powerpc/mm/lmb.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/numa.c
arch/powerpc/oprofile/op_model_fsl_booke.c
arch/powerpc/oprofile/op_model_power4.c
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/chrp/smp.c
arch/powerpc/platforms/chrp/time.c
arch/powerpc/platforms/iseries/irq.c
arch/powerpc/platforms/iseries/pci.c
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/maple/pci.c
arch/powerpc/platforms/maple/time.c
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/pci.c
arch/powerpc/platforms/powermac/time.c
arch/powerpc/platforms/pseries/Makefile
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/hvconsole.c [moved from arch/ppc64/kernel/hvconsole.c with 100% similarity]
arch/powerpc/platforms/pseries/hvcserver.c [moved from arch/ppc64/kernel/hvcserver.c with 100% similarity]
arch/powerpc/platforms/pseries/rtasd.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/xmon/xmon.c
arch/ppc/kernel/Makefile
arch/ppc/kernel/align.c [deleted file]
arch/ppc/kernel/asm-offsets.c
arch/ppc/kernel/head_fsl_booke.S
arch/ppc/kernel/pci.c
arch/ppc/kernel/setup.c
arch/ppc/mm/fsl_booke_mmu.c
arch/ppc/mm/init.c
arch/ppc/platforms/83xx/mpc834x_sys.c
arch/ppc/platforms/83xx/mpc834x_sys.h
arch/ppc/platforms/85xx/mpc8540_ads.c
arch/ppc/platforms/85xx/mpc8540_ads.h
arch/ppc/platforms/85xx/mpc8555_cds.h
arch/ppc/platforms/85xx/mpc8560_ads.c
arch/ppc/platforms/85xx/mpc8560_ads.h
arch/ppc/platforms/85xx/mpc85xx_ads_common.c
arch/ppc/platforms/85xx/mpc85xx_ads_common.h
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.h
arch/ppc/platforms/85xx/sbc8560.c
arch/ppc/platforms/85xx/stx_gp3.h
arch/ppc/platforms/pmac_feature.c
arch/ppc/platforms/pq2ads.c
arch/ppc/syslib/cpm2_pic.c
arch/ppc/syslib/ipic.h
arch/ppc/syslib/mpc83xx_devices.c
arch/ppc/syslib/mpc83xx_sys.c
arch/ppc/syslib/mpc85xx_devices.c
arch/ppc/syslib/mpc85xx_sys.c
arch/ppc/syslib/mpc8xx_devices.c
arch/ppc/syslib/mpc8xx_sys.c
arch/ppc/syslib/ppc83xx_setup.c
arch/ppc/syslib/ppc83xx_setup.h
arch/ppc/syslib/ppc85xx_common.c
arch/ppc/syslib/ppc85xx_common.h
arch/ppc/syslib/ppc85xx_setup.c
arch/ppc/syslib/ppc85xx_setup.h
arch/ppc/syslib/ppc_sys.c
arch/ppc/syslib/pq2_devices.c
arch/ppc/syslib/pq2_sys.c
arch/ppc/xmon/start.c
arch/ppc64/Kconfig [deleted file]
arch/ppc64/Kconfig.debug [deleted file]
arch/ppc64/Makefile [deleted file]
arch/ppc64/configs/bpa_defconfig [deleted file]
arch/ppc64/configs/g5_defconfig [deleted file]
arch/ppc64/configs/iSeries_defconfig [deleted file]
arch/ppc64/configs/maple_defconfig [deleted file]
arch/ppc64/configs/pSeries_defconfig [deleted file]
arch/ppc64/kernel/Makefile [deleted file]
arch/ppc64/kernel/asm-offsets.c [deleted file]
arch/ppc64/kernel/btext.c [deleted file]
arch/ppc64/kernel/head.S [deleted file]
arch/ppc64/kernel/misc.S [deleted file]
arch/ppc64/kernel/ppc_ksyms.c [deleted file]
arch/ppc64/kernel/prom.c [deleted file]
arch/ppc64/kernel/prom_init.c [deleted file]
arch/ppc64/kernel/rtc.c [deleted file]
arch/ppc64/kernel/semaphore.c [deleted file]
arch/ppc64/kernel/vdso32/gettimeofday.S [deleted file]
arch/ppc64/kernel/vdso64/gettimeofday.S [deleted file]
arch/ppc64/kernel/vmlinux.lds.S [deleted file]
arch/ppc64/xmon/privinst.h [deleted file]
arch/sparc/lib/atomic32.c
arch/sparc/lib/bitext.c
arch/sparc64/kernel/ioctl32.c
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/smp.c
arch/um/Kconfig
arch/um/Kconfig.i386
arch/um/Makefile-i386
arch/um/drivers/chan_kern.c
arch/um/drivers/chan_user.c
arch/um/drivers/daemon_user.c
arch/um/drivers/fd.c
arch/um/drivers/mcast_user.c
arch/um/drivers/net_kern.c
arch/um/drivers/port_user.c
arch/um/drivers/pty.c
arch/um/drivers/tty.c
arch/um/drivers/ubd_kern.c
arch/um/drivers/xterm.c
arch/um/include/chan_user.h
arch/um/include/um_uaccess.h
arch/um/kernel/skas/include/uaccess-skas.h
arch/um/kernel/skas/uaccess.c
arch/um/kernel/trap_kern.c
arch/um/kernel/tt/include/uaccess-tt.h
arch/um/kernel/tt/uaccess.c
arch/v850/Kconfig
arch/v850/kernel/irq.c
arch/x86_64/Kconfig
arch/x86_64/Kconfig.debug
arch/x86_64/defconfig
arch/x86_64/ia32/ia32_aout.c
arch/x86_64/ia32/ia32_binfmt.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/aperture.c
arch/x86_64/kernel/apic.c
arch/x86_64/kernel/e820.c
arch/x86_64/kernel/entry.S
arch/x86_64/kernel/head.S
arch/x86_64/kernel/head64.c
arch/x86_64/kernel/i8259.c
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/mce.c
arch/x86_64/kernel/mce_amd.c [new file with mode: 0644]
arch/x86_64/kernel/mpparse.c
arch/x86_64/kernel/pci-gart.c
arch/x86_64/kernel/process.c
arch/x86_64/kernel/reboot.c
arch/x86_64/kernel/setup.c
arch/x86_64/kernel/setup64.c
arch/x86_64/kernel/signal.c
arch/x86_64/kernel/smp.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/sys_x86_64.c
arch/x86_64/kernel/traps.c
arch/x86_64/kernel/vmlinux.lds.S
arch/x86_64/kernel/x8664_ksyms.c
arch/x86_64/lib/clear_page.S
arch/x86_64/lib/copy_page.S
arch/x86_64/lib/memcpy.S
arch/x86_64/lib/memset.S
arch/x86_64/mm/fault.c
arch/x86_64/mm/init.c
arch/x86_64/mm/k8topology.c
arch/x86_64/mm/numa.c
arch/x86_64/mm/srat.c
arch/xtensa/platform-iss/network.c
block/as-iosched.c
block/cfq-iosched.c
block/deadline-iosched.c
block/elevator.c
block/genhd.c
block/ll_rw_blk.c
block/noop-iosched.c
drivers/acpi/bus.c
drivers/acpi/glue.c
drivers/acpi/processor_idle.c
drivers/atm/horizon.c
drivers/base/firmware_class.c
drivers/base/platform.c
drivers/block/acsi.c
drivers/block/cciss.c
drivers/block/cciss.h
drivers/block/cciss_scsi.c
drivers/block/floppy.c
drivers/block/pktcdvd.c
drivers/char/Kconfig
drivers/char/agp/ali-agp.c
drivers/char/agp/amd-k7-agp.c
drivers/char/agp/amd64-agp.c
drivers/char/agp/ati-agp.c
drivers/char/agp/efficeon-agp.c
drivers/char/agp/i460-agp.c
drivers/char/agp/intel-agp.c
drivers/char/agp/nvidia-agp.c
drivers/char/agp/sis-agp.c
drivers/char/agp/sworks-agp.c
drivers/char/agp/uninorth-agp.c
drivers/char/agp/via-agp.c
drivers/char/epca.c
drivers/char/ftape/lowlevel/ftape-buffer.c
drivers/char/i8k.c
drivers/char/ipmi/ipmi_msghandler.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/pcmcia/Kconfig
drivers/char/pcmcia/Makefile
drivers/char/pcmcia/cm4000_cs.c [new file with mode: 0644]
drivers/char/pcmcia/cm4040_cs.c [new file with mode: 0644]
drivers/char/pcmcia/cm4040_cs.h [new file with mode: 0644]
drivers/char/s3c2410-rtc.c
drivers/char/sonypi.c
drivers/char/synclink.c
drivers/char/synclinkmp.c
drivers/char/tb0219.c
drivers/char/tpm/Kconfig
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_atmel.c
drivers/char/tpm/tpm_atmel.h [new file with mode: 0644]
drivers/char/vr41xx_giu.c
drivers/char/vr41xx_rtc.c
drivers/char/watchdog/booke_wdt.c
drivers/char/watchdog/mpcore_wdt.c
drivers/char/watchdog/mv64x60_wdt.c
drivers/char/watchdog/pcwd_pci.c
drivers/char/watchdog/s3c2410_wdt.c
drivers/char/watchdog/wdt_pci.c
drivers/hwmon/hdaps.c
drivers/i2c/busses/i2c-ali1535.c
drivers/i2c/busses/i2c-ali1563.c
drivers/i2c/busses/i2c-ali15x3.c
drivers/i2c/busses/i2c-amd756.c
drivers/i2c/busses/i2c-amd8111.c
drivers/i2c/busses/i2c-hydra.c
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-i810.c
drivers/i2c/busses/i2c-iop3xx.c
drivers/i2c/busses/i2c-ixp2000.c
drivers/i2c/busses/i2c-ixp4xx.c
drivers/i2c/busses/i2c-mpc.c
drivers/i2c/busses/i2c-mv64xxx.c
drivers/i2c/busses/i2c-nforce2.c
drivers/i2c/busses/i2c-piix4.c
drivers/i2c/busses/i2c-prosavage.c
drivers/i2c/busses/i2c-pxa.c
drivers/i2c/busses/i2c-s3c2410.c
drivers/i2c/busses/i2c-savage4.c
drivers/i2c/busses/i2c-sis5595.c
drivers/i2c/busses/i2c-sis630.c
drivers/i2c/busses/i2c-sis96x.c
drivers/i2c/busses/i2c-via.c
drivers/i2c/busses/i2c-viapro.c
drivers/i2c/busses/i2c-voodoo3.c
drivers/i2c/chips/isp1301_omap.c
drivers/ide/Kconfig
drivers/ide/Makefile
drivers/ide/mips/Makefile [new file with mode: 0644]
drivers/ide/mips/swarm.c [new file with mode: 0644]
drivers/ide/pci/sl82c105.c
drivers/ide/ppc/pmac.c
drivers/ide/setup-pci.c
drivers/infiniband/hw/mthca/mthca_main.c
drivers/input/keyboard/corgikbd.c
drivers/input/keyboard/spitzkbd.c
drivers/input/serio/i8042.c
drivers/input/serio/rpckbd.c
drivers/input/touchscreen/corgi_ts.c
drivers/isdn/hisax/Kconfig
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/pcbit/Kconfig
drivers/md/bitmap.c
drivers/md/md.c
drivers/media/common/ir-common.c
drivers/media/dvb/b2c2/Kconfig
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/video/Kconfig
drivers/media/video/Makefile
drivers/media/video/bttv-cards.c
drivers/media/video/bttv-driver.c
drivers/media/video/bttv-gpio.c
drivers/media/video/bttv.h
drivers/media/video/bttvp.h
drivers/media/video/cx25840/Makefile [new file with mode: 0644]
drivers/media/video/cx25840/cx25840-audio.c [new file with mode: 0644]
drivers/media/video/cx25840/cx25840-core.c [new file with mode: 0644]
drivers/media/video/cx25840/cx25840-firmware.c [new file with mode: 0644]
drivers/media/video/cx25840/cx25840-vbi.c [new file with mode: 0644]
drivers/media/video/cx25840/cx25840.h [new file with mode: 0644]
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/em28xx/em28xx-input.c
drivers/media/video/ir-kbd-gpio.c
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/saa7115.c [new file with mode: 0644]
drivers/media/video/saa711x.c
drivers/media/video/saa7127.c [new file with mode: 0644]
drivers/media/video/saa7134/Kconfig
drivers/media/video/saa7134/Makefile
drivers/media/video/saa7134/saa7134-alsa.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134-oss.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/tda8290.c
drivers/media/video/tuner-core.c
drivers/media/video/tuner-simple.c
drivers/media/video/wm8775.c
drivers/mfd/mcp-sa11x0.c
drivers/misc/hdpuftrs/hdpu_cpustate.c
drivers/misc/hdpuftrs/hdpu_nexus.c
drivers/mmc/mmci.c
drivers/mmc/pxamci.c
drivers/mmc/wbsd.c
drivers/mtd/maps/Kconfig
drivers/mtd/maps/bast-flash.c
drivers/mtd/maps/integrator-flash.c
drivers/mtd/maps/ixp2000.c
drivers/mtd/maps/ixp4xx.c
drivers/mtd/maps/omap_nor.c
drivers/mtd/maps/plat-ram.c
drivers/mtd/maps/sa1100-flash.c
drivers/mtd/nand/s3c2410.c
drivers/net/3c509.c
drivers/net/Kconfig
drivers/net/au1000_eth.c
drivers/net/bnx2.c
drivers/net/depca.c
drivers/net/dm9000.c
drivers/net/e100.c
drivers/net/fec_8xx/Kconfig
drivers/net/forcedeth.c
drivers/net/gianfar.c
drivers/net/gianfar.h
drivers/net/gianfar_ethtool.c
drivers/net/gianfar_mii.c
drivers/net/gianfar_mii.h
drivers/net/gt96100eth.c
drivers/net/ibmveth.c
drivers/net/ioc3-eth.c
drivers/net/irda/ali-ircc.c
drivers/net/irda/nsc-ircc.c
drivers/net/irda/sa1100_ir.c
drivers/net/irda/smsc-ircc2.c
drivers/net/jazzsonic.c
drivers/net/macsonic.c
drivers/net/mv643xx_eth.c
drivers/net/r8169.c
drivers/net/saa9730.c
drivers/net/saa9730.h
drivers/net/smc91x.c
drivers/net/smc91x.h
drivers/net/spider_net.c
drivers/net/sungem.c
drivers/net/tokenring/proteon.c
drivers/net/tokenring/skisa.c
drivers/net/wan/hdlc_cisco.c
drivers/net/wan/hdlc_fr.c
drivers/net/wan/hdlc_generic.c
drivers/net/wan/sdladrv.c
drivers/net/wireless/Kconfig
drivers/net/wireless/atmel.c
drivers/net/wireless/atmel.h
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/atmel_pci.c
drivers/net/wireless/hermes.c
drivers/net/wireless/hermes.h
drivers/net/wireless/i82593.h
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2100.h
drivers/net/wireless/ipw2200.c
drivers/net/wireless/prism54/isl_38xx.c
drivers/parisc/iosapic.c
drivers/parisc/superio.c
drivers/pci/access.c
drivers/pci/hotplug/pciehp.h
drivers/pci/hotplug/pciehp_core.c
drivers/pci/hotplug/pciehp_ctrl.c
drivers/pci/hotplug/pciehp_hpc.c
drivers/pci/hotplug/pciehp_pci.c
drivers/pci/hotplug/pciehprm.h [deleted file]
drivers/pci/hotplug/pciehprm_acpi.c
drivers/pci/hotplug/pciehprm_nonacpi.c
drivers/pci/hotplug/pciehprm_nonacpi.h [deleted file]
drivers/pci/hotplug/rpadlpar_core.c
drivers/pci/hotplug/rpaphp.h
drivers/pci/hotplug/rpaphp_pci.c
drivers/pci/hotplug/shpchp_hpc.c
drivers/pci/hotplug/shpchp_pci.c
drivers/pci/msi.c
drivers/pci/pci-acpi.c
drivers/pci/pci-driver.c
drivers/pci/pci.c
drivers/pci/quirks.c
drivers/pcmcia/cs.c
drivers/pcmcia/ds.c
drivers/pcmcia/i82365.c
drivers/s390/char/raw3270.c
drivers/s390/net/lcs.c
drivers/s390/net/qeth.h
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_mpc.c
drivers/s390/net/qeth_mpc.h
drivers/s390/net/qeth_sys.c
drivers/s390/net/qeth_tso.h
drivers/sbus/char/display7seg.c
drivers/sbus/char/rtc.c
drivers/scsi/53c7xx.c
drivers/scsi/53c7xx.h
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/NCR53C9x.c
drivers/scsi/NCR53C9x.h
drivers/scsi/NCR53c406a.c
drivers/scsi/a2091.c
drivers/scsi/a2091.h
drivers/scsi/a3000.c
drivers/scsi/a3000.h
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/commsup.c
drivers/scsi/advansys.c
drivers/scsi/advansys.h
drivers/scsi/aha152x.c
drivers/scsi/aha1542.c
drivers/scsi/aha1542.h
drivers/scsi/aha1740.c
drivers/scsi/ahci.c
drivers/scsi/aic7xxx/aic79xx_osm.c
drivers/scsi/aic7xxx/aic7xxx_osm.c
drivers/scsi/aic7xxx_old.c
drivers/scsi/amiga7xx.c
drivers/scsi/amiga7xx.h
drivers/scsi/arm/acornscsi.c
drivers/scsi/arm/acornscsi.h
drivers/scsi/arm/arxescsi.c
drivers/scsi/arm/cumana_1.c
drivers/scsi/arm/cumana_2.c
drivers/scsi/arm/ecoscsi.c
drivers/scsi/arm/eesox.c
drivers/scsi/arm/fas216.c
drivers/scsi/arm/fas216.h
drivers/scsi/arm/oak.c
drivers/scsi/arm/powertec.c
drivers/scsi/arm/scsi.h
drivers/scsi/ata_piix.c
drivers/scsi/atari_NCR5380.c
drivers/scsi/atari_scsi.c
drivers/scsi/atari_scsi.h
drivers/scsi/blz1230.c
drivers/scsi/blz2060.c
drivers/scsi/bvme6000.c
drivers/scsi/bvme6000.h
drivers/scsi/cyberstorm.c
drivers/scsi/cyberstormII.c
drivers/scsi/dec_esp.c
drivers/scsi/dpti.h
drivers/scsi/dtc.c
drivers/scsi/dtc.h
drivers/scsi/fastlane.c
drivers/scsi/fcal.c
drivers/scsi/fcal.h
drivers/scsi/fd_mcs.c
drivers/scsi/g_NCR5380.c
drivers/scsi/g_NCR5380.h
drivers/scsi/gdth.c
drivers/scsi/gdth.h
drivers/scsi/gdth_proc.c
drivers/scsi/gvp11.c
drivers/scsi/gvp11.h
drivers/scsi/ibmmca.c
drivers/scsi/ibmmca.h
drivers/scsi/ide-scsi.c
drivers/scsi/in2000.c
drivers/scsi/in2000.h
drivers/scsi/ipr.c
drivers/scsi/ipr.h
drivers/scsi/ips.c
drivers/scsi/ips.h
drivers/scsi/jazz_esp.c
drivers/scsi/libata-core.c
drivers/scsi/libata-scsi.c
drivers/scsi/libata.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/mac_esp.c
drivers/scsi/mac_scsi.c
drivers/scsi/mca_53c9x.c
drivers/scsi/megaraid.c
drivers/scsi/megaraid.h
drivers/scsi/megaraid/mega_common.h
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/mvme147.c
drivers/scsi/mvme147.h
drivers/scsi/mvme16x.c
drivers/scsi/mvme16x.h
drivers/scsi/nsp32.c
drivers/scsi/oktagon_esp.c
drivers/scsi/pas16.c
drivers/scsi/pas16.h
drivers/scsi/pci2000.h
drivers/scsi/pcmcia/nsp_cs.c
drivers/scsi/pcmcia/nsp_cs.h
drivers/scsi/pcmcia/qlogic_stub.c
drivers/scsi/pdc_adma.c
drivers/scsi/pluto.c
drivers/scsi/pluto.h
drivers/scsi/psi240i.c
drivers/scsi/qla1280.c
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_sup.c
drivers/scsi/qla2xxx/qla_version.h
drivers/scsi/qlogicfas.c
drivers/scsi/qlogicfc.c
drivers/scsi/qlogicisp.c [deleted file]
drivers/scsi/qlogicisp_asm.c [deleted file]
drivers/scsi/raid_class.c
drivers/scsi/sata_mv.c
drivers/scsi/sata_nv.c
drivers/scsi/sata_promise.c
drivers/scsi/sata_qstor.c
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sis.c
drivers/scsi/sata_svw.c
drivers/scsi/sata_sx4.c
drivers/scsi/sata_uli.c
drivers/scsi/sata_via.c
drivers/scsi/sata_vsc.c
drivers/scsi/scsi_debug.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_typedefs.h
drivers/scsi/sd.c
drivers/scsi/seagate.c
drivers/scsi/seagate.h
drivers/scsi/sgiwd93.c
drivers/scsi/sun3_NCR5380.c
drivers/scsi/sun3_scsi.c
drivers/scsi/sun3_scsi.h
drivers/scsi/sun3_scsi_vme.c
drivers/scsi/sun3x_esp.c
drivers/scsi/sym53c416.c
drivers/scsi/sym53c416.h
drivers/scsi/t128.c
drivers/scsi/t128.h
drivers/scsi/u14-34f.c
drivers/scsi/ultrastor.c
drivers/scsi/ultrastor.h
drivers/serial/68328serial.c
drivers/serial/8250.c
drivers/serial/8250_pnp.c
drivers/serial/Kconfig
drivers/serial/cpm_uart/cpm_uart_core.c
drivers/serial/cpm_uart/cpm_uart_cpm1.c
drivers/serial/cpm_uart/cpm_uart_cpm2.c
drivers/serial/dz.c
drivers/serial/imx.c
drivers/serial/mpc52xx_uart.c
drivers/serial/mpsc.c
drivers/serial/mux.c
drivers/serial/pxa.c
drivers/serial/s3c2410.c
drivers/serial/sa1100.c
drivers/serial/serial_core.c
drivers/serial/vr41xx_siu.c
drivers/tc/zs.c
drivers/tc/zs.h
drivers/usb/atm/Makefile
drivers/usb/atm/usbatm.h
drivers/usb/core/Makefile
drivers/usb/core/buffer.c
drivers/usb/core/config.c
drivers/usb/core/devio.c
drivers/usb/core/file.c
drivers/usb/core/hcd-pci.c
drivers/usb/core/hcd.c
drivers/usb/core/hub.c
drivers/usb/core/inode.c
drivers/usb/core/message.c
drivers/usb/core/notify.c
drivers/usb/core/sysfs.c
drivers/usb/core/urb.c
drivers/usb/core/usb.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/goku_udc.c
drivers/usb/gadget/lh7a40x_udc.c
drivers/usb/gadget/net2280.c
drivers/usb/gadget/omap_udc.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/ohci-au1xxx.c
drivers/usb/host/ohci-lh7a404.c
drivers/usb/host/ohci-omap.c
drivers/usb/host/ohci-pci.c
drivers/usb/host/ohci-ppc-soc.c
drivers/usb/host/ohci-pxa27x.c
drivers/usb/host/ohci-s3c2410.c
drivers/usb/host/sl811-hcd.c
drivers/usb/host/uhci-hcd.c
drivers/usb/image/microtek.c
drivers/usb/image/microtek.h
drivers/usb/input/Makefile
drivers/usb/input/hid-core.c
drivers/usb/input/itmtouch.c
drivers/usb/input/keyspan_remote.c
drivers/usb/input/mtouchusb.c
drivers/usb/input/pid.c
drivers/usb/input/touchkitusb.c
drivers/usb/input/wacom.c
drivers/usb/misc/Makefile
drivers/usb/misc/auerswald.c
drivers/usb/misc/phidgetservo.c
drivers/usb/misc/rio500.c
drivers/usb/misc/usbled.c
drivers/usb/misc/usbtest.c
drivers/usb/misc/uss720.c
drivers/usb/net/Makefile
drivers/usb/net/asix.c
drivers/usb/net/cdc_ether.c
drivers/usb/net/cdc_subset.c
drivers/usb/net/gl620a.c
drivers/usb/net/kaweth.c
drivers/usb/net/net1080.c
drivers/usb/net/pegasus.c
drivers/usb/net/plusb.c
drivers/usb/net/rndis_host.c
drivers/usb/net/usbnet.c
drivers/usb/net/zaurus.c
drivers/usb/serial/ChangeLog.history [moved from drivers/usb/serial/ChangeLog.old with 99% similarity]
drivers/usb/serial/Kconfig
drivers/usb/serial/Makefile
drivers/usb/serial/anydata.c [new file with mode: 0644]
drivers/usb/serial/cp2101.c
drivers/usb/serial/generic.c
drivers/usb/serial/nokia_dku2.c [deleted file]
drivers/usb/serial/pl2303.c
drivers/usb/serial/pl2303.h
drivers/usb/storage/Kconfig
drivers/usb/storage/shuttle_usbat.c
drivers/usb/storage/unusual_devs.h
drivers/video/acornfb.c
drivers/video/arcfb.c
drivers/video/backlight/corgi_bl.c
drivers/video/bw2.c
drivers/video/cg14.c
drivers/video/cg3.c
drivers/video/cg6.c
drivers/video/console/Kconfig
drivers/video/console/Makefile
drivers/video/console/fbcon.c
drivers/video/console/fbcon.h
drivers/video/console/fbcon_ccw.c
drivers/video/console/fbcon_cw.c
drivers/video/console/fbcon_ud.c
drivers/video/console/font_rl.c [deleted file]
drivers/video/console/fonts.c
drivers/video/dnfb.c
drivers/video/epson1355fb.c
drivers/video/ffb.c
drivers/video/gbefb.c
drivers/video/imxfb.c
drivers/video/leo.c
drivers/video/nvidia/nv_proto.h
drivers/video/nvidia/nvidia.c
drivers/video/offb.c
drivers/video/p9100.c
drivers/video/pxafb.c
drivers/video/q40fb.c
drivers/video/s1d13xxxfb.c
drivers/video/s3c2410fb.c
drivers/video/sa1100fb.c
drivers/video/sbuslib.c
drivers/video/sbuslib.h
drivers/video/sgivwfb.c
drivers/video/tcx.c
drivers/video/vesafb.c
drivers/video/vfb.c
drivers/video/w100fb.c
fs/Kconfig
fs/afs/callback.c
fs/aio.c
fs/befs/attribute.c [deleted file]
fs/cifs/CHANGES
fs/cifs/cifs_unicode.c
fs/cifs/cifsfs.c
fs/cifs/cifsproto.h
fs/cifs/cifssmb.c
fs/cifs/cn_cifs.h [new file with mode: 0644]
fs/cifs/connect.c
fs/cifs/inode.c
fs/compat_ioctl.c
fs/ext2/super.c
fs/ext3/inode.c
fs/freevxfs/vxfs_bmap.c
fs/freevxfs/vxfs_olt.c
fs/ioprio.c
fs/jffs/jffs_fm.c
fs/jffs2/scan.c
fs/locks.c
fs/partitions/ultrix.c
fs/proc/task_mmu.c
fs/reiserfs/hashes.c
include/asm-alpha/atomic.h
include/asm-arm/arch-clps711x/uncompress.h
include/asm-arm/arch-epxa10db/uncompress.h
include/asm-arm/arch-h720x/uncompress.h
include/asm-arm/arch-imx/irqs.h
include/asm-arm/arch-imx/timex.h
include/asm-arm/arch-integrator/smp.h
include/asm-arm/arch-l7200/aux_reg.h
include/asm-arm/arch-l7200/gp_timers.h
include/asm-arm/arch-omap/gpio.h
include/asm-arm/arch-omap/irqs.h
include/asm-arm/arch-omap/mcbsp.h
include/asm-arm/arch-omap/system.h
include/asm-arm/arch-pxa/akita.h
include/asm-arm/arch-realview/hardware.h
include/asm-arm/arch-realview/system.h
include/asm-arm/arch-rpc/system.h
include/asm-arm/arch-sa1100/memory.h
include/asm-arm/atomic.h
include/asm-arm/bitops.h
include/asm-arm/hardware/dec21285.h
include/asm-arm/mmu_context.h
include/asm-arm/system.h
include/asm-arm/thread_info.h
include/asm-arm26/atomic.h
include/asm-cris/atomic.h
include/asm-frv/atomic.h
include/asm-generic/sections.h
include/asm-h8300/atomic.h
include/asm-i386/atomic.h
include/asm-i386/mach-default/mach_reboot.h
include/asm-i386/msi.h
include/asm-i386/processor.h
include/asm-i386/signal.h
include/asm-i386/smp.h
include/asm-i386/system.h
include/asm-ia64/atomic.h
include/asm-ia64/kdebug.h
include/asm-ia64/mmu_context.h
include/asm-ia64/msi.h
include/asm-ia64/page.h
include/asm-ia64/pgalloc.h
include/asm-ia64/pgtable.h
include/asm-ia64/tlbflush.h
include/asm-m68k/atomic.h
include/asm-m68k/processor.h
include/asm-m68k/thread_info.h
include/asm-m68knommu/atomic.h
include/asm-mips/atomic.h
include/asm-mips/io.h
include/asm-mips/ip32/crime.h
include/asm-mips/ip32/mace.h
include/asm-mips/mach-db1x00/db1200.h
include/asm-mips/mach-db1x00/db1x00.h
include/asm-mips/mach-ip32/mc146818rtc.h
include/asm-mips/mach-jmr3927/ds1742.h [moved from include/asm-mips/mach-jmr3927/asm/ds1742.h with 74% similarity]
include/asm-mips/mach-pb1x00/pb1200.h
include/asm-mips/mach-pb1x00/pb1550.h
include/asm-mips/mips-boards/seadint.h
include/asm-mips/signal.h
include/asm-parisc/atomic.h
include/asm-parisc/irq.h
include/asm-parisc/smp.h
include/asm-parisc/spinlock.h
include/asm-parisc/tlbflush.h
include/asm-powerpc/atomic.h
include/asm-powerpc/auxvec.h
include/asm-powerpc/btext.h [moved from include/asm-ppc64/btext.h with 100% similarity]
include/asm-powerpc/cputable.h
include/asm-powerpc/delay.h [new file with mode: 0644]
include/asm-powerpc/eeh.h [moved from include/asm-ppc64/eeh.h with 98% similarity]
include/asm-powerpc/elf.h
include/asm-powerpc/floppy.h [moved from include/asm-ppc64/floppy.h with 78% similarity]
include/asm-powerpc/hvconsole.h [moved from include/asm-ppc64/hvconsole.h with 100% similarity]
include/asm-powerpc/hvcserver.h [moved from include/asm-ppc64/hvcserver.h with 100% similarity]
include/asm-powerpc/irq.h
include/asm-powerpc/kexec.h
include/asm-powerpc/machdep.h
include/asm-powerpc/nvram.h [moved from include/asm-ppc64/nvram.h with 90% similarity]
include/asm-powerpc/page.h [new file with mode: 0644]
include/asm-powerpc/page_32.h [new file with mode: 0644]
include/asm-powerpc/page_64.h [new file with mode: 0644]
include/asm-powerpc/ppc-pci.h
include/asm-powerpc/processor.h
include/asm-powerpc/serial.h [moved from include/asm-ppc64/serial.h with 53% similarity]
include/asm-powerpc/sparsemem.h
include/asm-powerpc/systemcfg.h [deleted file]
include/asm-powerpc/topology.h
include/asm-powerpc/udbg.h [moved from include/asm-ppc64/udbg.h with 90% similarity]
include/asm-powerpc/vdso.h [moved from include/asm-ppc64/vdso.h with 97% similarity]
include/asm-powerpc/vdso_datapage.h [new file with mode: 0644]
include/asm-ppc/cpm2.h
include/asm-ppc/immap_85xx.h
include/asm-ppc/ipic.h
include/asm-ppc/mpc83xx.h
include/asm-ppc/mpc85xx.h
include/asm-ppc/nvram.h [deleted file]
include/asm-ppc/page.h
include/asm-ppc/pgalloc.h
include/asm-ppc/ppc_sys.h
include/asm-ppc64/delay.h [deleted file]
include/asm-ppc64/mmzone.h
include/asm-ppc64/page.h [deleted file]
include/asm-ppc64/pci-bridge.h
include/asm-ppc64/prom.h [deleted file]
include/asm-ppc64/system.h [deleted file]
include/asm-s390/atomic.h
include/asm-sh/atomic.h
include/asm-sh64/atomic.h
include/asm-sparc/atomic.h
include/asm-sparc64/atomic.h
include/asm-v850/atomic.h
include/asm-v850/hardirq.h
include/asm-x86_64/apic.h
include/asm-x86_64/atomic.h
include/asm-x86_64/cache.h
include/asm-x86_64/desc.h
include/asm-x86_64/dma.h
include/asm-x86_64/hpet.h
include/asm-x86_64/hw_irq.h
include/asm-x86_64/ia32.h
include/asm-x86_64/mce.h
include/asm-x86_64/mmzone.h
include/asm-x86_64/mpspec.h
include/asm-x86_64/msi.h
include/asm-x86_64/msr.h
include/asm-x86_64/numa.h
include/asm-x86_64/page.h
include/asm-x86_64/pda.h
include/asm-x86_64/pgtable.h
include/asm-x86_64/processor.h
include/asm-x86_64/proto.h
include/asm-x86_64/rwsem.h [deleted file]
include/asm-x86_64/smp.h
include/asm-x86_64/spinlock.h
include/asm-x86_64/topology.h
include/asm-x86_64/unistd.h
include/asm-xtensa/atomic.h
include/linux/acct.h
include/linux/aio.h
include/linux/bitops.h
include/linux/blkdev.h
include/linux/cciss_ioctl.h
include/linux/cm4000_cs.h [new file with mode: 0644]
include/linux/compat_ioctl.h
include/linux/connector.h
include/linux/ds17287rtc.h [new file with mode: 0644]
include/linux/ds1742rtc.h [new file with mode: 0644]
include/linux/file.h
include/linux/font.h
include/linux/fsl_devices.h
include/linux/genhd.h
include/linux/gfp.h
include/linux/hardirq.h
include/linux/hugetlb.h
include/linux/i2c-id.h
include/linux/ide.h
include/linux/idr.h
include/linux/if_ether.h
include/linux/init_task.h
include/linux/interrupt.h
include/linux/libata.h
include/linux/mm.h
include/linux/mmzone.h
include/linux/netdevice.h
include/linux/netfilter/nfnetlink.h
include/linux/pagemap.h
include/linux/pci-acpi.h
include/linux/pci.h
include/linux/pci_ids.h
include/linux/percpu.h
include/linux/platform_device.h
include/linux/pm.h
include/linux/pm_legacy.h [new file with mode: 0644]
include/linux/preempt.h
include/linux/raid_class.h
include/linux/sched.h
include/linux/skbuff.h
include/linux/smp_lock.h
include/linux/sysctl.h
include/linux/tcp.h
include/linux/thread_info.h
include/linux/time.h
include/linux/usb.h
include/linux/videodev2.h
include/media/ir-common.h
include/media/ir-kbd-i2c.h
include/media/tuner.h
include/media/v4l2-common.h [new file with mode: 0644]
include/net/ieee80211.h
include/net/llc_pdu.h
include/net/sctp/command.h
include/net/sctp/structs.h
include/net/sock.h
include/net/tcp.h
include/scsi/scsi_host.h
include/scsi/scsi_request.h
kernel/cpuset.c
kernel/exit.c
kernel/fork.c
kernel/posix-timers.c
kernel/power/Kconfig
kernel/power/Makefile
kernel/power/pm.c
kernel/printk.c
kernel/ptrace.c
kernel/rcutorture.c
kernel/sched.c
kernel/signal.c
kernel/stop_machine.c
mm/filemap.c
mm/memory.c
mm/mmap.c
mm/page-writeback.c
mm/page_alloc.c
mm/slab.c
mm/vmscan.c
net/Makefile
net/core/datagram.c
net/core/dev.c
net/core/netpoll.c
net/decnet/af_decnet.c
net/ipv4/icmp.c
net/ipv4/igmp.c
net/ipv4/ip_fragment.c
net/ipv4/ip_gre.c
net/ipv4/netfilter/ip_conntrack_ftp.c
net/ipv4/netfilter/ip_conntrack_irc.c
net/ipv4/netfilter/ip_conntrack_netlink.c
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/netfilter/ip_conntrack_tftp.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_bic.c
net/ipv4/tcp_cong.c
net/ipv4/tcp_highspeed.c
net/ipv4/tcp_htcp.c
net/ipv4/tcp_hybla.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_scalable.c
net/ipv4/tcp_timer.c
net/ipv4/tcp_vegas.c
net/ipv4/udp.c
net/ipv6/addrconf.c
net/ipv6/af_inet6.c
net/ipv6/icmp.c
net/ipv6/ipv6_sockglue.c
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/raw.c
net/ipv6/reassembly.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/llc/af_llc.c
net/llc/llc_c_ac.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c
net/rxrpc/transport.c
net/sched/Kconfig
net/sctp/associola.c
net/sctp/endpointola.c
net/sctp/input.c
net/sctp/protocol.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/socket.c
net/sctp/sysctl.c
net/sctp/ulpevent.c
net/sunrpc/socklib.c
net/sunrpc/svcsock.c
scripts/kernel-doc
sound/arm/pxa2xx-ac97.c
sound/core/init.c
sound/core/sound.c
sound/oss/ad1848.c
sound/oss/cs4281/cs4281m.c
sound/oss/maestro.c
sound/oss/nm256_audio.c
sound/oss/opl3sa2.c
sound/pci/ad1889.c
sound/pci/ali5451/ali5451.c
sound/pci/als4000.c
sound/pci/atiixp.c
sound/pci/atiixp_modem.c
sound/pci/au88x0/au88x0.c
sound/pci/azt3328.c
sound/pci/bt87x.c
sound/pci/ca0106/ca0106_main.c
sound/pci/cmipci.c
sound/pci/cs4281.c
sound/pci/cs46xx/cs46xx.c
sound/pci/emu10k1/emu10k1.c
sound/pci/emu10k1/emu10k1x.c
sound/pci/ens1370.c
sound/pci/es1938.c
sound/pci/es1968.c
sound/pci/fm801.c
sound/pci/hda/hda_intel.c
sound/pci/ice1712/ice1712.c
sound/pci/ice1712/ice1724.c
sound/pci/intel8x0.c
sound/pci/intel8x0m.c
sound/pci/korg1212/korg1212.c
sound/pci/maestro3.c
sound/pci/mixart/mixart.c
sound/pci/nm256/nm256.c
sound/pci/rme32.c
sound/pci/rme96.c
sound/pci/rme9652/hdsp.c
sound/pci/rme9652/hdspm.c
sound/pci/rme9652/rme9652.c
sound/pci/sonicvibes.c
sound/pci/trident/trident.c
sound/pci/via82xx.c
sound/pci/via82xx_modem.c
sound/pci/vx222/vx222.c
sound/pci/ymfpci/ymfpci.c
sound/ppc/tumbler.c

diff --git a/CREDITS b/CREDITS
index 7fb4c73e02288494856ae67eb9a37e461035f2b5..1b4f8694fa48ff0832b1f87b3a99c5233c313fda 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -611,8 +611,7 @@ S: USA
 N: Randolph Chung
 E: tausq@debian.org
 D: Linux/PA-RISC hacker
-S: Los Altos, CA 94022
-S: USA
+S: Hong Kong
 
 N: Juan Jose Ciarlante
 W: http://juanjox.kernelnotes.org/
@@ -1097,7 +1096,7 @@ S: 80050-430 - Curitiba - Paran
 S: Brazil
 
 N: Kumar Gala
-E: kumar.gala@freescale.com
+E: galak@kernel.crashing.org
 D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support
 S: Austin, Texas 78729
 S: USA
@@ -3405,6 +3404,15 @@ S: Chudenicka 8
 S: 10200 Prague 10, Hostivar
 S: Czech Republic
 
+N: Thibaut Varene
+E: T-Bone@parisc-linux.org
+W: http://www.parisc-linux.org/
+P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C  FA2F 1E32 C3DA B7D2 F063
+D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits
+D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there
+D: AD1889 sound driver
+S: Paris, France
+
 N: Heikki Vatiainen
 E: hessu@cs.tut.fi
 D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks
index 433cf5e9ae04bd17a04d50c320db9f100c68da63..5f7f7d7f77d25ebbfdd2f31359257991d92dc69a 100644 (file)
@@ -24,6 +24,8 @@ DMA-mapping.txt
        - info for PCI drivers using DMA portably across all platforms.
 DocBook/
        - directory with DocBook templates etc. for kernel documentation.
+HOWTO
+       - The process and procedures of how to do Linux kernel development.
 IO-mapping.txt
        - how to access I/O mapped memory from within device drivers.
 IPMI.txt
@@ -256,6 +258,10 @@ specialix.txt
        - info on hardware/driver for specialix IO8+ multiport serial card.
 spinlocks.txt
        - info on using spinlocks to provide exclusive access in kernel.
+stable_api_nonsense.txt
+       - info on why the kernel does not have a stable in-kernel api or abi.
+stable_kernel_rules.txt
+       - rules and procedures for the -stable kernel releases.
 stallion.txt
        - info on using the Stallion multiport serial driver.
 svga.txt
index 7018f5c6a447b392a8ccd316d49380ce5307e936..1c955883cf58864015c7dd93243e819dd0b18429 100644 (file)
@@ -20,6 +20,12 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
 #                        +--> DIR=file  (htmldocs)
 #                        +--> man/      (mandocs)
 
+
+# for PDF and PS output you can choose between xmlto and docbook-utils tools
+PDF_METHOD     = $(prefer-db2x)
+PS_METHOD      = $(prefer-db2x)
+
+
 ###
 # The targets that may be used.
 .PHONY:        xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs
@@ -93,27 +99,39 @@ C-procfs-example = procfs_example.xml
 C-procfs-example2 = $(addprefix $(obj)/,$(C-procfs-example))
 $(obj)/procfs-guide.xml: $(C-procfs-example2)
 
-###
-# Rules to generate postscript, PDF and HTML
-# db2html creates a directory. Generate a html file used for timestamp
+notfoundtemplate = echo "*** You have to install docbook-utils or xmlto ***"; \
+                  exit 1
+db2xtemplate = db2TYPE -o $(dir $@) $<
+xmltotemplate = xmlto TYPE $(XMLTOFLAGS) -o $(dir $@) $<
+
+# determine which methods are available
+ifeq ($(shell which db2ps >/dev/null 2>&1 && echo found),found)
+       use-db2x = db2x
+       prefer-db2x = db2x
+else
+       use-db2x = notfound
+       prefer-db2x = $(use-xmlto)
+endif
+ifeq ($(shell which xmlto >/dev/null 2>&1 && echo found),found)
+       use-xmlto = xmlto
+       prefer-xmlto = xmlto
+else
+       use-xmlto = notfound
+       prefer-xmlto = $(use-db2x)
+endif
 
-quiet_cmd_db2ps = XMLTO    $@
-      cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
+# the commands, generated from the chosen template
+quiet_cmd_db2ps = PS      $@
+      cmd_db2ps = $(subst TYPE,ps, $($(PS_METHOD)template))
 %.ps : %.xml
-       @(which xmlto > /dev/null 2>&1) || \
-        (echo "*** You need to install xmlto ***"; \
-         exit 1)
        $(call cmd,db2ps)
 
-quiet_cmd_db2pdf = XMLTO   $@
-      cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
+quiet_cmd_db2pdf = PDF      $@
+      cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
 %.pdf : %.xml
-       @(which xmlto > /dev/null 2>&1) || \
-        (echo "*** You need to install xmlto ***"; \
-         exit 1)
        $(call cmd,db2pdf)
 
-quiet_cmd_db2html = XMLTO  $@
+quiet_cmd_db2html = HTML   $@
       cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
                echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
          Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
@@ -127,7 +145,7 @@ quiet_cmd_db2html = XMLTO  $@
        @if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
             cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
 
-quiet_cmd_db2man = XMLTO   $@
+quiet_cmd_db2man = MAN     $@
       cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
 %.9 : %.xml
        @(which xmlto > /dev/null 2>&1) || \
index a8316b1a3e3d45e3368a1a4b3dddb732bab65b32..096aed62c326821cb7c6ab586167344ef3401ac0 100644 (file)
@@ -68,9 +68,7 @@ X!Iinclude/linux/kobject.h
 
      <sect1><title>Kernel utility functions</title>
 !Iinclude/linux/kernel.h
-<!-- This needs to clean up to make kernel-doc happy
-X!Ekernel/printk.c
- -->
+!Ekernel/printk.c
 !Ekernel/panic.c
 !Ekernel/sys.c
 !Ekernel/rcupdate.c
@@ -388,7 +386,7 @@ X!Edrivers/pnp/system.c
 
   <chapter id="blkdev">
      <title>Block Devices</title>
-!Edrivers/block/ll_rw_blk.c
+!Eblock/ll_rw_blk.c
   </chapter>
 
   <chapter id="miscdev">
index 64be9f7ee3bba74a415d10c0f9508c7c4105e176..3ccce886c349d4ab3d5e357213d651b82d204eb4 100644 (file)
@@ -3,4 +3,5 @@
 <param name="chunk.quietly">1</param>
 <param name="funcsynopsis.style">ansi</param>
 <param name="funcsynopsis.tabular.threshold">80</param>
+<!-- <param name="paper.type">A4</param> -->
 </stylesheet>
diff --git a/Documentation/HOWTO b/Documentation/HOWTO
new file mode 100644 (file)
index 0000000..6c9e746
--- /dev/null
@@ -0,0 +1,618 @@
+HOWTO do Linux kernel development
+---------------------------------
+
+This is the be-all, end-all document on this topic.  It contains
+instructions on how to become a Linux kernel developer and how to learn
+to work with the Linux kernel development community.  It tries to not
+contain anything related to the technical aspects of kernel programming,
+but will help point you in the right direction for that.
+
+If anything in this document becomes out of date, please send in patches
+to the maintainer of this file, who is listed at the bottom of the
+document.
+
+
+Introduction
+------------
+
+So, you want to learn how to become a Linux kernel developer?  Or you
+have been told by your manager, "Go write a Linux driver for this
+device."  This document's goal is to teach you everything you need to
+know to achieve this by describing the process you need to go through,
+and hints on how to work with the community.  It will also try to
+explain some of the reasons why the community works like it does.
+
+The kernel is written mostly in C, with some architecture-dependent
+parts written in assembly. A good understanding of C is required for
+kernel development.  Assembly (any architecture) is not required unless
+you plan to do low-level development for that architecture.  Though they
+are not a good substitute for a solid C education and/or years of
+experience, the following books are good for, if anything, reference:
+ - "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
+ - "Practical C Programming" by Steve Oualline [O'Reilly]
+
+The kernel is written using GNU C and the GNU toolchain.  While it
+adheres to the ISO C89 standard, it uses a number of extensions that are
+not featured in the standard.  The kernel is a freestanding C
+environment, with no reliance on the standard C library, so some
+portions of the C standard are not supported.  Arbitrary long long
+divisions and floating point are not allowed.  It can sometimes be
+difficult to understand the assumptions the kernel has on the toolchain
+and the extensions that it uses, and unfortunately there is no
+definitive reference for them.  Please check the gcc info pages (`info
+gcc`) for some information on them.
+
+Please remember that you are trying to learn how to work with the
+existing development community.  It is a diverse group of people, with
+high standards for coding, style and procedure.  These standards have
+been created over time based on what they have found to work best for
+such a large and geographically dispersed team.  Try to learn as much as
+possible about these standards ahead of time, as they are well
+documented; do not expect people to adapt to you or your company's way
+of doing things.
+
+
+Legal Issues
+------------
+
+The Linux kernel source code is released under the GPL.  Please see the
+file, COPYING, in the main directory of the source tree, for details on
+the license.  If you have further questions about the license, please
+contact a lawyer, and do not ask on the Linux kernel mailing list.  The
+people on the mailing lists are not lawyers, and you should not rely on
+their statements on legal matters.
+
+For common questions and answers about the GPL, please see:
+       http://www.gnu.org/licenses/gpl-faq.html
+
+
+Documentation
+------------
+
+The Linux kernel source tree has a large range of documents that are
+invaluable for learning how to interact with the kernel community.  When
+new features are added to the kernel, it is recommended that new
+documentation files are also added which explain how to use the feature.
+When a kernel change causes the interface that the kernel exposes to
+userspace to change, it is recommended that you send the information or
+a patch to the manual pages explaining the change to the manual pages
+maintainer at mtk-manpages@gmx.net.
+
+Here is a list of files that are in the kernel source tree that are
+required reading:
+  README
+    This file gives a short background on the Linux kernel and describes
+    what is necessary to do to configure and build the kernel.  People
+    who are new to the kernel should start here.
+
+  Documentation/Changes
+    This file gives a list of the minimum levels of various software
+    packages that are necessary to build and run the kernel
+    successfully.
+
+  Documentation/CodingStyle
+    This describes the Linux kernel coding style, and some of the
+    rationale behind it. All new code is expected to follow the
+    guidelines in this document. Most maintainers will only accept
+    patches if these rules are followed, and many people will only
+    review code if it is in the proper style.
+
+  Documentation/SubmittingPatches
+  Documentation/SubmittingDrivers
+    These files describe in explicit detail how to successfully create
+    and send a patch, including (but not limited to):
+       - Email contents
+       - Email format
+       - Who to send it to
+    Following these rules will not guarantee success (as all patches are
+    subject to scrutiny for content and style), but not following them
+    will almost always prevent it.
+
+    Other excellent descriptions of how to create patches properly are:
+       "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
+    This file describes the rationale behind the conscious decision to
+    not have a stable API within the kernel, including things like:
+      - Subsystem shim-layers (for compatibility?)
+      - Driver portability between Operating Systems.
+      - Mitigating rapid change within the kernel source tree (or
+       preventing rapid change)
+    This document is crucial for understanding the Linux development
+    philosophy and is very important for people moving to Linux from
+    development on other Operating Systems.
+
+  Documentation/SecurityBugs
+    If you feel you have found a security problem in the Linux kernel,
+    please follow the steps in this document to help notify the kernel
+    developers, and help solve the issue.
+
+  Documentation/ManagementStyle
+    This document describes how Linux kernel maintainers operate and the
+    shared ethos behind their methodologies.  This is important reading
+    for anyone new to kernel development (or anyone simply curious about
+    it), as it resolves a lot of common misconceptions and confusion
+    about the unique behavior of kernel maintainers.
+
+  Documentation/stable_kernel_rules.txt
+    This file describes the rules on how the stable kernel releases
+    happen, and what to do if you want to get a change into one of these
+    releases.
+
+  Documentation/kernel-docs.txt
+    A list of external documentation that pertains to kernel
+    development.  Please consult this list if you do not find what you
+    are looking for within the in-kernel documentation.
+
+  Documentation/applying-patches.txt
+    A good introduction describing exactly what a patch is and how to
+    apply it to the different development branches of the kernel.
+
+The kernel also has a large number of documents that can be
+automatically generated from the source code itself.  This includes a
+full description of the in-kernel API, and rules on how to handle
+locking properly.  The documents will be created in the
+Documentation/DocBook/ directory and can be generated as PDF,
+Postscript, HTML, and man pages by running:
+       make pdfdocs
+       make psdocs
+       make htmldocs
+       make mandocs
+respectively from the main kernel source directory.
+
+
+Becoming A Kernel Developer
+---------------------------
+
+If you do not know anything about Linux kernel development, you should
+look at the Linux KernelNewbies project:
+       http://kernelnewbies.org
+It consists of a helpful mailing list where you can ask almost any type
+of basic kernel development question (make sure to search the archives
+first, before asking something that has already been answered in the
+past.)  It also has an IRC channel that you can use to ask questions in
+real-time, and a lot of helpful documentation that is useful for
+learning about Linux kernel development.
+
+The website has basic information about code organization, subsystems,
+and current projects (both in-tree and out-of-tree). It also describes
+some basic logistical information, like how to compile a kernel and
+apply a patch.
+
+If you do not know where you want to start, but you want to look for
+some task to start doing to join into the kernel development community,
+go to the Linux Kernel Janitor's project:
+       http://janitor.kernelnewbies.org/
+It is a great place to start.  It describes a list of relatively simple
+problems that need to be cleaned up and fixed within the Linux kernel
+source tree.  Working with the developers in charge of this project, you
+will learn the basics of getting your patch into the Linux kernel tree,
+and possibly be pointed in the direction of what to go work on next, if
+you do not already have an idea.
+
+If you already have a chunk of code that you want to put into the kernel
+tree, but need some help getting it in the proper form, the
+kernel-mentors project was created to help you out with this.  It is a
+mailing list, and can be found at:
+       http://selenic.com/mailman/listinfo/kernel-mentors
+
+Before making any actual modifications to the Linux kernel code, it is
+imperative to understand how the code in question works.  For this
+purpose, nothing is better than reading through it directly (most tricky
+bits are commented well), perhaps even with the help of specialized
+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/
+
+
+The development process
+-----------------------
+
+Linux kernel development process currently consists of a few different
+main kernel "branches" and lots of different subsystem-specific kernel
+branches.  These different branches are:
+  - main 2.6.x kernel tree
+  - 2.6.x.y -stable kernel tree
+  - 2.6.x -git kernel patches
+  - 2.6.x -mm kernel patches
+  - subsystem specific kernel trees and patches
+
+2.6.x kernel tree
+-----------------
+2.6.x kernels are maintained by Linus Torvalds, and can be found on
+kernel.org in the pub/linux/kernel/v2.6/ directory.  Its development
+process is as follows:
+  - As soon as a new kernel is released a two weeks window is open,
+    during this period of time maintainers can submit big diffs to
+    Linus, usually the patches that have already been included in the
+    -mm kernel for a few weeks.  The preferred way to submit big changes
+    is using git (the kernel's source management tool, more information
+    can be found at http://git.or.cz/) but plain patches are also just
+    fine.
+  - After two weeks a -rc1 kernel is released it is now possible to push
+    only patches that do not include new features that could affect the
+    stability of the whole kernel.  Please note that a whole new driver
+    (or filesystem) might be accepted after -rc1 because there is no
+    risk of causing regressions with such a change as long as the change
+    is self-contained and does not affect areas outside of the code that
+    is being added.  git can be used to send patches to Linus after -rc1
+    is released, but the patches need to also be sent to a public
+    mailing list for review.
+  - A new -rc is released whenever Linus deems the current git tree to
+    be in a reasonably sane state adequate for testing.  The goal is to
+    release a new -rc kernel every week.
+  - Process continues until the kernel is considered "ready", the
+    process should last around 6 weeks.
+
+It is worth mentioning what Andrew Morton wrote on the linux-kernel
+mailing list about kernel releases:
+       "Nobody knows when a kernel will be released, because it's
+       released according to perceived bug status, not according to a
+       preconceived timeline."
+
+2.6.x.y -stable kernel tree
+---------------------------
+Kernels with 4 digit versions are -stable kernels. They contain
+relatively small and critical fixes for security problems or significant
+regressions discovered in a given 2.6.x kernel.
+
+This is the recommended branch for users who want the most recent stable
+kernel and are not interested in helping test development/experimental
+versions.
+
+If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
+kernel is the current stable kernel.
+
+2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
+released almost every other week.
+
+The file Documentation/stable_kernel_rules.txt in the kernel tree
+documents what kinds of changes are acceptable for the -stable tree, and
+how the release process works.
+
+2.6.x -git patches
+------------------
+These are daily snapshots of Linus' kernel tree which are managed in a
+git repository (hence the name.) These patches are usually released
+daily and represent the current state of Linus' tree.  They are more
+experimental than -rc kernels since they are generated automatically
+without even a cursory glance to see if they are sane.
+
+2.6.x -mm kernel patches
+------------------------
+These are experimental kernel patches released by Andrew Morton.  Andrew
+takes all of the different subsystem kernel trees and patches and mushes
+them together, along with a lot of patches that have been plucked from
+the linux-kernel mailing list.  This tree serves as a proving ground for
+new features and patches.  Once a patch has proved its worth in -mm for
+a while Andrew or the subsystem maintainer pushes it on to Linus for
+inclusion in mainline.
+
+It is heavily encouraged that all new patches get tested in the -mm tree
+before they are sent to Linus for inclusion in the main kernel tree.
+
+These kernels are not appropriate for use on systems that are supposed
+to be stable and they are more risky to run than any of the other
+branches.
+
+If you wish to help out with the kernel development process, please test
+and use these kernel releases and provide feedback to the linux-kernel
+mailing list if you have any problems, and if everything works properly.
+
+In addition to all the other experimental patches, these kernels usually
+also contain any changes in the mainline -git kernels available at the
+time of release.
+
+The -mm kernels are not released on a fixed schedule, but usually a few
+-mm kernels are released in between each -rc kernel (1 to 3 is common).
+
+Subsystem Specific kernel trees and patches
+-------------------------------------------
+A number of the different kernel subsystem developers expose their
+development trees so that others can see what is happening in the
+different areas of the kernel.  These trees are pulled into the -mm
+kernel releases as described above.
+
+Here is a list of some of the different kernel trees available:
+  git trees:
+    - Kbuild development tree, Sam Ravnborg <sam@ravnborg.org>
+       kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
+
+    - ACPI development tree, Len Brown <len.brown@intel.com>
+       kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
+
+    - Block development tree, Jens Axboe <axboe@suse.de>
+       kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
+
+    - DRM development tree, Dave Airlie <airlied@linux.ie>
+       kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
+
+    - ia64 development tree, Tony Luck <tony.luck@intel.com>
+       kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
+
+    - ieee1394 development tree, Jody McIntyre <scjody@modernduck.com>
+       kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
+
+    - infiniband, Roland Dreier <rolandd@cisco.com>
+       kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
+
+    - libata, Jeff Garzik <jgarzik@pobox.com>
+       kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
+
+    - network drivers, Jeff Garzik <jgarzik@pobox.com>
+       kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
+
+    - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
+       kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
+
+    - SCSI, James Bottomley <James.Bottomley@SteelEye.com>
+       kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
+
+  Other git kernel trees can be found listed at http://kernel.org/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/
+
+
+Bug Reporting
+-------------
+
+bugzilla.kernel.org is where the Linux kernel developers track kernel
+bugs.  Users are encouraged to report all bugs that they find in this
+tool.  For details on how to use the kernel bugzilla, please see:
+       http://test.kernel.org/bugzilla/faq.html
+
+The file REPORTING-BUGS in the main kernel source directory has a good
+template for how to report a possible kernel bug, and details what kind
+of information is needed by the kernel developers to help track down the
+problem.
+
+
+Mailing lists
+-------------
+
+As some of the above documents describe, the majority of the core kernel
+developers participate on the Linux Kernel Mailing list.  Details on how
+to subscribe and unsubscribe from the list can be found at:
+       http://vger.kernel.org/vger-lists.html#linux-kernel
+There are archives of the mailing list on the web in many different
+places.  Use a search engine to find these archives.  For example:
+       http://dir.gmane.org/gmane.linux.kernel
+It is highly recommended that you search the archives about the topic
+you want to bring up, before you post it to the list. A lot of things
+already discussed in detail are only recorded at the mailing list
+archives.
+
+Most of the individual kernel subsystems also have their own separate
+mailing list where they do their development efforts.  See the
+MAINTAINERS file for a list of what these lists are for the different
+groups.
+
+Many of the lists are hosted on kernel.org. Information on them can be
+found at:
+       http://vger.kernel.org/vger-lists.html
+
+Please remember to follow good behavioral habits when using the lists.
+Though a bit cheesy, the following URL has some simple guidelines for
+interacting with the list (or any list):
+       http://www.albion.com/netiquette/
+
+If multiple people respond to your mail, the CC: list of recipients may
+get pretty large. Don't remove anybody from the CC: list without a good
+reason, or don't reply only to the list address. Get used to receiving the
+mail twice, one from the sender and the one from the list, and don't try
+to tune that by adding fancy mail-headers, people will not like it.
+
+Remember to keep the context and the attribution of your replies intact,
+keep the "John Kernelhacker wrote ...:" lines at the top of your reply, and
+add your statements between the individual quoted sections instead of
+writing at the top of the mail.
+
+If you add patches to your mail, make sure they are plain readable text
+as stated in Documentation/SubmittingPatches. Kernel developers don't
+want to deal with attachments or compressed patches; they may want
+to comment on individual lines of your patch, which works only that way.
+Make sure you use a mail program that does not mangle spaces and tab
+characters. A good first test is to send the mail to yourself and try
+to apply your own patch by yourself. If that doesn't work, get your
+mail program fixed or change it until it works.
+
+Above all, please remember to show respect to other subscribers.
+
+
+Working with the community
+--------------------------
+
+The goal of the kernel community is to provide the best possible kernel
+there is.  When you submit a patch for acceptance, it will be reviewed
+on its technical merits and those alone.  So, what should you be
+expecting?
+  - criticism
+  - comments
+  - requests for change
+  - requests for justification
+  - silence
+
+Remember, this is part of getting your patch into the kernel.  You have
+to be able to take criticism and comments about your patches, evaluate
+them at a technical level and either rework your patches or provide
+clear and concise reasoning as to why those changes should not be made.
+If there are no responses to your posting, wait a few days and try
+again, sometimes things get lost in the huge volume.
+
+What should you not do?
+  - expect your patch to be accepted without question
+  - become defensive
+  - ignore comments
+  - resubmit the patch without making any of the requested changes
+
+In a community that is looking for the best technical solution possible,
+there will always be differing opinions on how beneficial a patch is.
+You have to be cooperative, and willing to adapt your idea to fit within
+the kernel.  Or at least be willing to prove your idea is worth it.
+Remember, being wrong is acceptable as long as you are willing to work
+toward a solution that is right.
+
+It is normal that the answers to your first patch might simply be a list
+of a dozen things you should correct.  This does _not_ imply that your
+patch will not be accepted, and it is _not_ meant against you
+personally.  Simply correct all issues raised against your patch and
+resend it.
+
+
+Differences between the kernel community and corporate structures
+-----------------------------------------------------------------
+
+The kernel community works differently than most traditional corporate
+development environments.  Here are a list of things that you can try to
+do to try to avoid problems:
+  Good things to say regarding your proposed changes:
+    - "This solves multiple problems."
+    - "This deletes 2000 lines of code."
+    - "Here is a patch that explains what I am trying to describe."
+    - "I tested it on 5 different architectures..."
+    - "Here is a series of small patches that..."
+    - "This increases performance on typical machines..."
+
+  Bad things you should avoid saying:
+    - "We did it this way in AIX/ptx/Solaris, so therefore it must be
+      good..."
+    - "I've being doing this for 20 years, so..."
+    - "This is required for my company to make money"
+    - "This is for our Enterprise product line."
+    - "Here is my 1000 page design document that describes my idea"
+    - "I've been working on this for 6 months..."
+    - "Here's a 5000 line patch that..."
+    - "I rewrote all of the current mess, and here it is..."
+    - "I have a deadline, and this patch needs to be applied now."
+
+Another way the kernel community is different than most traditional
+software engineering work environments is the faceless nature of
+interaction.  One benefit of using email and irc as the primary forms of
+communication is the lack of discrimination based on gender or race.
+The Linux kernel work environment is accepting of women and minorities
+because all you are is an email address.  The international aspect also
+helps to level the playing field because you can't guess gender based on
+a person's name. A man may be named Andrea and a woman may be named Pat.
+Most women who have worked in the Linux kernel and have expressed an
+opinion have had positive experiences.
+
+The language barrier can cause problems for some people who are not
+comfortable with English.  A good grasp of the language can be needed in
+order to get ideas across properly on mailing lists, so it is
+recommended that you check your emails to make sure they make sense in
+English before sending them.
+
+
+Break up your changes
+---------------------
+
+The Linux kernel community does not gladly accept large chunks of code
+dropped on it all at once.  The changes need to be properly introduced,
+discussed, and broken up into tiny, individual portions.  This is almost
+the exact opposite of what companies are used to doing.  Your proposal
+should also be introduced very early in the development process, so that
+you can receive feedback on what you are doing.  It also lets the
+community feel that you are working with them, and not simply using them
+as a dumping ground for your feature.  However, don't send 50 emails at
+one time to a mailing list, your patch series should be smaller than
+that almost all of the time.
+
+The reasons for breaking things up are the following:
+
+1) Small patches increase the likelihood that your patches will be
+   applied, since they don't take much time or effort to verify for
+   correctness.  A 5 line patch can be applied by a maintainer with
+   barely a second glance. However, a 500 line patch may take hours to
+   review for correctness (the time it takes is exponentially
+   proportional to the size of the patch, or something).
+
+   Small patches also make it very easy to debug when something goes
+   wrong.  It's much easier to back out patches one by one than it is
+   to dissect a very large patch after it's been applied (and broken
+   something).
+
+2) It's important not only to send small patches, but also to rewrite
+   and simplify (or simply re-order) patches before submitting them.
+
+Here is an analogy from kernel developer Al Viro:
+       "Think of a teacher grading homework from a math student.  The
+       teacher does not want to see the student's trials and errors
+       before they came up with the solution. They want to see the
+       cleanest, most elegant answer.  A good student knows this, and
+       would never submit her intermediate work before the final
+       solution."
+
+       The same is true of kernel development. The maintainers and
+       reviewers do not want to see the thought process behind the
+       solution to the problem one is solving. They want to see a
+       simple and elegant solution."
+
+It may be challenging to keep the balance between presenting an elegant
+solution and working together with the community and discussing your
+unfinished work. Therefore it is good to get early in the process to
+get feedback to improve your work, but also keep your changes in small
+chunks that they may get already accepted, even when your whole task is
+not ready for inclusion now.
+
+Also realize that it is not acceptable to send patches for inclusion
+that are unfinished and will be "fixed up later."
+
+
+Justify your change
+-------------------
+
+Along with breaking up your patches, it is very important for you to let
+the Linux community know why they should add this change.  New features
+must be justified as being needed and useful.
+
+
+Document your change
+--------------------
+
+When sending in your patches, pay special attention to what you say in
+the text in your email.  This information will become the ChangeLog
+information for the patch, and will be preserved for everyone to see for
+all time.  It should describe the patch completely, containing:
+  - why the change is necessary
+  - the overall design approach in the patch
+  - implementation details
+  - testing results
+
+For more details on what this should all look like, please see the
+ChangeLog section of the document:
+  "The Perfect Patch"
+      http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
+
+
+
+
+All of these things are sometimes very hard to do. It can take years to
+perfect these practices (if at all). It's a continuous process of
+improvement that requires a lot of patience and determination. But
+don't give up, it's possible. Many have done it before, and each had to
+start exactly where you are now.
+
+
+
+
+----------
+Thanks to Paolo Ciarrocchi who allowed the "Development Process" section
+to be based on text he had written, and to Randy Dunlap and Gerrit
+Huizenga for some of the list of things you should and should not say.
+Also thanks to 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 for
+their review, comments, and contributions.  Without their help, this
+document would not have been possible.
+
+
+
+Maintainer: Greg Kroah-Hartman <greg@kroah.com>
index 8eedaa24f5e284f09dcfce6b2164bc53cfaed579..23a1c2402bccf3ec6d8bbf97bba3becfcf149272 100644 (file)
@@ -115,6 +115,33 @@ boolean is return which indicates whether the resulting counter value
 is negative.  It requires explicit memory barrier semantics around the
 operation.
 
+Then:
+
+       int atomic_cmpxchg(atomic_t *v, int old, int new);
+
+This performs an atomic compare exchange operation on the atomic value v,
+with the given old and new values. Like all atomic_xxx operations,
+atomic_cmpxchg will only satisfy its atomicity semantics as long as all
+other accesses of *v are performed through atomic_xxx operations.
+
+atomic_cmpxchg requires explicit memory barriers around the operation.
+
+The semantics for atomic_cmpxchg are the same as those defined for 'cas'
+below.
+
+Finally:
+
+       int atomic_add_unless(atomic_t *v, int a, int u);
+
+If the atomic value v is not equal to u, this function adds a to v, and
+returns non zero. If v is equal to u then it returns zero. This is done as
+an atomic operation.
+
+atomic_add_unless requires explicit memory barriers around the operation.
+
+atomic_inc_not_zero, equivalent to atomic_add_unless(v, 1, 0)
+
+
 If a caller requires memory barrier semantics around an atomic_t
 operation which does not return a value, a set of interfaces are
 defined which accomplish this:
index 2d65c2182161723d97ce3b2d3f81f157fed1af69..0fe01c805480563f8544fe157ccd8064cfe2f07a 100644 (file)
@@ -1063,8 +1063,8 @@ Aside:
 4.4 I/O contexts
 I/O contexts provide a dynamically allocated per process data area. They may
 be used in I/O schedulers, and in the block layer (could be used for IO statis,
-priorities for example). See *io_context in drivers/block/ll_rw_blk.c, and
-as-iosched.c for an example of usage in an i/o scheduler.
+priorities for example). See *io_context in block/ll_rw_blk.c, and as-iosched.c
+for an example of usage in an i/o scheduler.
 
 
 5. Scalability related changes
index 68a711fb82cf8d9d612363ff04bb71719ef6729f..15378422fc46562132b5748c63308c1ecd78b94e 100644 (file)
@@ -133,3 +133,32 @@ hardware and it is important to prevent the kernel from attempting to directly
 access these devices too, as if the array controller were merely a SCSI 
 controller in the same way that we are allowing it to access SCSI tape drives.
 
+SCSI error handling for tape drives and medium changers
+-------------------------------------------------------
+
+The linux SCSI mid layer provides an error handling protocol which
+kicks into gear whenever a SCSI command fails to complete within a
+certain amount of time (which can vary depending on the command).
+The cciss driver participates in this protocol to some extent.  The
+normal protocol is a four step process.  First the device is told
+to abort the command.  If that doesn't work, the device is reset.
+If that doesn't work, the SCSI bus is reset.  If that doesn't work
+the host bus adapter is reset.  Because the cciss driver is a block
+driver as well as a SCSI driver and only the tape drives and medium
+changers are presented to the SCSI mid layer, and unlike more 
+straightforward SCSI drivers, disk i/o continues through the block
+side during the SCSI error recovery process, the cciss driver only
+implements the first two of these actions, aborting the command, and
+resetting the device.  Additionally, most tape drives will not oblige 
+in aborting commands, and sometimes it appears they will not even 
+obey a reset coommand, though in most circumstances they will.  In
+the case that the command cannot be aborted and the device cannot be 
+reset, the device will be set offline.
+
+In the event the error handling code is triggered and a tape drive is
+successfully reset or the tardy command is successfully aborted, the 
+tape drive may still not allow i/o to continue until some command
+is issued which positions the tape to a known position.  Typically you
+must rewind the tape (by issuing "mt -f /dev/st0 rewind" for example)
+before i/o can proceed again to a tape drive which was reset.
+
index 0f515175c72a889959ad5258379a602f31495767..3c406acd4dfae8c65e4f88ab5552416972c98276 100644 (file)
@@ -2903,14 +2903,14 @@ Your cooperation is appreciated.
                196 = /dev/dvb/adapter3/video0    first video decoder of fourth card
 
 
-216 char       USB BlueTooth devices
-                 0 = /dev/ttyUB0               First USB BlueTooth device
-                 1 = /dev/ttyUB1               Second USB BlueTooth device
+216 char       Bluetooth RFCOMM TTY devices
+                 0 = /dev/rfcomm0              First Bluetooth RFCOMM TTY device
+                 1 = /dev/rfcomm1              Second Bluetooth RFCOMM TTY device
                    ...
 
-217 char       USB BlueTooth devices (alternate devices)
-                 0 = /dev/cuub0                Callout device for ttyUB0
-                 1 = /dev/cuub1                Callout device for ttyUB1
+217 char       Bluetooth RFCOMM TTY devices (alternate devices)
+                 0 = /dev/curf0                Callout device for rfcomm0
+                 1 = /dev/curf1                Callout device for rfcomm1
                    ...
 
 218 char       The Logical Company bus Unibus/Qbus adapters
index 270a88e22fb93172ccdd35a5a7126d2f70a338eb..cddbac456c290d6bc9409e99fdd6d6f82d1338fa 100644 (file)
@@ -28,7 +28,7 @@ the image from specifications.
 CPIO ARCHIVE method
 
 You can create a cpio archive that contains the early userspace image.
-Youre cpio archive should be specified in CONFIG_INITRAMFS_SOURCE and it
+Your cpio archive should be specified in CONFIG_INITRAMFS_SOURCE and it
 will be used directly.  Only a single cpio file may be specified in
 CONFIG_INITRAMFS_SOURCE and directory and file names are not allowed in
 combination with a cpio archive.
index 429db4bf98eccd14ad2f0ebce7480a6f93c2a178..9b743198f77a1c54283c2842f83015d03a88680b 100644 (file)
@@ -140,3 +140,22 @@ What:      EXPORT_SYMBOL(lookup_hash)
 When:  January 2006
 Why:   Too low-level interface.  Use lookup_one_len or lookup_create instead.
 Who:   Christoph Hellwig <hch@lst.de>
+
+---------------------------
+
+What:  START_ARRAY ioctl for md
+When:  July 2006
+Files: drivers/md/md.c
+Why:   Not reliable by design - can fail when most needed.
+       Alternatives exist
+Who:   NeilBrown <neilb@suse.de>
+
+---------------------------
+
+What:  au1x00_uart driver
+When:  January 2006
+Why:   The 8250 serial driver now has the ability to deal with the differences
+       between the standard 8250 family of UARTs and their slightly strange
+       brother on Alchemy SOCs.  The loss of features is not considered an
+       issue.
+Who:   Ralf Baechle <ralf@linux-mips.org>
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt
new file mode 100644 (file)
index 0000000..c45daab
--- /dev/null
@@ -0,0 +1,56 @@
+DCCP protocol
+============
+
+Last updated: 10 November 2005
+
+Contents
+========
+
+- Introduction
+- Missing features
+- Socket options
+- Notes
+
+Introduction
+============
+
+Datagram Congestion Control Protocol (DCCP) is an unreliable, connection
+based protocol designed to solve issues present in UDP and TCP particularly
+for real time and multimedia traffic.
+
+It has a base protocol and pluggable congestion control IDs (CCIDs).
+
+It is at draft RFC status and the homepage for DCCP as a protocol is at:
+       http://www.icir.org/kohler/dcp/
+
+Missing features
+================
+
+The DCCP implementation does not currently have all the features that are in
+the draft RFC.
+
+In particular the following are missing:
+- CCID2 support
+- feature negotiation
+
+When testing against other implementations it appears that elapsed time
+options are not coded compliant to the specification.
+
+Socket options
+==============
+
+DCCP_SOCKOPT_PACKET_SIZE is used for CCID3 to set default packet size for
+calculations.
+
+DCCP_SOCKOPT_SERVICE sets the service. This is compulsory as per the
+specification. If you don't set it you will get EPROTO.
+
+Notes
+=====
+
+SELinux does not yet have support for DCCP. You will need to turn it off or
+else you will get EACCES.
+
+DCCP does not travel through NAT successfully at present. This is because
+the checksum covers the psuedo-header as per TCP and UDP. It should be
+relatively trivial to add Linux NAT support for DCCP.
index 65895bb514146b58d5857d26fd3336c16c65adf3..ebc09a159f6220d995ab39c3bbff812291f4659d 100644 (file)
@@ -78,6 +78,11 @@ inet_peer_gc_maxtime - INTEGER
 
 TCP variables: 
 
+tcp_abc - INTEGER
+       Controls Appropriate Byte Count defined in RFC3465. If set to
+       0 then does congestion avoid once per ack. 1 is conservative
+       value, and 2 is more agressive.
+
 tcp_syn_retries - INTEGER
        Number of times initial SYNs for an active TCP connection attempt
        will be retransmitted. Should not be higher than 255. Default value
index c563842ed8057e1ee960ff0faa75d87c6b797a56..05960f8a748e6169822b1954530150502135cde0 100644 (file)
@@ -30,7 +30,12 @@ the disk is not available then you have three options :-
 
 (1) Hand copy the text from the screen and type it in after the machine
     has restarted.  Messy but it is the only option if you have not
-    planned for a crash.
+    planned for a crash. Alternatively, you can take a picture of
+    the screen with a digital camera - not nice, but better than
+    nothing.  If the messages scroll off the top of the console, you
+    may find that booting with a higher resolution (eg, vga=791)
+    will allow you to read more of the text. (Caveat: This needs vesafb,
+    so won't help for 'early' oopses)
 
 (2) Boot with a serial console (see Documentation/serial-console.txt),
     run a null modem to a second machine and capture the output there
index fef92ebf266ff5f99d697843389bad322fb915f3..e7da8c3a255bfb70c0695086ad02127c30d60127 100644 (file)
@@ -52,8 +52,6 @@ ppa.txt
        - info on driver for IOmega zip drive
 qlogicfas.txt
        - info on driver for QLogic FASxxx based adapters
-qlogicisp.txt
-       - info on driver for QLogic ISP 1020 based adapters
 scsi-generic.txt
        - info on the sg driver for generic (non-disk/CD/tape) SCSI devices.
 scsi.txt
index 398f9916807730aed0ac6241e65f3165bbd713ba..c211d827fef2a2b2d5a5196e14ab4daaf1078906 100644 (file)
@@ -11,8 +11,7 @@ Qlogic boards:
        * IQ-PCI-10
        * IQ-PCI-D
 
-is provided by the qlogicisp.c driver.  Check README.qlogicisp for
-details.
+is provided by the qla1280 driver.
 
 Nor does it support the PCI-Basic, which is supported by the
 'am53c974' driver.
diff --git a/Documentation/scsi/qlogicisp.txt b/Documentation/scsi/qlogicisp.txt
deleted file mode 100644 (file)
index 6920f6c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-Notes for the QLogic ISP1020 PCI SCSI Driver:
-
-This driver works well in practice, but does not support disconnect/
-reconnect, which makes using it with tape drives impractical.
-
-It should work for most host adaptors with the ISP1020 chip.  The
-QLogic Corporation produces several PCI SCSI adapters which should
-work:
-
-       * IQ-PCI
-       * IQ-PCI-10
-       * IQ-PCI-D
-
-This driver may work with boards containing the ISP1020A or ISP1040A
-chips, but that has not been tested.
-
-This driver will NOT work with:
-
-       * ISA or VL Bus Qlogic cards (they use the 'qlogicfas' driver)
-       * PCI-basic (it uses the 'am53c974' driver)
-
-Much thanks to QLogic's tech support for providing the latest ISP1020
-firmware, and for taking the time to review my code.
-
-Erik Moe
-ehm@cris.com
-
-Revised:
-Michael A. Griffith
-grif@cs.ucr.edu
index 534a50922a7b0b4efe3a1e64f559432e7ae040ef..331afd791cbb474f774d10a008493459cce77886 100644 (file)
@@ -83,11 +83,11 @@ with the command.
  The timeout handler is scsi_times_out().  When a timeout occurs, this
 function
 
- 1. invokes optional hostt->eh_timedout() callback.  Return value can
+ 1. invokes optional hostt->eh_timed_out() callback.  Return value can
     be one of
 
     - EH_HANDLED
-       This indicates that eh_timedout() dealt with the timeout.  The
+       This indicates that eh_timed_out() dealt with the timeout.  The
        scmd is passed to __scsi_done() and thus linked into per-cpu
        scsi_done_q.  Normal command completion described in [1-2-1]
        follows.
@@ -105,7 +105,7 @@ function
        command will time out again.
 
     - EH_NOT_HANDLED
-       This is the same as when eh_timedout() callback doesn't exist.
+       This is the same as when eh_timed_out() callback doesn't exist.
        Step #2 is taken.
 
  2. scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD) is invoked for the
@@ -142,7 +142,7 @@ are linked on shost->eh_cmd_q.
  Note that this does not mean lower layers are quiescent.  If a LLDD
 completed a scmd with error status, the LLDD and lower layers are
 assumed to forget about the scmd at that point.  However, if a scmd
-has timed out, unless hostt->eh_timedout() made lower layers forget
+has timed out, unless hostt->eh_timed_out() made lower layers forget
 about the scmd, which currently no LLDD does, the command is still
 active as long as lower layers are concerned and completion could
 occur at any time.  Of course, all such completions are ignored as the
index 44df89c9c04964bda448cc072b53f1623caabb71..66565d42288fc446ad08930b8839a7285dee37e6 100644 (file)
@@ -346,7 +346,7 @@ Next, there is a movement to "outlaw" typedefs introducing synonyms for
 struct tags. Both can be still found in the SCSI subsystem, but
 the typedefs have been moved to a single file, scsi_typedefs.h to
 make their future removal easier, for example: 
-"typedef struct scsi_host_template Scsi_Host_Template;"
+"typedef struct scsi_cmnd Scsi_Cmnd;"
 
 Also, most C99 enhancements are encouraged to the extent they are supported
 by the relevant gcc compilers. So C99 style structure and array
@@ -718,7 +718,7 @@ void scsi_report_bus_reset(struct Scsi_Host * shost, int channel)
  *
  *      Defined in: drivers/scsi/scsi.c .
  **/
-int scsi_track_queue_full(Scsi_Device *sdev, int depth)
+int scsi_track_queue_full(struct scsi_device *sdev, int depth)
 
 
 /**
diff --git a/Documentation/usb/bluetooth.txt b/Documentation/usb/bluetooth.txt
deleted file mode 100644 (file)
index 774f5d3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-INTRODUCTION
-
-  The USB Bluetooth driver supports any USB Bluetooth device.
-  It currently works well with the Linux USB Bluetooth stack from Axis 
-  (available at http://developer.axis.com/software/bluetooth/ ) and 
-  has been rumored to work with other Linux USB Bluetooth stacks.
-
-
-CONFIGURATION
-
-  Currently the driver can handle up to 256 different USB Bluetooth 
-  devices at once. 
-
-  If you are not using devfs:
-    The major number that the driver uses is 216 so to use the driver,
-    create the following nodes:
-       mknod /dev/ttyUB0 c 216 0
-       mknod /dev/ttyUB1 c 216 1
-       mknod /dev/ttyUB2 c 216 2
-       mknod /dev/ttyUB3 c 216 3
-               .
-               .
-               .
-       mknod /dev/ttyUB254 c 216 254
-       mknod /dev/ttyUB255 c 216 255
-
-  If you are using devfs:
-    The devices supported by this driver will show up as
-    /dev/usb/ttub/{0,1,...}
-
-  When the device is connected and recognized by the driver, the driver
-  will print to the system log, which node the device has been bound to.
-
-
-CONTACT:
-
-  If anyone has any problems using this driver, please contact me, or 
-  join the Linux-USB mailing list (information on joining the mailing 
-  list, as well as a link to its searchable archive is at 
-  http://www.linux-usb.org/ )
-
-
-Greg Kroah-Hartman
-greg@kroah.com
index 2404099996ac40d83a6e5512eb98498749c5bc83..330246ac80f80f282e987d83d78acac8856ddc14 100644 (file)
 139 -> Prolink PixelView PlayTV MPEG2 PV-M4900
 140 -> Osprey 440                                          [0070:ff07]
 141 -> Asound Skyeye PCTV
+142 -> Sabrent TV-FM (bttv version)
index 57c9d631db56210359ee75cce70825b41e78e631..efb708ec116ace349ccabdb31ccc0a1123fe5238 100644 (file)
@@ -80,3 +80,5 @@
  79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
  80 -> ASUS Digimatrix TV                       [1043:0210]
  81 -> Philips Tiger reference design           [1131:2018]
+ 82 -> MSI TV@Anywhere plus                     [1462:6231]
+
index ec840ca6f45501e215c52fe6b4a6540f7702512a..9d6544ea9f41881f0df7fea74f4f31b90211b9e5 100644 (file)
@@ -67,3 +67,4 @@ tuner=65 - Ymec TVF66T5-B/DFF
 tuner=66 - LG NTSC (TALN mini series)
 tuner=67 - Philips TD1316 Hybrid Tuner
 tuner=68 - Philips TUV1236D ATSC/NTSC dual in
+tuner=69 - Tena TNF 5335 MF
index ffe1c062088b9daa52954b2dd6054975f52b9a7b..e566affeed7f49e7b3a66f4d516a9c380805d63a 100644 (file)
@@ -7,10 +7,12 @@ Machine check
 
    mce=off disable machine check
    mce=bootlog Enable logging of machine checks left over from booting.
-               Disabled by default because some BIOS leave bogus ones.
+               Disabled by default on AMD because some BIOS leave bogus ones.
                If your BIOS doesn't do that it's a good idea to enable though
                to make sure you log even machine check events that result
-               in a reboot.
+               in a reboot. On Intel systems it is enabled by default.
+   mce=nobootlog
+               Disable boot machine check logging.
    mce=tolerancelevel (number)
                0: always panic, 1: panic if deadlock possible,
                2: try to avoid panic, 3: never panic or exit (for testing)
@@ -122,6 +124,9 @@ SMP
 
   cpumask=MASK   only use cpus with bits set in mask
 
+  additional_cpus=NUM Allow NUM more CPUs for hotplug
+                (defaults are specified by the BIOS or half the available CPUs)
+
 NUMA
 
   numa=off     Only set up a single NUMA node spanning all memory.
@@ -188,6 +193,9 @@ Debugging
 
   kstack=N   Print that many words from the kernel stack in oops dumps.
 
+  pagefaulttrace Dump all page faults. Only useful for extreme debugging
+               and will create a lot of output.
+
 Misc
 
   noreplacement  Don't replace instructions with more appropiate ones
index 662b73971a67b22eddf99b5b975da893b72a0b40..133561b9cb0c32f03f840af433bdd4976f68a3c0 100644 (file)
@@ -6,7 +6,7 @@ Virtual memory map with 4 level page tables:
 0000000000000000 - 00007fffffffffff (=47bits) user space, different per mm
 hole caused by [48:63] sign extension
 ffff800000000000 - ffff80ffffffffff (=40bits) guard hole
-ffff810000000000 - ffffc0ffffffffff (=46bits) direct mapping of phys. memory
+ffff810000000000 - ffffc0ffffffffff (=46bits) direct mapping of all phys. memory
 ffffc10000000000 - ffffc1ffffffffff (=40bits) hole
 ffffc20000000000 - ffffe1ffffffffff (=45bits) vmalloc/ioremap space
 ... unused hole ...
@@ -14,6 +14,10 @@ ffffffff80000000 - ffffffff82800000 (=40MB)   kernel text mapping, from phys 0
 ... unused hole ...
 ffffffff88000000 - fffffffffff00000 (=1919MB) module mapping space
 
+The direct mapping covers all memory in the system upto the highest
+memory address (this means in some cases it can also include PCI memory
+holes)
+
 vmalloc space is lazily synchronized into the different PML4 pages of
 the processes using the page fault handler, with init_level4_pgt as
 reference.
index 5541f9970b879de1c93902c54fb22efafe62a11b..f239ac4762ddb4565954c49135dff2adb1a364b5 100644 (file)
@@ -58,6 +58,7 @@ P: Person
 M: Mail patches to
 L: Mailing list that is relevant to this area
 W: Web-page with status/info
+T: SCM tree type and URL.  Type is one of: git, hg, quilt.
 S: Status, one of the following:
 
        Supported:      Someone is actually paid to look after this.
@@ -183,6 +184,7 @@ P:  Len Brown
 M:     len.brown@intel.com
 L:     acpi-devel@lists.sourceforge.net
 W:     http://acpi.sourceforge.net/
+T:     git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
 S:     Maintained
 
 AD1816 SOUND DRIVER
@@ -418,6 +420,7 @@ BLOCK LAYER
 P:     Jens Axboe
 M:     axboe@suse.de
 L:     linux-kernel@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
 S:     Maintained
 
 BLUETOOTH SUBSYSTEM
@@ -707,7 +710,7 @@ DCCP PROTOCOL
 P:     Arnaldo Carvalho de Melo
 M:     acme@mandriva.com
 L:     dccp@vger.kernel.org
-W:     http://www.wlug.org.nz/DCCP
+W:     http://linux-net.osdl.org/index.php/DCCP
 S:     Maintained
 
 DECnet NETWORK LAYER
@@ -803,12 +806,14 @@ DRIVER CORE, KOBJECTS, AND SYSFS
 P:     Greg Kroah-Hartman
 M:     gregkh@suse.de
 L:     linux-kernel@vger.kernel.org
+T:     quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
 S:     Supported
 
 DRM DRIVERS
 P:     David Airlie
 M:     airlied@linux.ie
 L:     dri-devel@lists.sourceforge.net
+T:     git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 S:     Maintained
 
 DSCC4 DRIVER
@@ -1113,6 +1118,7 @@ P:        Jean Delvare
 M:     khali@linux-fr.org
 L:     lm-sensors@lm-sensors.org
 W:     http://www.lm-sensors.nu/
+T:     quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
 S:     Maintained
 
 I2O
@@ -1145,6 +1151,7 @@ P:        Tony Luck
 M:     tony.luck@intel.com
 L:     linux-ia64@vger.kernel.org
 W:     http://www.ia64-linux.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
 S:     Maintained
 
 SN-IA64 (Itanium) SUB-PLATFORM
@@ -1212,6 +1219,7 @@ P:        Jody McIntyre
 M:     scjody@steamballoon.com
 L:     linux1394-devel@lists.sourceforge.net
 W:     http://www.linux1394.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
 S:     Maintained
 
 IEEE 1394 OHCI DRIVER
@@ -1263,6 +1271,7 @@ P:        Hal Rosenstock
 M:     halr@voltaire.com
 L:     openib-general@openib.org
 W:     http://www.openib.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
 S:     Supported
 
 INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS
@@ -1436,6 +1445,7 @@ P:        Kai Germaschewski
 M:     kai@germaschewski.name
 P:     Sam Ravnborg
 M:     sam@ravnborg.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
 S:     Maintained 
 
 KERNEL JANITORS
@@ -1565,7 +1575,7 @@ S:        Maintained
 
 LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 P:     Kumar Gala
-M:     kumar.gala@freescale.com
+M:     galak@kernel.crashing.org
 W:     http://www.penguinppc.org/
 L:     linuxppc-embedded@ozlabs.org
 S:     Maintained
@@ -1782,6 +1792,7 @@ M:        akpm@osdl.org
 P:     Jeff Garzik
 M:     jgarzik@pobox.com
 L:     netdev@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
 S:     Maintained
 
 NETWORKING [GENERAL]
@@ -1873,6 +1884,16 @@ L:       linux-tr@linuxtr.net
 W:     http://www.linuxtr.net
 S:     Maintained
 
+OMNIKEY CARDMAN 4000 DRIVER
+P:     Harald Welte
+M:     laforge@gnumonks.org
+S:     Maintained
+
+OMNIKEY CARDMAN 4040 DRIVER
+P:     Harald Welte
+M:     laforge@gnumonks.org
+S:     Maintained
+
 ONSTREAM SCSI TAPE DRIVER
 P:     Willem Riede
 M:     osst@riede.org
@@ -1949,6 +1970,7 @@ P:        Greg Kroah-Hartman
 M:     gregkh@suse.de
 L:     linux-kernel@vger.kernel.org
 L:     linux-pci@atrey.karlin.mff.cuni.cz
+T:     quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
 S:     Supported
 
 PCI HOTPLUG CORE
@@ -1970,6 +1992,7 @@ S:        Maintained
 PCMCIA SUBSYSTEM
 P:     Linux PCMCIA Team
 L:     http://lists.infradead.org/mailman/listinfo/linux-pcmcia
+T:     git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
 S:     Maintained
 
 PCNET32 NETWORK DRIVER
@@ -1988,7 +2011,6 @@ PKTCDVD DRIVER
 P:     Peter Osterlund
 M:     petero2@telia.com
 L:     linux-kernel@vger.kernel.org
-L:     packet-writing@suse.com
 S:     Maintained
 
 POSIX CLOCKS and TIMERS
@@ -2180,6 +2202,7 @@ SCSI SUBSYSTEM
 P:     James E.J. Bottomley
 M:     James.Bottomley@SteelEye.com
 L:     linux-scsi@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
 S:     Maintained
 
 SCSI TAPE DRIVER
@@ -2219,6 +2242,7 @@ SERIAL ATA (SATA) SUBSYSTEM:
 P:     Jeff Garzik
 M:     jgarzik@pobox.com
 L:     linux-ide@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
 S:     Supported
 
 SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER
@@ -2740,6 +2764,7 @@ M:        gregkh@suse.de
 L:     linux-usb-users@lists.sourceforge.net
 L:     linux-usb-devel@lists.sourceforge.net
 W:     http://www.linux-usb.org
+T:     quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
 S:     Supported
 
 USB UHCI DRIVER
index ea96da1572d595de19daeda44b2364416e9bd3a0..c31914400953b05438b6cda4e793d166094b2ee4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
-SUBLEVEL = 14
-EXTRAVERSION =
+SUBLEVEL = 15
+EXTRAVERSION =-rc1
 NAME=Affluent Albatross
 
 # *DOCUMENTATION*
@@ -168,7 +168,8 @@ KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)
 
 SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
                                  -e s/arm.*/arm/ -e s/sa110/arm/ \
-                                 -e s/s390x/s390/ -e s/parisc64/parisc/ )
+                                 -e s/s390x/s390/ -e s/parisc64/parisc/ \
+                                 -e s/ppc64/powerpc/ )
 
 # Cross compiling and selecting different set of gcc/bin-utils
 # ---------------------------------------------------------------------------
@@ -347,7 +348,7 @@ AFLAGS_KERNEL       =
 # Needed to be compatible with the O= option
 LINUXINCLUDE    := -Iinclude \
                    $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
-                  -imacros include/linux/autoconf.h
+                  -include include/linux/autoconf.h
 
 CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
 
@@ -407,7 +408,7 @@ outputmakefile:
 # of make so .config is not included in this case either (for *config).
 
 no-dot-config-targets := clean mrproper distclean \
-                        cscope TAGS tags help %docs check%
+                        cscope TAGS tags help %docs check% kernelrelease
 
 config-targets := 0
 mixed-targets  := 0
@@ -1192,6 +1193,17 @@ else
 __srctree = $(srctree)/
 endif
 
+ifeq ($(ALLSOURCE_ARCHS),)
+ifeq ($(ARCH),um)
+ALLINCLUDE_ARCHS := $(ARCH) $(SUBARCH)
+else
+ALLINCLUDE_ARCHS := $(ARCH)
+endif
+else
+#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
+ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
+endif
+
 ALLSOURCE_ARCHS := $(ARCH)
 
 define all-sources
@@ -1207,7 +1219,7 @@ define all-sources
          find $(__srctree)include $(RCS_FIND_IGNORE) \
               \( -name config -o -name 'asm-*' \) -prune \
               -o -name '*.[chS]' -print; \
-         for ARCH in $(ALLSOURCE_ARCHS) ; do \
+         for ARCH in $(ALLINCLUDE_ARCHS) ; do \
               find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
                    -name '*.[chS]' -print; \
          done ; \
diff --git a/README b/README
index 4ee7dda88ba3956f0bea64072ee456ddf27fe8f9..61c4f7429233d509f26c267cf95fa01742b81e3e 100644 (file)
--- a/README
+++ b/README
@@ -81,6 +81,11 @@ INSTALLING the kernel:
    failed patches (xxx# or xxx.rej). If there are, either you or me has
    made a mistake.
 
+   Unlike patches for the 2.6.x kernels, patches for the 2.6.x.y kernels
+   (also known as the -stable kernels) are not incremental but instead apply
+   directly to the base 2.6.x kernel.  Please read
+   Documentation/applying-patches.txt for more information.
+
    Alternatively, the script patch-kernel can be used to automate this
    process.  It determines the current kernel version and applies any
    patches found.
index 3df7cbd924a10c0b859cfecb0ce708ccf531d9cd..4b15f5f1e254d24ae1234c6de3697b5f85efa5ba 100644 (file)
@@ -652,25 +652,11 @@ endmenu
 
 menu "Power management options"
 
-config PM
-       bool "Power Management support"
-       ---help---
-         "Power Management" means that parts of your computer are shut
-         off or put into a power conserving "sleep" mode if they are not
-         being used.  There are two competing standards for doing this: APM
-         and ACPI.  If you want to use either one, say Y here and then also
-         to the requisite support below.
-
-         Power Management is most important for battery powered laptop
-         computers; if you have a laptop, check out the Linux Laptop home
-         page on the WWW at <http://www.linux-on-laptops.com/> or
-         Tuxmobil - Linux on Mobile Computers at <http://www.tuxmobil.org/>
-         and the Battery Powered Linux mini-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
+source "kernel/power/Kconfig"
 
 config APM
        tristate "Advanced Power Management Emulation"
-       depends on PM
+       depends on PM_LEGACY
        ---help---
          APM is a BIOS specification for saving power using several different
          techniques. This is mostly useful for battery powered laptops with
@@ -702,6 +688,8 @@ menu "Device Drivers"
 
 source "drivers/base/Kconfig"
 
+source "drivers/connector/Kconfig"
+
 if ALIGNMENT_TRAP
 source "drivers/mtd/Kconfig"
 endif
index 7c7f475e213ea3f85779165679e06feb1aea7109..6abafb6f1844d9b82a3f74cbfcb3b77486f2e5b8 100644 (file)
  */
 #ifdef DEBUG
 
-#include <asm/arch/debug-macro.S>
-
 #if defined(CONFIG_DEBUG_ICEDCC)
                .macro  loadsp, rb
                .endm
-               .macro writeb, ch, rb
+               .macro  writeb, ch, rb
                mcr     p14, 0, \ch, c0, c1, 0
                .endm
 #else
+
+#include <asm/arch/debug-macro.S>
+
                .macro  writeb, ch, rb
                senduart \ch, \rb
                .endm
 
-#if defined(CONFIG_FOOTBRIDGE) || \
-    defined(CONFIG_ARCH_RPC) || \
-    defined(CONFIG_ARCH_INTEGRATOR) || \
-    defined(CONFIG_ARCH_PXA) || \
-    defined(CONFIG_ARCH_IXP4XX) || \
-    defined(CONFIG_ARCH_IXP2000) || \
-    defined(CONFIG_ARCH_LH7A40X) || \
-    defined(CONFIG_ARCH_OMAP)
-               .macro  loadsp, rb
-               addruart \rb
-               .endm
-#elif defined(CONFIG_ARCH_SA1100)
+#if defined(CONFIG_ARCH_SA1100)
                .macro  loadsp, rb
                mov     \rb, #0x80000000        @ physical base address
-#  if defined(CONFIG_DEBUG_LL_SER3)
+#ifdef CONFIG_DEBUG_LL_SER3
                add     \rb, \rb, #0x00050000   @ Ser3
-#  else
+#else
                add     \rb, \rb, #0x00010000   @ Ser1
-#  endif
+#endif
                .endm
 #elif defined(CONFIG_ARCH_IOP331)
                .macro loadsp, rb
@@ -64,7 +54,9 @@
                add     \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
                .endm
 #else
-#error no serial architecture defined
+               .macro  loadsp, rb
+               addruart \rb
+               .endm
 #endif
 #endif
 #endif
index ad55680726ed5b10fac7efb9852d9294d940cf26..1b7eaab02b9ec66263b0c66cd15e4522ab72f06f 100644 (file)
@@ -550,9 +550,9 @@ struct locomo_save_data {
        u16     LCM_SPIMD;
 };
 
-static int locomo_suspend(struct device *dev, pm_message_t state)
+static int locomo_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform_get_drvdata(dev);
        struct locomo_save_data *save;
        unsigned long flags;
 
@@ -560,7 +560,7 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
        if (!save)
                return -ENOMEM;
 
-       dev->power.saved_state = (void *) save;
+       dev->dev.power.saved_state = (void *) save;
 
        spin_lock_irqsave(&lchip->lock, flags);
 
@@ -594,14 +594,14 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int locomo_resume(struct device *dev)
+static int locomo_resume(struct platform_device *dev)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform_get_drvdata(dev);
        struct locomo_save_data *save;
        unsigned long r;
        unsigned long flags;
        
-       save = (struct locomo_save_data *) dev->power.saved_state;
+       save = (struct locomo_save_data *) dev->dev.power.saved_state;
        if (!save)
                return 0;
 
@@ -623,8 +623,6 @@ static int locomo_resume(struct device *dev)
        locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
 
        spin_unlock_irqrestore(&lchip->lock, flags);
-
-       dev->power.saved_state = NULL;
        kfree(save);
 
        return 0;
@@ -760,27 +758,26 @@ static void __locomo_remove(struct locomo *lchip)
        kfree(lchip);
 }
 
-static int locomo_probe(struct device *dev)
+static int locomo_probe(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem;
        int irq;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mem = platform_get_resource(dev, IORESOURCE_MEM, 0);
        if (!mem)
                return -EINVAL;
-       irq = platform_get_irq(pdev, 0);
+       irq = platform_get_irq(dev, 0);
 
-       return __locomo_probe(dev, mem, irq);
+       return __locomo_probe(&dev->dev, mem, irq);
 }
 
-static int locomo_remove(struct device *dev)
+static int locomo_remove(struct platform_device *dev)
 {
-       struct locomo *lchip = dev_get_drvdata(dev);
+       struct locomo *lchip = platform_get_drvdata(dev);
 
        if (lchip) {
                __locomo_remove(lchip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
        }
 
        return 0;
@@ -792,15 +789,16 @@ static int locomo_remove(struct device *dev)
  *     the per-machine level, and then have this driver pick
  *     up the registered devices.
  */
-static struct device_driver locomo_device_driver = {
-       .name           = "locomo",
-       .bus            = &platform_bus_type,
+static struct platform_driver locomo_device_driver = {
        .probe          = locomo_probe,
        .remove         = locomo_remove,
 #ifdef CONFIG_PM
        .suspend        = locomo_suspend,
        .resume         = locomo_resume,
 #endif
+       .driver         = {
+               .name   = "locomo",
+       },
 };
 
 /*
@@ -1126,13 +1124,13 @@ static int __init locomo_init(void)
 {
        int ret = bus_register(&locomo_bus_type);
        if (ret == 0)
-               driver_register(&locomo_device_driver);
+               platform_driver_register(&locomo_device_driver);
        return ret;
 }
 
 static void __exit locomo_exit(void)
 {
-       driver_unregister(&locomo_device_driver);
+       platform_driver_unregister(&locomo_device_driver);
        bus_unregister(&locomo_bus_type);
 }
 
index 174aa86ee816b49b2e41dcd2e2cfca64b2c3abbf..d0d6e6d2d649e9887813fc6f3e08debb292e2b81 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach/irq.h>
+#include <asm/sizes.h>
 
 #include <asm/hardware/sa1111.h>
 
@@ -132,6 +133,17 @@ static struct sa1111_dev_info sa1111_devices[] = {
        },
 };
 
+void __init sa1111_adjust_zones(int node, unsigned long *size, unsigned long *holes)
+{
+       unsigned int sz = SZ_1M >> PAGE_SHIFT;
+
+       if (node != 0)
+               sz = 0;
+
+       size[1] = size[0] - sz;
+       size[0] = sz;
+}
+
 /*
  * SA1111 interrupt support.  Since clearing an IRQ while there are
  * active IRQs causes the interrupt output to pulse, the upper levels
@@ -801,9 +813,9 @@ struct sa1111_save_data {
 
 #ifdef CONFIG_PM
 
-static int sa1111_suspend(struct device *dev, pm_message_t state)
+static int sa1111_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(dev);
        struct sa1111_save_data *save;
        unsigned long flags;
        unsigned int val;
@@ -812,7 +824,7 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
        save = kmalloc(sizeof(struct sa1111_save_data), GFP_KERNEL);
        if (!save)
                return -ENOMEM;
-       dev->power.saved_state = save;
+       dev->dev.power.saved_state = save;
 
        spin_lock_irqsave(&sachip->lock, flags);
 
@@ -859,14 +871,14 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
  *     restored by their respective drivers, and must be called
  *     via LDM after this function.
  */
-static int sa1111_resume(struct device *dev)
+static int sa1111_resume(struct platform_device *dev)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(dev);
        struct sa1111_save_data *save;
        unsigned long flags, id;
        void __iomem *base;
 
-       save = (struct sa1111_save_data *)dev->power.saved_state;
+       save = (struct sa1111_save_data *)dev->dev.power.saved_state;
        if (!save)
                return 0;
 
@@ -879,7 +891,7 @@ static int sa1111_resume(struct device *dev)
        id = sa1111_readl(sachip->base + SA1111_SKID);
        if ((id & SKID_ID_MASK) != SKID_SA1111_ID) {
                __sa1111_remove(sachip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
                kfree(save);
                return 0;
        }
@@ -911,7 +923,7 @@ static int sa1111_resume(struct device *dev)
 
        spin_unlock_irqrestore(&sachip->lock, flags);
 
-       dev->power.saved_state = NULL;
+       dev->dev.power.saved_state = NULL;
        kfree(save);
 
        return 0;
@@ -922,9 +934,8 @@ static int sa1111_resume(struct device *dev)
 #define sa1111_resume  NULL
 #endif
 
-static int sa1111_probe(struct device *dev)
+static int sa1111_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem;
        int irq;
 
@@ -933,20 +944,20 @@ static int sa1111_probe(struct device *dev)
                return -EINVAL;
        irq = platform_get_irq(pdev, 0);
 
-       return __sa1111_probe(dev, mem, irq);
+       return __sa1111_probe(&pdev->dev, mem, irq);
 }
 
-static int sa1111_remove(struct device *dev)
+static int sa1111_remove(struct platform_device *pdev)
 {
-       struct sa1111 *sachip = dev_get_drvdata(dev);
+       struct sa1111 *sachip = platform_get_drvdata(pdev);
 
        if (sachip) {
                __sa1111_remove(sachip);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
 
 #ifdef CONFIG_PM
-               kfree(dev->power.saved_state);
-               dev->power.saved_state = NULL;
+               kfree(pdev->dev.power.saved_state);
+               pdev->dev.power.saved_state = NULL;
 #endif
        }
 
@@ -962,13 +973,14 @@ static int sa1111_remove(struct device *dev)
  *     We also need to handle the SDRAM configuration for
  *     PXA250/SA1110 machine classes.
  */
-static struct device_driver sa1111_device_driver = {
-       .name           = "sa1111",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1111_device_driver = {
        .probe          = sa1111_probe,
        .remove         = sa1111_remove,
        .suspend        = sa1111_suspend,
        .resume         = sa1111_resume,
+       .driver         = {
+               .name   = "sa1111",
+       },
 };
 
 /*
@@ -1256,17 +1268,17 @@ static int __init sa1111_init(void)
 {
        int ret = bus_register(&sa1111_bus_type);
        if (ret == 0)
-               driver_register(&sa1111_device_driver);
+               platform_driver_register(&sa1111_device_driver);
        return ret;
 }
 
 static void __exit sa1111_exit(void)
 {
-       driver_unregister(&sa1111_device_driver);
+       platform_driver_unregister(&sa1111_device_driver);
        bus_unregister(&sa1111_bus_type);
 }
 
-module_init(sa1111_init);
+subsys_initcall(sa1111_init);
 module_exit(sa1111_exit);
 
 MODULE_DESCRIPTION("Intel Corporation SA1111 core driver");
index c7fdf390cef9cbf20325431ea092d07c658f7f18..0c3cbd9a388b90d085f0e7b98113f375a2bfd512 100644 (file)
@@ -98,9 +98,9 @@ static void check_scoop_reg(struct scoop_dev *sdev)
 }
 
 #ifdef CONFIG_PM
-static int scoop_suspend(struct device *dev, pm_message_t state)
+static int scoop_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(dev);
 
        check_scoop_reg(sdev);
        sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
@@ -109,9 +109,9 @@ static int scoop_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int scoop_resume(struct device *dev)
+static int scoop_resume(struct platform_device *dev)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(dev);
 
        check_scoop_reg(sdev);
        SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
@@ -123,11 +123,10 @@ static int scoop_resume(struct device *dev)
 #define scoop_resume   NULL
 #endif
 
-int __init scoop_probe(struct device *dev)
+int __init scoop_probe(struct platform_device *pdev)
 {
        struct scoop_dev *devptr;
        struct scoop_config *inf;
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        if (!mem)
@@ -141,7 +140,7 @@ int __init scoop_probe(struct device *dev)
        memset(devptr, 0, sizeof(struct scoop_dev));
        spin_lock_init(&devptr->scoop_lock);
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        devptr->base = ioremap(mem->start, mem->end - mem->start + 1);
 
        if (!devptr->base) {
@@ -149,12 +148,12 @@ int __init scoop_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, devptr);
+       platform_set_drvdata(pdev, devptr);
 
        printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base);
 
        SCOOP_REG(devptr->base, SCOOP_MCR) = 0x0140;
-       reset_scoop(dev);
+       reset_scoop(&pdev->dev);
        SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
        SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;
 
@@ -164,29 +163,30 @@ int __init scoop_probe(struct device *dev)
        return 0;
 }
 
-static int scoop_remove(struct device *dev)
+static int scoop_remove(struct platform_device *pdev)
 {
-       struct scoop_dev *sdev = dev_get_drvdata(dev);
+       struct scoop_dev *sdev = platform_get_drvdata(pdev);
        if (sdev) {
                iounmap(sdev->base);
                kfree(sdev);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
        }
        return 0;
 }
 
-static struct device_driver scoop_driver = {
-       .name           = "sharp-scoop",
-       .bus            = &platform_bus_type,
+static struct platform_driver scoop_driver = {
        .probe          = scoop_probe,
        .remove         = scoop_remove,
        .suspend        = scoop_suspend,
        .resume         = scoop_resume,
+       .driver         = {
+               .name   = "sharp-scoop",
+       },
 };
 
 int __init scoop_init(void)
 {
-       return driver_register(&scoop_driver);
+       return platform_driver_register(&scoop_driver);
 }
 
 subsys_initcall(scoop_init);
index 30e6444f9aaab9238196b03a2d35fcf9438d45e0..fd7c0042bccaad22b1ba820104b5e30d9e905468 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13
-# Wed Sep 14 10:51:52 2005
+# Linux kernel version: 2.6.14-git13
+# Thu Nov 10 15:12:48 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -124,7 +144,6 @@ CONFIG_XSCALE_PMU=y
 CONFIG_ISA_DMA_API=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -144,6 +163,8 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -162,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -205,13 +227,18 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_TUNNEL is not set
-# CONFIG_IP_TCPDIAG is not set
-# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -228,6 +255,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -238,6 +269,7 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -273,6 +305,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -307,7 +340,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP2000=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -333,6 +365,11 @@ CONFIG_MTD_IXP2000=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -358,21 +395,13 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
 #
@@ -409,6 +438,11 @@ CONFIG_DUMMY=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -416,6 +450,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -455,6 +490,7 @@ CONFIG_EEPRO100=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
@@ -464,6 +500,7 @@ CONFIG_EEPRO100=y
 #
 # Ethernet (10000 Mbit)
 #
+# CONFIG_CHELSIO_T1 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
@@ -609,6 +646,7 @@ CONFIG_IXP2000_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -634,7 +672,6 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
 # CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_ISA is not set
 CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -649,7 +686,6 @@ CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
 # CONFIG_I2C_PCA_ISA is not set
-CONFIG_I2C_SENSOR=y
 
 #
 # Miscellaneous I2C Chip support
@@ -662,6 +698,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -671,6 +708,7 @@ CONFIG_SENSORS_EEPROM=y
 # Hardware Monitoring support
 #
 CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ADM1021 is not set
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
@@ -701,6 +739,7 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83792D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
@@ -710,6 +749,10 @@ CONFIG_HWMON=y
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -737,6 +780,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -765,10 +812,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -777,6 +820,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -796,11 +840,10 @@ CONFIG_DNOTIFY=y
 #
 CONFIG_PROC_FS=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -816,6 +859,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -848,6 +892,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -886,6 +931,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -894,7 +940,9 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
@@ -920,6 +968,7 @@ CONFIG_DEBUG_LL=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index ddeb9f99d662ce1bfdf5ea3c074b71604642aaca..e6a4d2656fe53d17ad605a9ce83690074b41b797 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13
-# Wed Sep 14 10:52:01 2005
+# Linux kernel version: 2.6.14-git13
+# Thu Nov 10 15:14:13 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
 CONFIG_ISA_DMA_API=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_TUNNEL is not set
-# CONFIG_IP_TCPDIAG is not set
-# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP2000=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
 #
@@ -410,6 +439,11 @@ CONFIG_DUMMY=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -456,6 +491,7 @@ CONFIG_EEPRO100=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
@@ -465,6 +501,7 @@ CONFIG_EEPRO100=y
 #
 # Ethernet (10000 Mbit)
 #
+# CONFIG_CHELSIO_T1 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
@@ -610,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -635,7 +673,6 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
 # CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_ISA is not set
 CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -650,7 +687,6 @@ CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
 # CONFIG_I2C_PCA_ISA is not set
-CONFIG_I2C_SENSOR=y
 
 #
 # Miscellaneous I2C Chip support
@@ -663,6 +699,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -672,6 +709,7 @@ CONFIG_SENSORS_EEPROM=y
 # Hardware Monitoring support
 #
 CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ADM1021 is not set
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
@@ -702,6 +740,7 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83792D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
@@ -711,6 +750,10 @@ CONFIG_HWMON=y
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -738,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -766,10 +813,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -778,6 +821,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -797,11 +841,10 @@ CONFIG_DNOTIFY=y
 #
 CONFIG_PROC_FS=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -817,6 +860,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -849,6 +893,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -887,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -895,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
@@ -921,6 +969,7 @@ CONFIG_DEBUG_LL=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index 32bd552e0986d6d6b3f037742a76a0dad4ce15d0..5572cf95d5f852aed0c7066e53b3739a2eeb92b0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13
-# Wed Sep 14 10:52:10 2005
+# Linux kernel version: 2.6.14-git13
+# Thu Nov 10 15:14:50 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
 CONFIG_ISA_DMA_API=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firm
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_TUNNEL is not set
-CONFIG_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP2000=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
 #
@@ -410,6 +439,11 @@ CONFIG_DUMMY=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -457,6 +492,7 @@ CONFIG_EEPRO100=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
@@ -466,6 +502,7 @@ CONFIG_EEPRO100=y
 #
 # Ethernet (10000 Mbit)
 #
+# CONFIG_CHELSIO_T1 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
@@ -611,6 +648,7 @@ CONFIG_IXP2000_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -636,7 +674,6 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
 # CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_ISA is not set
 CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -651,7 +688,6 @@ CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
 # CONFIG_I2C_PCA_ISA is not set
-CONFIG_I2C_SENSOR=y
 
 #
 # Miscellaneous I2C Chip support
@@ -664,6 +700,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -673,6 +710,7 @@ CONFIG_SENSORS_EEPROM=y
 # Hardware Monitoring support
 #
 CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ADM1021 is not set
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
@@ -703,6 +741,7 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83792D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
@@ -712,6 +751,10 @@ CONFIG_HWMON=y
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -739,6 +782,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -767,10 +814,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -779,6 +822,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -798,11 +842,10 @@ CONFIG_DNOTIFY=y
 #
 CONFIG_PROC_FS=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -818,6 +861,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -850,6 +894,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -888,6 +933,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -896,7 +942,9 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
@@ -922,6 +970,7 @@ CONFIG_DEBUG_LL=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index 81d3a0606f95d4da93c978a75e9f923c03f95612..0fddbde858359c6a7b09d2a31e80e0bfa2557278 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13
-# Wed Sep 14 10:52:23 2005
+# Linux kernel version: 2.6.14-git13
+# Thu Nov 10 15:14:56 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
 CONFIG_ISA_DMA_API=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0"
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_TUNNEL is not set
-# CONFIG_IP_TCPDIAG is not set
-# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP2000=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
 #
@@ -410,6 +439,11 @@ CONFIG_DUMMY=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -456,6 +491,7 @@ CONFIG_EEPRO100=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
@@ -465,6 +501,7 @@ CONFIG_EEPRO100=y
 #
 # Ethernet (10000 Mbit)
 #
+# CONFIG_CHELSIO_T1 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
@@ -610,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -635,7 +673,6 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
 # CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_ISA is not set
 CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -650,7 +687,6 @@ CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
 # CONFIG_I2C_PCA_ISA is not set
-CONFIG_I2C_SENSOR=y
 
 #
 # Miscellaneous I2C Chip support
@@ -663,6 +699,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -672,6 +709,7 @@ CONFIG_SENSORS_EEPROM=y
 # Hardware Monitoring support
 #
 CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ADM1021 is not set
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
@@ -702,6 +740,7 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83792D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
@@ -711,6 +750,10 @@ CONFIG_HWMON=y
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -738,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -766,10 +813,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -778,6 +821,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -797,11 +841,10 @@ CONFIG_DNOTIFY=y
 #
 CONFIG_PROC_FS=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -817,6 +860,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -849,6 +893,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -887,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -895,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
@@ -921,6 +969,7 @@ CONFIG_DEBUG_LL=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index 66ac0885df3e9825eee28858f1f3dd98079410a6..89b9aa06aa9108898fbca8ebc511ebb8fc4e4b46 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13
-# Wed Sep 14 10:52:16 2005
+# Linux kernel version: 2.6.14-git13
+# Thu Nov 10 15:15:03 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
 # CONFIG_HOTPLUG is not set
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
 CONFIG_ISA_DMA_API=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firm
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_TUNNEL is not set
-# CONFIG_IP_TCPDIAG is not set
-# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP2000=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
 #
@@ -410,6 +439,11 @@ CONFIG_DUMMY=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -457,6 +492,7 @@ CONFIG_EEPRO100=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
@@ -466,6 +502,7 @@ CONFIG_EEPRO100=y
 #
 # Ethernet (10000 Mbit)
 #
+# CONFIG_CHELSIO_T1 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
@@ -611,6 +648,7 @@ CONFIG_IXP2000_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -636,7 +674,6 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
 # CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_ISA is not set
 CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -651,7 +688,6 @@ CONFIG_I2C_IXP2000=y
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
 # CONFIG_I2C_PCA_ISA is not set
-CONFIG_I2C_SENSOR=y
 
 #
 # Miscellaneous I2C Chip support
@@ -664,6 +700,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -673,6 +710,7 @@ CONFIG_SENSORS_EEPROM=y
 # Hardware Monitoring support
 #
 CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ADM1021 is not set
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
@@ -703,6 +741,7 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83792D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
@@ -712,6 +751,10 @@ CONFIG_HWMON=y
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -739,6 +782,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -767,10 +814,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -779,6 +822,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -798,11 +842,10 @@ CONFIG_DNOTIFY=y
 #
 CONFIG_PROC_FS=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -818,6 +861,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -850,6 +894,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -888,6 +933,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -896,7 +942,9 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
@@ -922,6 +970,7 @@ CONFIG_DEBUG_LL=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index 756348bf51702c982b17521ecfd66719842b845f..3f97590c91f22b7d17cf5af8b6ec59af9ec329e7 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-git8
-# Thu Sep  8 19:24:02 2005
+# Linux kernel version: 2.6.15-rc1
+# Sun Nov 13 17:41:24 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -61,6 +61,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -83,6 +100,7 @@ CONFIG_ARCH_S3C2410=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -108,6 +126,7 @@ CONFIG_CPU_S3C2440=y
 # S3C2410 Boot
 #
 # CONFIG_S3C2410_BOOT_WATCHDOG is not set
+# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
 
 #
 # S3C2410 Setup
@@ -142,6 +161,7 @@ CONFIG_CPU_TLB_V4WBI=y
 #
 # Bus support
 #
+CONFIG_ISA=y
 CONFIG_ISA_DMA_API=y
 
 #
@@ -152,7 +172,6 @@ CONFIG_ISA_DMA_API=y
 #
 # Kernel Features
 #
-# CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 # CONFIG_NO_IDLE_HZ is not set
 # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
@@ -163,6 +182,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -253,6 +273,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -260,7 +284,6 @@ CONFIG_TCP_CONG_BIC=y
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-# CONFIG_NETFILTER_NETLINK is not set
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
@@ -300,6 +323,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -335,7 +359,6 @@ CONFIG_MTD_ROM=y
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_IMPA7 is not set
 CONFIG_MTD_BAST=y
 CONFIG_MTD_BAST_MAXSIZE=4
@@ -369,6 +392,11 @@ CONFIG_MTD_NAND_S3C2410=y
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -381,10 +409,12 @@ CONFIG_PARPORT_1284=y
 #
 # Plug and Play support
 #
+# CONFIG_PNP is not set
 
 #
 # Block devices
 #
+# CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
@@ -395,14 +425,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -428,6 +450,7 @@ CONFIG_BLK_DEV_IDEFLOPPY=m
 CONFIG_IDE_GENERIC=y
 # CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDE_BAST=y
+# CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -466,6 +489,11 @@ CONFIG_NETDEVICES=y
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
 #
 # PHY device support
 #
@@ -475,9 +503,19 @@ CONFIG_NETDEVICES=y
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
+CONFIG_MII=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_SMC91X is not set
-CONFIG_DM9000=m
+CONFIG_DM9000=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -490,6 +528,7 @@ CONFIG_DM9000=m
 #
 # Token Ring devices
 #
+# CONFIG_TR is not set
 
 #
 # Wireless LAN (non-hamradio)
@@ -542,6 +581,9 @@ CONFIG_KEYBOARD_ATKBD=y
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
 # CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
 # CONFIG_MOUSE_VSXXXAA is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
@@ -568,6 +610,7 @@ CONFIG_SERIAL_NONSTANDARD=y
 # CONFIG_ROCKETPORT is not set
 # CONFIG_CYCLADES is not set
 # CONFIG_DIGIEPCA is not set
+# CONFIG_ESPSERIAL is not set
 # CONFIG_MOXA_INTELLIO is not set
 # CONFIG_MOXA_SMARTIO is not set
 # CONFIG_ISI is not set
@@ -590,6 +633,10 @@ CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
 # CONFIG_SERIAL_8250_DETECT_IRQ is not set
 # CONFIG_SERIAL_8250_RSA is not set
+# CONFIG_SERIAL_8250_FOURPORT is not set
+# CONFIG_SERIAL_8250_ACCENT is not set
+# CONFIG_SERIAL_8250_BOCA is not set
+# CONFIG_SERIAL_8250_HUB6 is not set
 
 #
 # Non-8250 serial port support
@@ -622,6 +669,13 @@ CONFIG_WATCHDOG=y
 #
 # CONFIG_SOFT_WATCHDOG is not set
 CONFIG_S3C2410_WATCHDOG=y
+
+#
+# ISA-based Watchdog Cards
+#
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_WDT is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 CONFIG_S3C2410_RTC=y
@@ -636,6 +690,7 @@ CONFIG_S3C2410_RTC=y
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -653,6 +708,7 @@ CONFIG_I2C_ALGOBIT=m
 #
 # I2C Hardware Bus support
 #
+# CONFIG_I2C_ELEKTOR is not set
 CONFIG_I2C_ISA=m
 # CONFIG_I2C_PARPORT is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -671,6 +727,7 @@ CONFIG_SENSORS_EEPROM=m
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -737,22 +794,28 @@ CONFIG_SENSORS_LM85=m
 # Graphics support
 #
 CONFIG_FB=y
-# CONFIG_FB_CFB_FILLRECT is not set
-# CONFIG_FB_CFB_COPYAREA is not set
-# CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_SOFT_CURSOR is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
 # CONFIG_FB_MACMODES is not set
 CONFIG_FB_MODE_HELPERS=y
 # CONFIG_FB_TILEBLITTING is not set
 # CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3C2410=y
+# CONFIG_FB_S3C2410_DEBUG is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
 # Console display driver support
 #
 # CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 
 #
 # Logo configuration
@@ -772,6 +835,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -798,10 +865,6 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
-
-#
-# XFS support
-#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 CONFIG_ROMFS_FS=y
@@ -810,6 +873,7 @@ CONFIG_INOTIFY=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -854,6 +918,7 @@ CONFIG_JFFS_FS_VERBOSE=0
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -884,6 +949,7 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -959,7 +1025,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=16
 CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
@@ -970,7 +1036,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
 CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_INFO=y
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_WAITQ is not set
 # CONFIG_DEBUG_ERRORS is not set
@@ -998,6 +1066,7 @@ CONFIG_DEBUG_S3C2410_UART=0
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
index b0bbd1e62ebb70e107268ce7b176de0ffcd13c8e..a2843be0555733feaa8fc5cc29574817ce5c6c4d 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/apm_bios.h>
 #include <linux/sched.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
index e55ea952f7aa1d9f84ecce020d5caaa548f244fd..373c0959bc2f64ff02e72610e3091f53b6cd9763 100644 (file)
@@ -256,9 +256,7 @@ void __cpuexit cpu_die(void)
 asmlinkage void __cpuinit secondary_start_kernel(void)
 {
        struct mm_struct *mm = &init_mm;
-       unsigned int cpu;
-
-       cpu = smp_processor_id();
+       unsigned int cpu = smp_processor_id();
 
        printk("CPU%u: Booted secondary processor\n", cpu);
 
index fe797cf320bb488646d187c041452deac0223a14..a78dae5a7b28d2b55fd9acb6c5347beb4675b6e8 100644 (file)
@@ -26,7 +26,7 @@ td1   .req    r4      @ save before use
 td2    .req    r5      @ save before use
 td3    .req    lr
 
-.zero:         mov     r0, sum
+.Lzero:                mov     r0, sum
                add     sp, sp, #4
                ldr     pc, [sp], #4
 
@@ -34,8 +34,8 @@ td3   .req    lr
                 * Handle 0 to 7 bytes, with any alignment of source and
                 * destination pointers.  Note that when we get here, C = 0
                 */
-.less8:                teq     len, #0                 @ check for zero count
-               beq     .zero
+.Lless8:               teq     len, #0                 @ check for zero count
+               beq     .Lzero
 
                /* we must have at least one byte. */
                tst     buf, #1                 @ odd address?
@@ -44,12 +44,12 @@ td3 .req    lr
                subne   len, len, #1
                adcnes  sum, sum, td0, put_byte_1
 
-.less4:                tst     len, #6
-               beq     .less8_byte
+.Lless4:               tst     len, #6
+               beq     .Lless8_byte
 
                /* we are now half-word aligned */
 
-.less8_wordlp:
+.Lless8_wordlp:
 #if __LINUX_ARM_ARCH__ >= 4
                ldrh    td0, [buf], #2
                sub     len, len, #2
@@ -65,19 +65,19 @@ td3 .req    lr
 #endif
                adcs    sum, sum, td0
                tst     len, #6
-               bne     .less8_wordlp
+               bne     .Lless8_wordlp
 
-.less8_byte:   tst     len, #1                 @ odd number of bytes
+.Lless8_byte:  tst     len, #1                 @ odd number of bytes
                ldrneb  td0, [buf], #1          @ include last byte
                adcnes  sum, sum, td0, put_byte_0       @ update checksum
 
-.done:         adc     r0, sum, #0             @ collect up the last carry
+.Ldone:                adc     r0, sum, #0             @ collect up the last carry
                ldr     td0, [sp], #4
                tst     td0, #1                 @ check buffer alignment
                movne   r0, r0, ror #8          @ rotate checksum by 8 bits
                ldr     pc, [sp], #4            @ return
 
-.not_aligned:  tst     buf, #1                 @ odd address
+.Lnot_aligned: tst     buf, #1                 @ odd address
                ldrneb  td0, [buf], #1          @ make even
                subne   len, len, #1
                adcnes  sum, sum, td0, put_byte_1       @ update checksum
@@ -102,14 +102,14 @@ td3       .req    lr
 ENTRY(csum_partial)
                stmfd   sp!, {buf, lr}
                cmp     len, #8                 @ Ensure that we have at least
-               blo     .less8                  @ 8 bytes to copy.
+               blo     .Lless8                 @ 8 bytes to copy.
 
                tst     buf, #1
                movne   sum, sum, ror #8
 
                adds    sum, sum, #0            @ C = 0
                tst     buf, #3                 @ Test destination alignment
-               blne    .not_aligned            @ aligh destination, return here
+               blne    .Lnot_aligned           @ align destination, return here
 
 1:             bics    ip, len, #31
                beq     3f
@@ -131,11 +131,11 @@ ENTRY(csum_partial)
                ldmfd   sp!, {r4 - r5}
 
 3:             tst     len, #0x1c              @ should not change C
-               beq     .less4
+               beq     .Lless4
 
 4:             ldr     td0, [buf], #4
                sub     len, len, #4
                adcs    sum, sum, td0
                tst     len, #0x1c
                bne     4b
-               b       .less4
+               b       .Lless4
index d3a2f4667db439db4e339a685e7db830ede56ddd..4a4609c19095f9188005e4e2e9b68d235008b079 100644 (file)
@@ -22,7 +22,7 @@ dst   .req    r1
 len    .req    r2
 sum    .req    r3
 
-.zero:         mov     r0, sum
+.Lzero:                mov     r0, sum
                load_regs       ea
 
                /*
@@ -31,8 +31,9 @@ sum   .req    r3
                 * the length.  Note that the source pointer hasn't been
                 * aligned yet.
                 */
-.dst_unaligned:        tst     dst, #1
-               beq     .dst_16bit
+.Ldst_unaligned:
+               tst     dst, #1
+               beq     .Ldst_16bit
 
                load1b  ip
                sub     len, len, #1
@@ -41,7 +42,7 @@ sum   .req    r3
                tst     dst, #2
                moveq   pc, lr                  @ dst is now 32bit aligned
 
-.dst_16bit:    load2b  r8, ip
+.Ldst_16bit:   load2b  r8, ip
                sub     len, len, #2
                adcs    sum, sum, r8, put_byte_0
                strb    r8, [dst], #1
@@ -53,12 +54,12 @@ sum .req    r3
                 * Handle 0 to 7 bytes, with any alignment of source and
                 * destination pointers.  Note that when we get here, C = 0
                 */
-.less8:                teq     len, #0                 @ check for zero count
-               beq     .zero
+.Lless8:       teq     len, #0                 @ check for zero count
+               beq     .Lzero
 
                /* we must have at least one byte. */
                tst     dst, #1                 @ dst 16-bit aligned
-               beq     .less8_aligned
+               beq     .Lless8_aligned
 
                /* Align dst */
                load1b  ip
@@ -66,7 +67,7 @@ sum   .req    r3
                adcs    sum, sum, ip, put_byte_1        @ update checksum
                strb    ip, [dst], #1
                tst     len, #6
-               beq     .less8_byteonly
+               beq     .Lless8_byteonly
 
 1:             load2b  r8, ip
                sub     len, len, #2
@@ -74,15 +75,16 @@ sum .req    r3
                strb    r8, [dst], #1
                adcs    sum, sum, ip, put_byte_1
                strb    ip, [dst], #1
-.less8_aligned:        tst     len, #6
+.Lless8_aligned:
+               tst     len, #6
                bne     1b
-.less8_byteonly:
+.Lless8_byteonly:
                tst     len, #1
-               beq     .done
+               beq     .Ldone
                load1b  r8
                adcs    sum, sum, r8, put_byte_0        @ update checksum
                strb    r8, [dst], #1
-               b       .done
+               b       .Ldone
 
 FN_ENTRY
                mov     ip, sp
@@ -90,11 +92,11 @@ FN_ENTRY
                sub     fp, ip, #4
 
                cmp     len, #8                 @ Ensure that we have at least
-               blo     .less8                  @ 8 bytes to copy.
+               blo     .Lless8                 @ 8 bytes to copy.
 
                adds    sum, sum, #0            @ C = 0
                tst     dst, #3                 @ Test destination alignment
-               blne    .dst_unaligned          @ align destination, return here
+               blne    .Ldst_unaligned         @ align destination, return here
 
                /*
                 * Ok, the dst pointer is now 32bit aligned, and we know
@@ -103,7 +105,7 @@ FN_ENTRY
                 */
 
                tst     src, #3                 @ Test source alignment
-               bne     .src_not_aligned
+               bne     .Lsrc_not_aligned
 
                /* Routine for src & dst aligned */
 
@@ -136,17 +138,17 @@ FN_ENTRY
                adcs    sum, sum, r4
 
 4:             ands    len, len, #3
-               beq     .done
+               beq     .Ldone
                load1l  r4
                tst     len, #2
                mov     r5, r4, get_byte_0
-               beq     .exit
+               beq     .Lexit
                adcs    sum, sum, r4, push #16
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_1
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_2
-.exit:         tst     len, #1
+.Lexit:                tst     len, #1
                strneb  r5, [dst], #1
                andne   r5, r5, #255
                adcnes  sum, sum, r5, put_byte_0
@@ -157,20 +159,20 @@ FN_ENTRY
                 * the inefficient byte manipulations in the
                 * architecture independent code.
                 */
-.done:         adc     r0, sum, #0
+.Ldone:                adc     r0, sum, #0
                ldr     sum, [sp, #0]           @ dst
                tst     sum, #1
                movne   r0, r0, ror #8
                load_regs       ea
 
-.src_not_aligned:
+.Lsrc_not_aligned:
                adc     sum, sum, #0            @ include C from dst alignment
                and     ip, src, #3
                bic     src, src, #3
                load1l  r5
                cmp     ip, #2
-               beq     .src2_aligned
-               bhi     .src3_aligned
+               beq     .Lsrc2_aligned
+               bhi     .Lsrc3_aligned
                mov     r4, r5, pull #8         @ C = 0
                bics    ip, len, #15
                beq     2f
@@ -211,18 +213,18 @@ FN_ENTRY
                adcs    sum, sum, r4
                mov     r4, r5, pull #8
 4:             ands    len, len, #3
-               beq     .done
+               beq     .Ldone
                mov     r5, r4, get_byte_0
                tst     len, #2
-               beq     .exit
+               beq     .Lexit
                adcs    sum, sum, r4, push #16
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_1
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_2
-               b       .exit
+               b       .Lexit
 
-.src2_aligned: mov     r4, r5, pull #16
+.Lsrc2_aligned:        mov     r4, r5, pull #16
                adds    sum, sum, #0
                bics    ip, len, #15
                beq     2f
@@ -263,20 +265,20 @@ FN_ENTRY
                adcs    sum, sum, r4
                mov     r4, r5, pull #16
 4:             ands    len, len, #3
-               beq     .done
+               beq     .Ldone
                mov     r5, r4, get_byte_0
                tst     len, #2
-               beq     .exit
+               beq     .Lexit
                adcs    sum, sum, r4
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_1
                strb    r5, [dst], #1
                tst     len, #1
-               beq     .done
+               beq     .Ldone
                load1b  r5
-               b       .exit
+               b       .Lexit
 
-.src3_aligned: mov     r4, r5, pull #24
+.Lsrc3_aligned:        mov     r4, r5, pull #24
                adds    sum, sum, #0
                bics    ip, len, #15
                beq     2f
@@ -317,10 +319,10 @@ FN_ENTRY
                adcs    sum, sum, r4
                mov     r4, r5, pull #24
 4:             ands    len, len, #3
-               beq     .done
+               beq     .Ldone
                mov     r5, r4, get_byte_0
                tst     len, #2
-               beq     .exit
+               beq     .Lexit
                strb    r5, [dst], #1
                adcs    sum, sum, r4
                load1l  r4
@@ -328,4 +330,4 @@ FN_ENTRY
                strb    r5, [dst], #1
                adcs    sum, sum, r4, push #24
                mov     r5, r4, get_byte_1
-               b       .exit
+               b       .Lexit
index 3c7f7e675dd8c777857ef10487b5c369c4e1d558..b3fb475b41202e987667813d5799c0dc8fc282ba 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm/assembler.h>
                .text
 
-LC0:           .word   loops_per_jiffy
+.LC0:          .word   loops_per_jiffy
 
 /*
  * 0 <= r0 <= 2000
@@ -21,7 +21,7 @@ ENTRY(__udelay)
                orr     r2, r2, #0x00db
                mul     r0, r2, r0
 ENTRY(__const_udelay)                          @ 0 <= r0 <= 0x01ffffff
-               ldr     r2, LC0
+               ldr     r2, .LC0
                ldr     r2, [r2]                @ max = 0x0fffffff
                mov     r0, r0, lsr #11         @ max = 0x00003fff
                mov     r2, r2, lsr #11         @ max = 0x0003ffff
index f055d56ea68a19c3181110539d9e8830de318c53..6f8e27a58c7804d7e3b903b15d0a2186aecb781c 100644 (file)
@@ -27,7 +27,7 @@ ENTRY(_find_first_zero_bit_le)
                mov     r2, #0
 1:             ldrb    r3, [r0, r2, lsr #3]
                eors    r3, r3, #0xff           @ invert bits
-               bne     .found                  @ any now set - found zero bit
+               bne     .L_found                @ any now set - found zero bit
                add     r2, r2, #8              @ next bit pointer
 2:             cmp     r2, r1                  @ any more?
                blo     1b
@@ -46,7 +46,7 @@ ENTRY(_find_next_zero_bit_le)
                ldrb    r3, [r0, r2, lsr #3]
                eor     r3, r3, #0xff           @ now looking for a 1 bit
                movs    r3, r3, lsr ip          @ shift off unused bits
-               bne     .found
+               bne     .L_found
                orr     r2, r2, #7              @ if zero, then no bits here
                add     r2, r2, #1              @ align bit pointer
                b       2b                      @ loop for next bit
@@ -61,7 +61,7 @@ ENTRY(_find_first_bit_le)
                mov     r2, #0
 1:             ldrb    r3, [r0, r2, lsr #3]
                movs    r3, r3
-               bne     .found                  @ any now set - found zero bit
+               bne     .L_found                @ any now set - found zero bit
                add     r2, r2, #8              @ next bit pointer
 2:             cmp     r2, r1                  @ any more?
                blo     1b
@@ -79,7 +79,7 @@ ENTRY(_find_next_bit_le)
                beq     1b                      @ If new byte, goto old routine
                ldrb    r3, [r0, r2, lsr #3]
                movs    r3, r3, lsr ip          @ shift off unused bits
-               bne     .found
+               bne     .L_found
                orr     r2, r2, #7              @ if zero, then no bits here
                add     r2, r2, #1              @ align bit pointer
                b       2b                      @ loop for next bit
@@ -93,7 +93,7 @@ ENTRY(_find_first_zero_bit_be)
 1:             eor     r3, r2, #0x18           @ big endian byte ordering
                ldrb    r3, [r0, r3, lsr #3]
                eors    r3, r3, #0xff           @ invert bits
-               bne     .found                  @ any now set - found zero bit
+               bne     .L_found                @ any now set - found zero bit
                add     r2, r2, #8              @ next bit pointer
 2:             cmp     r2, r1                  @ any more?
                blo     1b
@@ -109,7 +109,7 @@ ENTRY(_find_next_zero_bit_be)
                ldrb    r3, [r0, r3, lsr #3]
                eor     r3, r3, #0xff           @ now looking for a 1 bit
                movs    r3, r3, lsr ip          @ shift off unused bits
-               bne     .found
+               bne     .L_found
                orr     r2, r2, #7              @ if zero, then no bits here
                add     r2, r2, #1              @ align bit pointer
                b       2b                      @ loop for next bit
@@ -121,7 +121,7 @@ ENTRY(_find_first_bit_be)
 1:             eor     r3, r2, #0x18           @ big endian byte ordering
                ldrb    r3, [r0, r3, lsr #3]
                movs    r3, r3
-               bne     .found                  @ any now set - found zero bit
+               bne     .L_found                @ any now set - found zero bit
                add     r2, r2, #8              @ next bit pointer
 2:             cmp     r2, r1                  @ any more?
                blo     1b
@@ -136,7 +136,7 @@ ENTRY(_find_next_bit_be)
                eor     r3, r2, #0x18           @ big endian byte ordering
                ldrb    r3, [r0, r3, lsr #3]
                movs    r3, r3, lsr ip          @ shift off unused bits
-               bne     .found
+               bne     .L_found
                orr     r2, r2, #7              @ if zero, then no bits here
                add     r2, r2, #1              @ align bit pointer
                b       2b                      @ loop for next bit
@@ -146,7 +146,7 @@ ENTRY(_find_next_bit_be)
 /*
  * One or more bits in the LSB of r3 are assumed to be set.
  */
-.found:
+.L_found:
 #if __LINUX_ARM_ARCH__ >= 5
                rsb     r1, r3, #0
                and     r3, r3, r1
index 3aacd01d40e1ccd269d57c64922aac08597f3025..b153523631c3250c7dea4ec9c83090a1cc895a3a 100644 (file)
@@ -17,7 +17,7 @@
                .text
                .align
 
-.iosl_warning:
+.Liosl_warning:
                .ascii  "<4>insl/outsl not implemented, called from %08lX\0"
                .align
 
@@ -27,6 +27,6 @@
  */
 ENTRY(insl)
 ENTRY(outsl)
-               adr     r0, .iosl_warning
+               adr     r0, .Liosl_warning
                mov     r1, lr
                b       printk
index 081ef749298a1c7b4649631b5d9074f1886dbc5c..d3d8de71a2c8ac363899f968bfb5d37337dd3ac7 100644 (file)
@@ -10,7 +10,7 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 
-.insb_align:   rsb     ip, ip, #4
+.Linsb_align:  rsb     ip, ip, #4
                cmp     ip, r2
                movgt   ip, r2
                cmp     ip, #2
                ldrgtb  r3, [r0]
                strgtb  r3, [r1], #1
                subs    r2, r2, ip
-               bne     .insb_aligned
+               bne     .Linsb_aligned
 
 ENTRY(__raw_readsb)
                teq     r2, #0          @ do we have to check for the zero len?
                moveq   pc, lr
                ands    ip, r1, #3
-               bne     .insb_align
+               bne     .Linsb_align
 
-.insb_aligned: stmfd   sp!, {r4 - r6, lr}
+.Linsb_aligned:        stmfd   sp!, {r4 - r6, lr}
 
                subs    r2, r2, #16
-               bmi     .insb_no_16
+               bmi     .Linsb_no_16
 
-.insb_16_lp:   ldrb    r3, [r0]
+.Linsb_16_lp:  ldrb    r3, [r0]
                ldrb    r4, [r0]
                ldrb    r5, [r0]
                mov     r3, r3,     put_byte_0
@@ -69,13 +69,13 @@ ENTRY(__raw_readsb)
                stmia   r1!, {r3 - r6}
 
                subs    r2, r2, #16
-               bpl     .insb_16_lp
+               bpl     .Linsb_16_lp
 
                tst     r2, #15
                LOADREGS(eqfd, sp!, {r4 - r6, pc})
 
-.insb_no_16:   tst     r2, #8
-               beq     .insb_no_8
+.Linsb_no_16:  tst     r2, #8
+               beq     .Linsb_no_8
 
                ldrb    r3, [r0]
                ldrb    r4, [r0]
@@ -95,8 +95,8 @@ ENTRY(__raw_readsb)
                orr     r4, r4, ip, put_byte_3
                stmia   r1!, {r3, r4}
 
-.insb_no_8:    tst     r2, #4
-               beq     .insb_no_4
+.Linsb_no_8:   tst     r2, #4
+               beq     .Linsb_no_4
 
                ldrb    r3, [r0]
                ldrb    r4, [r0]
@@ -108,7 +108,7 @@ ENTRY(__raw_readsb)
                orr     r3, r3, r6, put_byte_3
                str     r3, [r1], #4
 
-.insb_no_4:    ands    r2, r2, #3
+.Linsb_no_4:   ands    r2, r2, #3
                LOADREGS(eqfd, sp!, {r4 - r6, pc})
 
                cmp     r2, #2
index 476cf7f8a633f7e48c70079cbc69c68c495617b7..146d47c154551801ff0624623163c6327b8d32f1 100644 (file)
 #include <asm/assembler.h>
 #include <asm/hardware.h>
 
-.insw_bad_alignment:
-               adr     r0, .insw_bad_align_msg
+.Linsw_bad_alignment:
+               adr     r0, .Linsw_bad_align_msg
                mov     r2, lr
                b       panic
-.insw_bad_align_msg:
+.Linsw_bad_align_msg:
                .asciz  "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
                .align
 
-.insw_align:   tst     r1, #1
-               bne     .insw_bad_alignment
+.Linsw_align:  tst     r1, #1
+               bne     .Linsw_bad_alignment
 
                ldr     r3, [r0]
                strb    r3, [r1], #1
@@ -34,16 +34,16 @@ ENTRY(__raw_readsw)
                teq     r2, #0          @ do we have to check for the zero len?
                moveq   pc, lr
                tst     r1, #3
-               bne     .insw_align
+               bne     .Linsw_align
 
-.insw_aligned: mov     ip, #0xff
+.Linsw_aligned:        mov     ip, #0xff
                orr     ip, ip, ip, lsl #8
                stmfd   sp!, {r4, r5, r6, lr}
 
                subs    r2, r2, #8
-               bmi     .no_insw_8
+               bmi     .Lno_insw_8
 
-.insw_8_lp:    ldr     r3, [r0]
+.Linsw_8_lp:   ldr     r3, [r0]
                and     r3, r3, ip
                ldr     r4, [r0]
                orr     r3, r3, r4, lsl #16
@@ -66,13 +66,13 @@ ENTRY(__raw_readsw)
                stmia   r1!, {r3 - r6}
 
                subs    r2, r2, #8
-               bpl     .insw_8_lp
+               bpl     .Linsw_8_lp
 
                tst     r2, #7
                LOADREGS(eqfd, sp!, {r4, r5, r6, pc})
 
-.no_insw_8:    tst     r2, #4
-               beq     .no_insw_4
+.Lno_insw_8:   tst     r2, #4
+               beq     .Lno_insw_4
 
                ldr     r3, [r0]
                and     r3, r3, ip
@@ -86,8 +86,8 @@ ENTRY(__raw_readsw)
 
                stmia   r1!, {r3, r4}
 
-.no_insw_4:    tst     r2, #2
-               beq     .no_insw_2
+.Lno_insw_4:   tst     r2, #2
+               beq     .Lno_insw_2
 
                ldr     r3, [r0]
                and     r3, r3, ip
@@ -96,7 +96,7 @@ ENTRY(__raw_readsw)
 
                str     r3, [r1], #4
 
-.no_insw_2:    tst     r2, #1
+.Lno_insw_2:   tst     r2, #1
                ldrne   r3, [r0]
                strneb  r3, [r1], #1
                movne   r3, r3, lsr #8
index c92b66ecbe863f3df21e69c482add5f8b23efd05..4db1c5f0b219c7b85022971a701b4fa7d7d1f04e 100644 (file)
@@ -18,8 +18,8 @@
 #endif
                .endm
 
-.insw_align:   movs    ip, r1, lsl #31
-               bne     .insw_noalign
+.Linsw_align:  movs    ip, r1, lsl #31
+               bne     .Linsw_noalign
                ldrh    ip, [r0]
                sub     r2, r2, #1
                strh    ip, [r1], #2
@@ -28,14 +28,14 @@ ENTRY(__raw_readsw)
                teq     r2, #0
                moveq   pc, lr
                tst     r1, #3
-               bne     .insw_align
+               bne     .Linsw_align
 
                stmfd   sp!, {r4, r5, lr}
 
                subs    r2, r2, #8
-               bmi     .no_insw_8
+               bmi     .Lno_insw_8
 
-.insw_8_lp:    ldrh    r3, [r0]
+.Linsw_8_lp:   ldrh    r3, [r0]
                ldrh    r4, [r0]
                pack    r3, r3, r4
 
@@ -53,10 +53,10 @@ ENTRY(__raw_readsw)
 
                subs    r2, r2, #8
                stmia   r1!, {r3 - r5, ip}
-               bpl     .insw_8_lp
+               bpl     .Linsw_8_lp
 
-.no_insw_8:    tst     r2, #4
-               beq     .no_insw_4
+.Lno_insw_8:   tst     r2, #4
+               beq     .Lno_insw_4
 
                ldrh    r3, [r0]
                ldrh    r4, [r0]
@@ -68,15 +68,15 @@ ENTRY(__raw_readsw)
 
                stmia   r1!, {r3, r4}
 
-.no_insw_4:    movs    r2, r2, lsl #31
-               bcc     .no_insw_2
+.Lno_insw_4:   movs    r2, r2, lsl #31
+               bcc     .Lno_insw_2
 
                ldrh    r3, [r0]
                ldrh    ip, [r0]
                pack    r3, r3, ip
                str     r3, [r1], #4
 
-.no_insw_2:    ldrneh  r3, [r0]
+.Lno_insw_2:   ldrneh  r3, [r0]
                strneh  r3, [r1]
 
                ldmfd   sp!, {r4, r5, pc}
@@ -93,7 +93,7 @@ ENTRY(__raw_readsw)
 #define pull_hbyte1            lsr #8
 #endif
 
-.insw_noalign: stmfd   sp!, {r4, lr}
+.Linsw_noalign:        stmfd   sp!, {r4, lr}
                ldrccb  ip, [r1, #-1]!
                bcc     1f
 
index 70b2561bdb09f8aceb87efd989518646a348406a..08209fc640eada9beef5d449ce790b45d43ffd3c 100644 (file)
@@ -30,7 +30,7 @@
 #endif
                .endm
 
-.outsb_align:  rsb     ip, ip, #4
+.Loutsb_align: rsb     ip, ip, #4
                cmp     ip, r2
                movgt   ip, r2
                cmp     ip, #2
                ldrgtb  r3, [r1], #1
                strgtb  r3, [r0]
                subs    r2, r2, ip
-               bne     .outsb_aligned
+               bne     .Loutsb_aligned
 
 ENTRY(__raw_writesb)
                teq     r2, #0          @ do we have to check for the zero len?
                moveq   pc, lr
                ands    ip, r1, #3
-               bne     .outsb_align
+               bne     .Loutsb_align
 
-.outsb_aligned:        stmfd   sp!, {r4, r5, lr}
+.Loutsb_aligned:
+               stmfd   sp!, {r4, r5, lr}
 
                subs    r2, r2, #16
-               bmi     .outsb_no_16
+               bmi     .Loutsb_no_16
 
-.outsb_16_lp:  ldmia   r1!, {r3, r4, r5, ip}
+.Loutsb_16_lp: ldmia   r1!, {r3, r4, r5, ip}
                outword r3
                outword r4
                outword r5
                outword ip
                subs    r2, r2, #16
-               bpl     .outsb_16_lp
+               bpl     .Loutsb_16_lp
 
                tst     r2, #15
                LOADREGS(eqfd, sp!, {r4, r5, pc})
 
-.outsb_no_16:  tst     r2, #8
-               beq     .outsb_no_8
+.Loutsb_no_16: tst     r2, #8
+               beq     .Loutsb_no_8
 
                ldmia   r1!, {r3, r4}
                outword r3
                outword r4
 
-.outsb_no_8:   tst     r2, #4
-               beq     .outsb_no_4
+.Loutsb_no_8:  tst     r2, #4
+               beq     .Loutsb_no_4
 
                ldr     r3, [r1], #4
                outword r3
 
-.outsb_no_4:   ands    r2, r2, #3
+.Loutsb_no_4:  ands    r2, r2, #3
                LOADREGS(eqfd, sp!, {r4, r5, pc})
 
                cmp     r2, #2
index 950e7e310f1a0db15c5ed45fdc53eb3409daa17a..52d62b4812958d49d308e64e5674ddb53bb89fd2 100644 (file)
 #include <asm/assembler.h>
 #include <asm/hardware.h>
 
-.outsw_bad_alignment:
-               adr     r0, .outsw_bad_align_msg
+.Loutsw_bad_alignment:
+               adr     r0, .Loutsw_bad_align_msg
                mov     r2, lr
                b       panic
-.outsw_bad_align_msg:
+.Loutsw_bad_align_msg:
                .asciz  "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
                .align
 
-.outsw_align:  tst     r1, #1
-               bne     .outsw_bad_alignment
+.Loutsw_align: tst     r1, #1
+               bne     .Loutsw_bad_alignment
 
                add     r1, r1, #2
 
@@ -35,14 +35,14 @@ ENTRY(__raw_writesw)
                teq     r2, #0          @ do we have to check for the zero len?
                moveq   pc, lr
                tst     r1, #3
-               bne     .outsw_align
+               bne     .Loutsw_align
 
-.outsw_aligned:        stmfd   sp!, {r4, r5, r6, lr}
+               stmfd   sp!, {r4, r5, r6, lr}
 
                subs    r2, r2, #8
-               bmi     .no_outsw_8
+               bmi     .Lno_outsw_8
 
-.outsw_8_lp:   ldmia   r1!, {r3, r4, r5, r6}
+.Loutsw_8_lp:  ldmia   r1!, {r3, r4, r5, r6}
 
                mov     ip, r3, lsl #16
                orr     ip, ip, ip, lsr #16
@@ -77,13 +77,13 @@ ENTRY(__raw_writesw)
                str     ip, [r0]
 
                subs    r2, r2, #8
-               bpl     .outsw_8_lp
+               bpl     .Loutsw_8_lp
 
                tst     r2, #7
                LOADREGS(eqfd, sp!, {r4, r5, r6, pc})
 
-.no_outsw_8:   tst     r2, #4
-               beq     .no_outsw_4
+.Lno_outsw_8:  tst     r2, #4
+               beq     .Lno_outsw_4
 
                ldmia   r1!, {r3, r4}
 
@@ -103,8 +103,8 @@ ENTRY(__raw_writesw)
                orr     ip, ip, ip, lsl #16
                str     ip, [r0]
 
-.no_outsw_4:   tst     r2, #2
-               beq     .no_outsw_2
+.Lno_outsw_4:  tst     r2, #2
+               beq     .Lno_outsw_2
 
                ldr     r3, [r1], #4
 
@@ -116,7 +116,7 @@ ENTRY(__raw_writesw)
                orr     ip, ip, ip, lsl #16
                str     ip, [r0]
 
-.no_outsw_2:   tst     r2, #1
+.Lno_outsw_2:  tst     r2, #1
 
                ldrne   r3, [r1]
 
index 5e240e452af6af66b2d9d18321009fddea82c73e..c8e85bd653b7aaa7b7cb8c30b0a90615390fd1ea 100644 (file)
@@ -22,8 +22,8 @@
 #endif
                .endm
 
-.outsw_align:  movs    ip, r1, lsl #31
-               bne     .outsw_noalign
+.Loutsw_align: movs    ip, r1, lsl #31
+               bne     .Loutsw_noalign
 
                ldrh    r3, [r1], #2
                sub     r2, r2, #1
@@ -33,35 +33,35 @@ ENTRY(__raw_writesw)
                teq     r2, #0
                moveq   pc, lr
                ands    r3, r1, #3
-               bne     .outsw_align
+               bne     .Loutsw_align
 
                stmfd   sp!, {r4, r5, lr}
 
                subs    r2, r2, #8
-               bmi     .no_outsw_8
+               bmi     .Lno_outsw_8
 
-.outsw_8_lp:   ldmia   r1!, {r3, r4, r5, ip}
+.Loutsw_8_lp:  ldmia   r1!, {r3, r4, r5, ip}
                subs    r2, r2, #8
                outword r3
                outword r4
                outword r5
                outword ip
-               bpl     .outsw_8_lp
+               bpl     .Loutsw_8_lp
 
-.no_outsw_8:   tst     r2, #4
-               beq     .no_outsw_4
+.Lno_outsw_8:  tst     r2, #4
+               beq     .Lno_outsw_4
 
                ldmia   r1!, {r3, ip}
                outword r3
                outword ip
 
-.no_outsw_4:   movs    r2, r2, lsl #31
-               bcc     .no_outsw_2
+.Lno_outsw_4:  movs    r2, r2, lsl #31
+               bcc     .Lno_outsw_2
 
                ldr     r3, [r1], #4
                outword r3
 
-.no_outsw_2:   ldrneh  r3, [r1]
+.Lno_outsw_2:  ldrneh  r3, [r1]
                strneh  r3, [r0]
 
                ldmfd   sp!, {r4, r5, pc}
@@ -74,7 +74,8 @@ ENTRY(__raw_writesw)
 #define push_hbyte1    lsl #8
 #endif
 
-.outsw_noalign:        ldr     r3, [r1, -r3]!
+.Loutsw_noalign:
+               ldr     r3, [r1, -r3]!
                subcs   r2, r2, #1
                bcs     2f
                subs    r2, r2, #2
index 6f1b5b49fe4c877851aec5ab7e4a515d4e9ba334..0cc450f863b6ba9e5e340deae6f83bb3d394746f 100644 (file)
@@ -27,7 +27,7 @@
  * Returns  : Number of bytes NOT copied.
  */
 
-.c2u_dest_not_aligned:
+.Lc2u_dest_not_aligned:
                rsb     ip, ip, #4
                cmp     ip, #2
                ldrb    r3, [r1], #1
@@ -37,32 +37,32 @@ USER(               strgebt r3, [r0], #1)                   @ May fault
                ldrgtb  r3, [r1], #1
 USER(          strgtbt r3, [r0], #1)                   @ May fault
                sub     r2, r2, ip
-               b       .c2u_dest_aligned
+               b       .Lc2u_dest_aligned
 
 ENTRY(__arch_copy_to_user)
                stmfd   sp!, {r2, r4 - r7, lr}
                cmp     r2, #4
-               blt     .c2u_not_enough
+               blt     .Lc2u_not_enough
                ands    ip, r0, #3
-               bne     .c2u_dest_not_aligned
-.c2u_dest_aligned:
+               bne     .Lc2u_dest_not_aligned
+.Lc2u_dest_aligned:
 
                ands    ip, r1, #3
-               bne     .c2u_src_not_aligned
+               bne     .Lc2u_src_not_aligned
 /*
  * Seeing as there has to be at least 8 bytes to copy, we can
  * copy one word, and force a user-mode page fault...
  */
 
-.c2u_0fupi:    subs    r2, r2, #4
+.Lc2u_0fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .c2u_0nowords
+               bmi     .Lc2u_0nowords
                ldr     r3, [r1], #4
 USER(          strt    r3, [r0], #4)                   @ May fault
                mov     ip, r0, lsl #32 - PAGE_SHIFT    @ On each page, use a ld/st??t instruction
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .c2u_0fupi
+               beq     .Lc2u_0fupi
 /*
  * ip = max no. of bytes to copy before needing another "strt" insn
  */
@@ -70,16 +70,16 @@ USER(               strt    r3, [r0], #4)                   @ May fault
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #32
-               blt     .c2u_0rem8lp
+               blt     .Lc2u_0rem8lp
 
-.c2u_0cpy8lp:  ldmia   r1!, {r3 - r6}
+.Lc2u_0cpy8lp: ldmia   r1!, {r3 - r6}
                stmia   r0!, {r3 - r6}                  @ Shouldnt fault
                ldmia   r1!, {r3 - r6}
                subs    ip, ip, #32
                stmia   r0!, {r3 - r6}                  @ Shouldnt fault
-               bpl     .c2u_0cpy8lp
+               bpl     .Lc2u_0cpy8lp
 
-.c2u_0rem8lp:  cmn     ip, #16
+.Lc2u_0rem8lp: cmn     ip, #16
                ldmgeia r1!, {r3 - r6}
                stmgeia r0!, {r3 - r6}                  @ Shouldnt fault
                tst     ip, #8
@@ -89,33 +89,33 @@ USER(               strt    r3, [r0], #4)                   @ May fault
                ldrne   r3, [r1], #4
                strnet  r3, [r0], #4                    @ Shouldnt fault
                ands    ip, ip, #3
-               beq     .c2u_0fupi
-.c2u_0nowords: teq     ip, #0
-               beq     .c2u_finished
-.c2u_nowords:  cmp     ip, #2
+               beq     .Lc2u_0fupi
+.Lc2u_0nowords:        teq     ip, #0
+               beq     .Lc2u_finished
+.Lc2u_nowords: cmp     ip, #2
                ldrb    r3, [r1], #1
 USER(          strbt   r3, [r0], #1)                   @ May fault
                ldrgeb  r3, [r1], #1
 USER(          strgebt r3, [r0], #1)                   @ May fault
                ldrgtb  r3, [r1], #1
 USER(          strgtbt r3, [r0], #1)                   @ May fault
-               b       .c2u_finished
+               b       .Lc2u_finished
 
-.c2u_not_enough:
+.Lc2u_not_enough:
                movs    ip, r2
-               bne     .c2u_nowords
-.c2u_finished: mov     r0, #0
+               bne     .Lc2u_nowords
+.Lc2u_finished:        mov     r0, #0
                LOADREGS(fd,sp!,{r2, r4 - r7, pc})
 
-.c2u_src_not_aligned:
+.Lc2u_src_not_aligned:
                bic     r1, r1, #3
                ldr     r7, [r1], #4
                cmp     ip, #2
-               bgt     .c2u_3fupi
-               beq     .c2u_2fupi
-.c2u_1fupi:    subs    r2, r2, #4
+               bgt     .Lc2u_3fupi
+               beq     .Lc2u_2fupi
+.Lc2u_1fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .c2u_1nowords
+               bmi     .Lc2u_1nowords
                mov     r3, r7, pull #8
                ldr     r7, [r1], #4
                orr     r3, r3, r7, push #24
@@ -123,14 +123,14 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                mov     ip, r0, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .c2u_1fupi
+               beq     .Lc2u_1fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .c2u_1rem8lp
+               blt     .Lc2u_1rem8lp
 
-.c2u_1cpy8lp:  mov     r3, r7, pull #8
+.Lc2u_1cpy8lp: mov     r3, r7, pull #8
                ldmia   r1!, {r4 - r7}
                subs    ip, ip, #16
                orr     r3, r3, r4, push #24
@@ -141,9 +141,9 @@ USER(               strt    r3, [r0], #4)                   @ May fault
                mov     r6, r6, pull #8
                orr     r6, r6, r7, push #24
                stmia   r0!, {r3 - r6}                  @ Shouldnt fault
-               bpl     .c2u_1cpy8lp
+               bpl     .Lc2u_1cpy8lp
 
-.c2u_1rem8lp:  tst     ip, #8
+.Lc2u_1rem8lp: tst     ip, #8
                movne   r3, r7, pull #8
                ldmneia r1!, {r4, r7}
                orrne   r3, r3, r4, push #24
@@ -156,21 +156,21 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                orrne   r3, r3, r7, push #24
                strnet  r3, [r0], #4                    @ Shouldnt fault
                ands    ip, ip, #3
-               beq     .c2u_1fupi
-.c2u_1nowords: mov     r3, r7, get_byte_1
+               beq     .Lc2u_1fupi
+.Lc2u_1nowords:        mov     r3, r7, get_byte_1
                teq     ip, #0
-               beq     .c2u_finished
+               beq     .Lc2u_finished
                cmp     ip, #2
 USER(          strbt   r3, [r0], #1)                   @ May fault
                movge   r3, r7, get_byte_2
 USER(          strgebt r3, [r0], #1)                   @ May fault
                movgt   r3, r7, get_byte_3
 USER(          strgtbt r3, [r0], #1)                   @ May fault
-               b       .c2u_finished
+               b       .Lc2u_finished
 
-.c2u_2fupi:    subs    r2, r2, #4
+.Lc2u_2fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .c2u_2nowords
+               bmi     .Lc2u_2nowords
                mov     r3, r7, pull #16
                ldr     r7, [r1], #4
                orr     r3, r3, r7, push #16
@@ -178,14 +178,14 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                mov     ip, r0, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .c2u_2fupi
+               beq     .Lc2u_2fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .c2u_2rem8lp
+               blt     .Lc2u_2rem8lp
 
-.c2u_2cpy8lp:  mov     r3, r7, pull #16
+.Lc2u_2cpy8lp: mov     r3, r7, pull #16
                ldmia   r1!, {r4 - r7}
                subs    ip, ip, #16
                orr     r3, r3, r4, push #16
@@ -196,9 +196,9 @@ USER(               strt    r3, [r0], #4)                   @ May fault
                mov     r6, r6, pull #16
                orr     r6, r6, r7, push #16
                stmia   r0!, {r3 - r6}                  @ Shouldnt fault
-               bpl     .c2u_2cpy8lp
+               bpl     .Lc2u_2cpy8lp
 
-.c2u_2rem8lp:  tst     ip, #8
+.Lc2u_2rem8lp: tst     ip, #8
                movne   r3, r7, pull #16
                ldmneia r1!, {r4, r7}
                orrne   r3, r3, r4, push #16
@@ -211,21 +211,21 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                orrne   r3, r3, r7, push #16
                strnet  r3, [r0], #4                    @ Shouldnt fault
                ands    ip, ip, #3
-               beq     .c2u_2fupi
-.c2u_2nowords: mov     r3, r7, get_byte_2
+               beq     .Lc2u_2fupi
+.Lc2u_2nowords:        mov     r3, r7, get_byte_2
                teq     ip, #0
-               beq     .c2u_finished
+               beq     .Lc2u_finished
                cmp     ip, #2
 USER(          strbt   r3, [r0], #1)                   @ May fault
                movge   r3, r7, get_byte_3
 USER(          strgebt r3, [r0], #1)                   @ May fault
                ldrgtb  r3, [r1], #0
 USER(          strgtbt r3, [r0], #1)                   @ May fault
-               b       .c2u_finished
+               b       .Lc2u_finished
 
-.c2u_3fupi:    subs    r2, r2, #4
+.Lc2u_3fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .c2u_3nowords
+               bmi     .Lc2u_3nowords
                mov     r3, r7, pull #24
                ldr     r7, [r1], #4
                orr     r3, r3, r7, push #8
@@ -233,14 +233,14 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                mov     ip, r0, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .c2u_3fupi
+               beq     .Lc2u_3fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .c2u_3rem8lp
+               blt     .Lc2u_3rem8lp
 
-.c2u_3cpy8lp:  mov     r3, r7, pull #24
+.Lc2u_3cpy8lp: mov     r3, r7, pull #24
                ldmia   r1!, {r4 - r7}
                subs    ip, ip, #16
                orr     r3, r3, r4, push #8
@@ -251,9 +251,9 @@ USER(               strt    r3, [r0], #4)                   @ May fault
                mov     r6, r6, pull #24
                orr     r6, r6, r7, push #8
                stmia   r0!, {r3 - r6}                  @ Shouldnt fault
-               bpl     .c2u_3cpy8lp
+               bpl     .Lc2u_3cpy8lp
 
-.c2u_3rem8lp:  tst     ip, #8
+.Lc2u_3rem8lp: tst     ip, #8
                movne   r3, r7, pull #24
                ldmneia r1!, {r4, r7}
                orrne   r3, r3, r4, push #8
@@ -266,17 +266,17 @@ USER(             strt    r3, [r0], #4)                   @ May fault
                orrne   r3, r3, r7, push #8
                strnet  r3, [r0], #4                    @ Shouldnt fault
                ands    ip, ip, #3
-               beq     .c2u_3fupi
-.c2u_3nowords: mov     r3, r7, get_byte_3
+               beq     .Lc2u_3fupi
+.Lc2u_3nowords:        mov     r3, r7, get_byte_3
                teq     ip, #0
-               beq     .c2u_finished
+               beq     .Lc2u_finished
                cmp     ip, #2
 USER(          strbt   r3, [r0], #1)                   @ May fault
                ldrgeb  r3, [r1], #1
 USER(          strgebt r3, [r0], #1)                   @ May fault
                ldrgtb  r3, [r1], #0
 USER(          strgtbt r3, [r0], #1)                   @ May fault
-               b       .c2u_finished
+               b       .Lc2u_finished
 
                .section .fixup,"ax"
                .align  0
@@ -290,7 +290,7 @@ USER(               strgtbt r3, [r0], #1)                   @ May fault
  *          : n    - number of bytes to copy
  * Returns  : Number of bytes NOT copied.
  */
-.cfu_dest_not_aligned:
+.Lcfu_dest_not_aligned:
                rsb     ip, ip, #4
                cmp     ip, #2
 USER(          ldrbt   r3, [r1], #1)                   @ May fault
@@ -300,31 +300,32 @@ USER(             ldrgebt r3, [r1], #1)                   @ May fault
 USER(          ldrgtbt r3, [r1], #1)                   @ May fault
                strgtb  r3, [r0], #1
                sub     r2, r2, ip
-               b       .cfu_dest_aligned
+               b       .Lcfu_dest_aligned
 
 ENTRY(__arch_copy_from_user)
                stmfd   sp!, {r0, r2, r4 - r7, lr}
                cmp     r2, #4
-               blt     .cfu_not_enough
+               blt     .Lcfu_not_enough
                ands    ip, r0, #3
-               bne     .cfu_dest_not_aligned
-.cfu_dest_aligned:
+               bne     .Lcfu_dest_not_aligned
+.Lcfu_dest_aligned:
                ands    ip, r1, #3
-               bne     .cfu_src_not_aligned
+               bne     .Lcfu_src_not_aligned
+
 /*
  * Seeing as there has to be at least 8 bytes to copy, we can
  * copy one word, and force a user-mode page fault...
  */
 
-.cfu_0fupi:    subs    r2, r2, #4
+.Lcfu_0fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .cfu_0nowords
+               bmi     .Lcfu_0nowords
 USER(          ldrt    r3, [r1], #4)
                str     r3, [r0], #4
                mov     ip, r1, lsl #32 - PAGE_SHIFT    @ On each page, use a ld/st??t instruction
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .cfu_0fupi
+               beq     .Lcfu_0fupi
 /*
  * ip = max no. of bytes to copy before needing another "strt" insn
  */
@@ -332,16 +333,16 @@ USER(             ldrt    r3, [r1], #4)
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #32
-               blt     .cfu_0rem8lp
+               blt     .Lcfu_0rem8lp
 
-.cfu_0cpy8lp:  ldmia   r1!, {r3 - r6}                  @ Shouldnt fault
+.Lcfu_0cpy8lp: ldmia   r1!, {r3 - r6}                  @ Shouldnt fault
                stmia   r0!, {r3 - r6}
                ldmia   r1!, {r3 - r6}                  @ Shouldnt fault
                subs    ip, ip, #32
                stmia   r0!, {r3 - r6}
-               bpl     .cfu_0cpy8lp
+               bpl     .Lcfu_0cpy8lp
 
-.cfu_0rem8lp:  cmn     ip, #16
+.Lcfu_0rem8lp: cmn     ip, #16
                ldmgeia r1!, {r3 - r6}                  @ Shouldnt fault
                stmgeia r0!, {r3 - r6}
                tst     ip, #8
@@ -351,34 +352,34 @@ USER(             ldrt    r3, [r1], #4)
                ldrnet  r3, [r1], #4                    @ Shouldnt fault
                strne   r3, [r0], #4
                ands    ip, ip, #3
-               beq     .cfu_0fupi
-.cfu_0nowords: teq     ip, #0
-               beq     .cfu_finished
-.cfu_nowords:  cmp     ip, #2
+               beq     .Lcfu_0fupi
+.Lcfu_0nowords:        teq     ip, #0
+               beq     .Lcfu_finished
+.Lcfu_nowords: cmp     ip, #2
 USER(          ldrbt   r3, [r1], #1)                   @ May fault
                strb    r3, [r0], #1
 USER(          ldrgebt r3, [r1], #1)                   @ May fault
                strgeb  r3, [r0], #1
 USER(          ldrgtbt r3, [r1], #1)                   @ May fault
                strgtb  r3, [r0], #1
-               b       .cfu_finished
+               b       .Lcfu_finished
 
-.cfu_not_enough:
+.Lcfu_not_enough:
                movs    ip, r2
-               bne     .cfu_nowords
-.cfu_finished: mov     r0, #0
+               bne     .Lcfu_nowords
+.Lcfu_finished:        mov     r0, #0
                add     sp, sp, #8
                LOADREGS(fd,sp!,{r4 - r7, pc})
 
-.cfu_src_not_aligned:
+.Lcfu_src_not_aligned:
                bic     r1, r1, #3
 USER(          ldrt    r7, [r1], #4)                   @ May fault
                cmp     ip, #2
-               bgt     .cfu_3fupi
-               beq     .cfu_2fupi
-.cfu_1fupi:    subs    r2, r2, #4
+               bgt     .Lcfu_3fupi
+               beq     .Lcfu_2fupi
+.Lcfu_1fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .cfu_1nowords
+               bmi     .Lcfu_1nowords
                mov     r3, r7, pull #8
 USER(          ldrt    r7, [r1], #4)                   @ May fault
                orr     r3, r3, r7, push #24
@@ -386,14 +387,14 @@ USER(             ldrt    r7, [r1], #4)                   @ May fault
                mov     ip, r1, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .cfu_1fupi
+               beq     .Lcfu_1fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .cfu_1rem8lp
+               blt     .Lcfu_1rem8lp
 
-.cfu_1cpy8lp:  mov     r3, r7, pull #8
+.Lcfu_1cpy8lp: mov     r3, r7, pull #8
                ldmia   r1!, {r4 - r7}                  @ Shouldnt fault
                subs    ip, ip, #16
                orr     r3, r3, r4, push #24
@@ -404,9 +405,9 @@ USER(               ldrt    r7, [r1], #4)                   @ May fault
                mov     r6, r6, pull #8
                orr     r6, r6, r7, push #24
                stmia   r0!, {r3 - r6}
-               bpl     .cfu_1cpy8lp
+               bpl     .Lcfu_1cpy8lp
 
-.cfu_1rem8lp:  tst     ip, #8
+.Lcfu_1rem8lp: tst     ip, #8
                movne   r3, r7, pull #8
                ldmneia r1!, {r4, r7}                   @ Shouldnt fault
                orrne   r3, r3, r4, push #24
@@ -419,21 +420,21 @@ USER(             ldrnet  r7, [r1], #4)                   @ May fault
                orrne   r3, r3, r7, push #24
                strne   r3, [r0], #4
                ands    ip, ip, #3
-               beq     .cfu_1fupi
-.cfu_1nowords: mov     r3, r7, get_byte_1
+               beq     .Lcfu_1fupi
+.Lcfu_1nowords:        mov     r3, r7, get_byte_1
                teq     ip, #0
-               beq     .cfu_finished
+               beq     .Lcfu_finished
                cmp     ip, #2
                strb    r3, [r0], #1
                movge   r3, r7, get_byte_2
                strgeb  r3, [r0], #1
                movgt   r3, r7, get_byte_3
                strgtb  r3, [r0], #1
-               b       .cfu_finished
+               b       .Lcfu_finished
 
-.cfu_2fupi:    subs    r2, r2, #4
+.Lcfu_2fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .cfu_2nowords
+               bmi     .Lcfu_2nowords
                mov     r3, r7, pull #16
 USER(          ldrt    r7, [r1], #4)                   @ May fault
                orr     r3, r3, r7, push #16
@@ -441,14 +442,15 @@ USER(             ldrt    r7, [r1], #4)                   @ May fault
                mov     ip, r1, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .cfu_2fupi
+               beq     .Lcfu_2fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .cfu_2rem8lp
+               blt     .Lcfu_2rem8lp
+
 
-.cfu_2cpy8lp:  mov     r3, r7, pull #16
+.Lcfu_2cpy8lp: mov     r3, r7, pull #16
                ldmia   r1!, {r4 - r7}                  @ Shouldnt fault
                subs    ip, ip, #16
                orr     r3, r3, r4, push #16
@@ -459,9 +461,9 @@ USER(               ldrt    r7, [r1], #4)                   @ May fault
                mov     r6, r6, pull #16
                orr     r6, r6, r7, push #16
                stmia   r0!, {r3 - r6}
-               bpl     .cfu_2cpy8lp
+               bpl     .Lcfu_2cpy8lp
 
-.cfu_2rem8lp:  tst     ip, #8
+.Lcfu_2rem8lp: tst     ip, #8
                movne   r3, r7, pull #16
                ldmneia r1!, {r4, r7}                   @ Shouldnt fault
                orrne   r3, r3, r4, push #16
@@ -474,21 +476,21 @@ USER(             ldrnet  r7, [r1], #4)                   @ May fault
                orrne   r3, r3, r7, push #16
                strne   r3, [r0], #4
                ands    ip, ip, #3
-               beq     .cfu_2fupi
-.cfu_2nowords: mov     r3, r7, get_byte_2
+               beq     .Lcfu_2fupi
+.Lcfu_2nowords:        mov     r3, r7, get_byte_2
                teq     ip, #0
-               beq     .cfu_finished
+               beq     .Lcfu_finished
                cmp     ip, #2
                strb    r3, [r0], #1
                movge   r3, r7, get_byte_3
                strgeb  r3, [r0], #1
 USER(          ldrgtbt r3, [r1], #0)                   @ May fault
                strgtb  r3, [r0], #1
-               b       .cfu_finished
+               b       .Lcfu_finished
 
-.cfu_3fupi:    subs    r2, r2, #4
+.Lcfu_3fupi:   subs    r2, r2, #4
                addmi   ip, r2, #4
-               bmi     .cfu_3nowords
+               bmi     .Lcfu_3nowords
                mov     r3, r7, pull #24
 USER(          ldrt    r7, [r1], #4)                   @ May fault
                orr     r3, r3, r7, push #8
@@ -496,14 +498,14 @@ USER(             ldrt    r7, [r1], #4)                   @ May fault
                mov     ip, r1, lsl #32 - PAGE_SHIFT
                rsb     ip, ip, #0
                movs    ip, ip, lsr #32 - PAGE_SHIFT
-               beq     .cfu_3fupi
+               beq     .Lcfu_3fupi
                cmp     r2, ip
                movlt   ip, r2
                sub     r2, r2, ip
                subs    ip, ip, #16
-               blt     .cfu_3rem8lp
+               blt     .Lcfu_3rem8lp
 
-.cfu_3cpy8lp:  mov     r3, r7, pull #24
+.Lcfu_3cpy8lp: mov     r3, r7, pull #24
                ldmia   r1!, {r4 - r7}                  @ Shouldnt fault
                orr     r3, r3, r4, push #8
                mov     r4, r4, pull #24
@@ -514,9 +516,9 @@ USER(               ldrt    r7, [r1], #4)                   @ May fault
                orr     r6, r6, r7, push #8
                stmia   r0!, {r3 - r6}
                subs    ip, ip, #16
-               bpl     .cfu_3cpy8lp
+               bpl     .Lcfu_3cpy8lp
 
-.cfu_3rem8lp:  tst     ip, #8
+.Lcfu_3rem8lp: tst     ip, #8
                movne   r3, r7, pull #24
                ldmneia r1!, {r4, r7}                   @ Shouldnt fault
                orrne   r3, r3, r4, push #8
@@ -529,17 +531,17 @@ USER(             ldrnet  r7, [r1], #4)                   @ May fault
                orrne   r3, r3, r7, push #8
                strne   r3, [r0], #4
                ands    ip, ip, #3
-               beq     .cfu_3fupi
-.cfu_3nowords: mov     r3, r7, get_byte_3
+               beq     .Lcfu_3fupi
+.Lcfu_3nowords:        mov     r3, r7, get_byte_3
                teq     ip, #0
-               beq     .cfu_finished
+               beq     .Lcfu_finished
                cmp     ip, #2
                strb    r3, [r0], #1
 USER(          ldrgebt r3, [r1], #1)                   @ May fault
                strgeb  r3, [r0], #1
 USER(          ldrgtbt r3, [r1], #1)                   @ May fault
                strgtb  r3, [r0], #1
-               b       .cfu_finished
+               b       .Lcfu_finished
 
                .section .fixup,"ax"
                .align  0
index dc09fd200c164543f87f26bb665aa492f3650e65..bbe6e4a0bf6ab0457defaa8e990466ca3af282cd 100644 (file)
@@ -132,14 +132,14 @@ void __init footbridge_init_irq(void)
 static struct map_desc fb_common_io_desc[] __initdata = {
        {
                .virtual        = ARMCSR_BASE,
-               .pfn            = DC21285_ARMCSR_BASE,
+               .pfn            = __phys_to_pfn(DC21285_ARMCSR_BASE),
                .length         = ARMCSR_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = XBUS_BASE,
                .pfn            = __phys_to_pfn(0x40000000),
                .length         = XBUS_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }
 };
 
@@ -153,28 +153,28 @@ static struct map_desc ebsa285_host_io_desc[] __initdata = {
                .virtual        = PCIMEM_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_MEM),
                .length         = PCIMEM_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = PCICFG0_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG),
                .length         = PCICFG0_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = PCICFG1_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG),
                .length         = PCICFG1_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = PCIIACK_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_IACK),
                .length         = PCIIACK_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = PCIO_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_IO),
                .length         = PCIO_SIZE,
-               .type           = MT_DEVICE
-       }
+               .type           = MT_DEVICE,
+       },
 #endif
 };
 
@@ -187,13 +187,13 @@ static struct map_desc co285_io_desc[] __initdata = {
                .virtual        = PCIO_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_IO),
                .length         = PCIO_SIZE,
-               .type           = MT_DEVICE
+               .type           = MT_DEVICE,
        }, {
                .virtual        = PCIMEM_BASE,
                .pfn            = __phys_to_pfn(DC21285_PCI_MEM),
                .length         = PCIMEM_SIZE,
-               .type           = MT_DEVICE
-       }
+               .type           = MT_DEVICE,
+       },
 #endif
 };
 
index e201aa9765b9c0bc8ee15e87d45bd80393a4075d..cd506646801a4d576dad1de3f4f08b613534843c 100644 (file)
@@ -72,6 +72,12 @@ config MACH_HUSKY
        depends PXA_SHARPSL_25x
        select PXA_SHARP_C7xx
 
+config MACH_AKITA
+       bool "Enable Sharp SL-1000 (Akita) Support"
+       depends PXA_SHARPSL_27x
+       select PXA_SHARP_Cxx00
+       select MACH_SPITZ
+
 config MACH_SPITZ
        bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
        depends PXA_SHARPSL_27x
index d210bd5032ced956d0eed5da63e2be025e857d15..32526a0a6f861241089db559937b579e49d18960 100644 (file)
@@ -11,8 +11,9 @@ obj-$(CONFIG_PXA27x) += pxa27x.o
 obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o
 obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o
 obj-$(CONFIG_ARCH_PXA_IDP) += idp.o
-obj-$(CONFIG_PXA_SHARP_C7xx)   += corgi.o corgi_ssp.o corgi_lcd.o
-obj-$(CONFIG_PXA_SHARP_Cxx00)  += spitz.o corgi_ssp.o corgi_lcd.o
+obj-$(CONFIG_PXA_SHARP_C7xx)   += corgi.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o corgi_pm.o
+obj-$(CONFIG_PXA_SHARP_Cxx00)  += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o
+obj-$(CONFIG_MACH_AKITA)       += akita-ioexp.o
 obj-$(CONFIG_MACH_POODLE)      += poodle.o
 obj-$(CONFIG_MACH_TOSA)         += tosa.o
 
diff --git a/arch/arm/mach-pxa/akita-ioexp.c b/arch/arm/mach-pxa/akita-ioexp.c
new file mode 100644 (file)
index 0000000..f6d73cc
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Support for the Extra GPIOs on the Sharp SL-C1000 (Akita)
+ * (uses a Maxim MAX7310 8 Port IO Expander)
+ *
+ * Copyright 2005 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <richard@openedhand.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+#include <asm/arch/akita.h>
+
+/* MAX7310 Regiser Map */
+#define MAX7310_INPUT    0x00
+#define MAX7310_OUTPUT   0x01
+#define MAX7310_POLINV   0x02
+#define MAX7310_IODIR    0x03 /* 1 = Input, 0 = Output */
+#define MAX7310_TIMEOUT  0x04
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = { 0x18, I2C_CLIENT_END };
+
+/* I2C Magic */
+I2C_CLIENT_INSMOD;
+
+static int max7310_write(struct i2c_client *client, int address, int data);
+static struct i2c_client max7310_template;
+static void akita_ioexp_work(void *private_);
+
+static struct device *akita_ioexp_device;
+static unsigned char ioexp_output_value = AKITA_IOEXP_IO_OUT;
+DECLARE_WORK(akita_ioexp, akita_ioexp_work, NULL);
+
+
+/*
+ * MAX7310 Access
+ */
+static int max7310_config(struct device *dev, int iomode, int polarity)
+{
+       int ret;
+       struct i2c_client *client = to_i2c_client(dev);
+
+       ret = max7310_write(client, MAX7310_POLINV, polarity);
+       if (ret < 0)
+               return ret;
+       ret = max7310_write(client, MAX7310_IODIR, iomode);
+       return ret;
+}
+
+static int max7310_set_ouputs(struct device *dev, int outputs)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+
+       return max7310_write(client, MAX7310_OUTPUT, outputs);
+}
+
+/*
+ * I2C Functions
+ */
+static int max7310_write(struct i2c_client *client, int address, int value)
+{
+       u8 data[2];
+
+       data[0] = address & 0xff;
+       data[1] = value & 0xff;
+
+       if (i2c_master_send(client, data, 2) == 2)
+               return 0;
+       return -1;
+}
+
+static int max7310_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+       struct i2c_client *new_client;
+       int err;
+
+       if (!(new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)))
+               return -ENOMEM;
+
+       max7310_template.adapter = adapter;
+       max7310_template.addr = address;
+
+       memcpy(new_client, &max7310_template, sizeof(struct i2c_client));
+
+       if ((err = i2c_attach_client(new_client))) {
+               kfree(new_client);
+               return err;
+       }
+
+       max7310_config(&new_client->dev, AKITA_IOEXP_IO_DIR, 0);
+       akita_ioexp_device = &new_client->dev;
+       schedule_work(&akita_ioexp);
+
+       return 0;
+}
+
+static int max7310_attach_adapter(struct i2c_adapter *adapter)
+{
+       return i2c_probe(adapter, &addr_data, max7310_detect);
+}
+
+static int max7310_detach_client(struct i2c_client *client)
+{
+       int err;
+
+       akita_ioexp_device = NULL;
+
+       if ((err = i2c_detach_client(client)))
+               return err;
+
+       kfree(client);
+       return 0;
+}
+
+static struct i2c_driver max7310_i2c_driver = {
+       .owner          = THIS_MODULE,
+       .name           = "akita-max7310",
+       .id             = I2C_DRIVERID_AKITAIOEXP,
+       .flags          = I2C_DF_NOTIFY,
+       .attach_adapter = max7310_attach_adapter,
+       .detach_client  = max7310_detach_client,
+};
+
+static struct i2c_client max7310_template = {
+       name:   "akita-max7310",
+       flags:  I2C_CLIENT_ALLOW_USE,
+       driver: &max7310_i2c_driver,
+};
+
+void akita_set_ioexp(struct device *dev, unsigned char bit)
+{
+       ioexp_output_value |= bit;
+
+       if (akita_ioexp_device)
+               schedule_work(&akita_ioexp);
+       return;
+}
+
+void akita_reset_ioexp(struct device *dev, unsigned char bit)
+{
+       ioexp_output_value &= ~bit;
+
+       if (akita_ioexp_device)
+               schedule_work(&akita_ioexp);
+       return;
+}
+
+EXPORT_SYMBOL(akita_set_ioexp);
+EXPORT_SYMBOL(akita_reset_ioexp);
+
+static void akita_ioexp_work(void *private_)
+{
+       if (akita_ioexp_device)
+               max7310_set_ouputs(akita_ioexp_device, ioexp_output_value);
+}
+
+
+#ifdef CONFIG_PM
+static int akita_ioexp_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       flush_scheduled_work();
+       return 0;
+}
+
+static int akita_ioexp_resume(struct platform_device *pdev)
+{
+       schedule_work(&akita_ioexp);
+       return 0;
+}
+#else
+#define akita_ioexp_suspend NULL
+#define akita_ioexp_resume NULL
+#endif
+
+static int __init akita_ioexp_probe(struct platform_device *pdev)
+{
+       return i2c_add_driver(&max7310_i2c_driver);
+}
+
+static int akita_ioexp_remove(struct platform_device *pdev)
+{
+       i2c_del_driver(&max7310_i2c_driver);
+       return 0;
+}
+
+static struct platform_driver akita_ioexp_driver = {
+       .probe          = akita_ioexp_probe,
+       .remove         = akita_ioexp_remove,
+       .suspend        = akita_ioexp_suspend,
+       .resume         = akita_ioexp_resume,
+       .driver         = {
+               .name   = "akita-ioexp",
+       },
+};
+
+static int __init akita_ioexp_init(void)
+{
+       return platform_driver_register(&akita_ioexp_driver);
+}
+
+static void __exit akita_ioexp_exit(void)
+{
+       platform_driver_unregister(&akita_ioexp_driver);
+}
+
+MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>");
+MODULE_DESCRIPTION("Akita IO-Expander driver");
+MODULE_LICENSE("GPL");
+
+fs_initcall(akita_ioexp_init);
+module_exit(akita_ioexp_exit);
+
index 698eb06545c43c3ee5461fe5133139046af84a7a..6dbcaf114ad782a00907b15672f9ae60aff0dfea 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/string.h>
 #include <asm/arch/akita.h>
 #include <asm/arch/corgi.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/sharpsl.h>
 #include <asm/arch/spitz.h>
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c
new file mode 100644 (file)
index 0000000..599be14
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Battery and Power Management code for the Sharp SL-C7xx
+ *
+ * Copyright (c) 2005 Richard Purdie
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/stat.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/apm.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/hardware/scoop.h>
+
+#include <asm/arch/sharpsl.h>
+#include <asm/arch/corgi.h>
+#include <asm/arch/pxa-regs.h>
+#include "sharpsl.h"
+
+static void corgi_charger_init(void)
+{
+       pxa_gpio_mode(CORGI_GPIO_ADC_TEMP_ON | GPIO_OUT);
+       pxa_gpio_mode(CORGI_GPIO_CHRG_ON | GPIO_OUT);
+       pxa_gpio_mode(CORGI_GPIO_CHRG_UKN | GPIO_OUT);
+       pxa_gpio_mode(CORGI_GPIO_KEY_INT | GPIO_IN);
+}
+
+static void corgi_charge_led(int val)
+{
+       if (val == SHARPSL_LED_ERROR) {
+               dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
+       } else if (val == SHARPSL_LED_ON) {
+               dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
+               GPSR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
+       } else {
+               dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
+               GPCR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
+       }
+}
+
+static void corgi_measure_temp(int on)
+{
+       if (on)
+               GPSR(CORGI_GPIO_ADC_TEMP_ON) = GPIO_bit(CORGI_GPIO_ADC_TEMP_ON);
+       else
+               GPCR(CORGI_GPIO_ADC_TEMP_ON) = GPIO_bit(CORGI_GPIO_ADC_TEMP_ON);
+}
+
+static void corgi_charge(int on)
+{
+       if (on) {
+               if (machine_is_corgi() && (sharpsl_pm.flags & SHARPSL_SUSPENDED)) {
+                       GPCR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
+                       GPSR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
+               } else {
+                       GPSR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
+                       GPCR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
+               }
+       } else {
+               GPCR(CORGI_GPIO_CHRG_ON) = GPIO_bit(CORGI_GPIO_CHRG_ON);
+               GPCR(CORGI_GPIO_CHRG_UKN) = GPIO_bit(CORGI_GPIO_CHRG_UKN);
+       }
+}
+
+static void corgi_discharge(int on)
+{
+       if (on)
+               GPSR(CORGI_GPIO_DISCHARGE_ON) = GPIO_bit(CORGI_GPIO_DISCHARGE_ON);
+       else
+               GPCR(CORGI_GPIO_DISCHARGE_ON) = GPIO_bit(CORGI_GPIO_DISCHARGE_ON);
+}
+
+static void corgi_presuspend(void)
+{
+       int i;
+       unsigned long wakeup_mask;
+
+       /* charging , so CHARGE_ON bit is HIGH during OFF. */
+       if (READ_GPIO_BIT(CORGI_GPIO_CHRG_ON))
+               PGSR1 |= GPIO_bit(CORGI_GPIO_CHRG_ON);
+       else
+               PGSR1 &= ~GPIO_bit(CORGI_GPIO_CHRG_ON);
+
+       if (READ_GPIO_BIT(CORGI_GPIO_LED_ORANGE))
+               PGSR0 |= GPIO_bit(CORGI_GPIO_LED_ORANGE);
+       else
+               PGSR0 &= ~GPIO_bit(CORGI_GPIO_LED_ORANGE);
+
+       if (READ_GPIO_BIT(CORGI_GPIO_CHRG_UKN))
+               PGSR1 |= GPIO_bit(CORGI_GPIO_CHRG_UKN);
+       else
+               PGSR1 &= ~GPIO_bit(CORGI_GPIO_CHRG_UKN);
+
+       /* Resume on keyboard power key */
+       PGSR2 = (PGSR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(0);
+
+       wakeup_mask = GPIO_bit(CORGI_GPIO_KEY_INT) | GPIO_bit(CORGI_GPIO_WAKEUP) | GPIO_bit(CORGI_GPIO_AC_IN) | GPIO_bit(CORGI_GPIO_CHRG_FULL);
+
+       if (!machine_is_corgi())
+               wakeup_mask |= GPIO_bit(CORGI_GPIO_MAIN_BAT_LOW);
+
+       PWER = wakeup_mask | PWER_RTC;
+       PRER = wakeup_mask;
+       PFER = wakeup_mask;
+
+       for (i = 0; i <=15; i++) {
+               if (PRER & PFER & GPIO_bit(i)) {
+                       if (GPLR0 & GPIO_bit(i) )
+                               PRER &= ~GPIO_bit(i);
+                       else
+                               PFER &= ~GPIO_bit(i);
+               }
+       }
+}
+
+static void corgi_postsuspend(void)
+{
+}
+
+/*
+ * Check what brought us out of the suspend.
+ * Return: 0 to sleep, otherwise wake
+ */
+static int corgi_should_wakeup(unsigned int resume_on_alarm)
+{
+       int is_resume = 0;
+
+       dev_dbg(sharpsl_pm.dev, "GPLR0 = %x,%x\n", GPLR0, PEDR);
+
+       if ((PEDR & GPIO_bit(CORGI_GPIO_AC_IN))) {
+               if (STATUS_AC_IN()) {
+                       /* charge on */
+                       dev_dbg(sharpsl_pm.dev, "ac insert\n");
+                       sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
+               } else {
+                       /* charge off */
+                       dev_dbg(sharpsl_pm.dev, "ac remove\n");
+                       CHARGE_LED_OFF();
+                       CHARGE_OFF();
+                       sharpsl_pm.charge_mode = CHRG_OFF;
+               }
+       }
+
+       if ((PEDR & GPIO_bit(CORGI_GPIO_CHRG_FULL)))
+               dev_dbg(sharpsl_pm.dev, "Charge full interrupt\n");
+
+       if (PEDR & GPIO_bit(CORGI_GPIO_KEY_INT))
+               is_resume |= GPIO_bit(CORGI_GPIO_KEY_INT);
+
+       if (PEDR & GPIO_bit(CORGI_GPIO_WAKEUP))
+               is_resume |= GPIO_bit(CORGI_GPIO_WAKEUP);
+
+       if (resume_on_alarm && (PEDR & PWER_RTC))
+               is_resume |= PWER_RTC;
+
+       dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
+       return is_resume;
+}
+
+static unsigned long corgi_charger_wakeup(void)
+{
+       return ~GPLR0 & ( GPIO_bit(CORGI_GPIO_AC_IN) | GPIO_bit(CORGI_GPIO_KEY_INT) | GPIO_bit(CORGI_GPIO_WAKEUP) );
+}
+
+static int corgi_acin_status(void)
+{
+       return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
+}
+
+static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
+       .init            = corgi_charger_init,
+       .gpio_batlock    = CORGI_GPIO_BAT_COVER,
+       .gpio_acin       = CORGI_GPIO_AC_IN,
+       .gpio_batfull    = CORGI_GPIO_CHRG_FULL,
+       .status_acin     = corgi_acin_status,
+       .discharge       = corgi_discharge,
+       .charge          = corgi_charge,
+       .chargeled       = corgi_charge_led,
+       .measure_temp    = corgi_measure_temp,
+       .presuspend      = corgi_presuspend,
+       .postsuspend     = corgi_postsuspend,
+       .charger_wakeup  = corgi_charger_wakeup,
+       .should_wakeup   = corgi_should_wakeup,
+       .bat_levels      = 40,
+       .bat_levels_noac = spitz_battery_levels_noac,
+       .bat_levels_acin = spitz_battery_levels_acin,
+       .status_high_acin = 188,
+       .status_low_acin  = 178,
+       .status_high_noac = 185,
+       .status_low_noac  = 175,
+};
+
+static struct platform_device *corgipm_device;
+
+static int __devinit corgipm_init(void)
+{
+       int ret;
+
+       corgipm_device = platform_device_alloc("sharpsl-pm", -1);
+       if (!corgipm_device)
+               return -ENOMEM;
+
+       corgipm_device->dev.platform_data = &corgi_pm_machinfo;
+       ret = platform_device_add(corgipm_device);
+
+       if (ret)
+               platform_device_put(corgipm_device);
+
+       return ret;
+}
+
+static void corgipm_exit(void)
+{
+       platform_device_unregister(corgipm_device);
+}
+
+module_init(corgipm_init);
+module_exit(corgipm_exit);
index bdf10cfa94407763b2c46a99d71dc31d7fcaf159..b371d723635f38062d907059d5b9622604148f6b 100644 (file)
@@ -191,7 +191,7 @@ void __init corgi_ssp_set_machinfo(struct corgissp_machinfo *machinfo)
        ssp_machinfo = machinfo;
 }
 
-static int __init corgi_ssp_probe(struct device *dev)
+static int __init corgi_ssp_probe(struct platform_device *dev)
 {
        int ret;
 
@@ -216,13 +216,13 @@ static int __init corgi_ssp_probe(struct device *dev)
        return ret;
 }
 
-static int corgi_ssp_remove(struct device *dev)
+static int corgi_ssp_remove(struct platform_device *dev)
 {
        ssp_exit(&corgi_ssp_dev);
        return 0;
 }
 
-static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
+static int corgi_ssp_suspend(struct platform_device *dev, pm_message_t state)
 {
        ssp_flush(&corgi_ssp_dev);
        ssp_save_state(&corgi_ssp_dev,&corgi_ssp_state);
@@ -230,7 +230,7 @@ static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int corgi_ssp_resume(struct device *dev)
+static int corgi_ssp_resume(struct platform_device *dev)
 {
        GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon);  /* High - Disable LCD Control/Timing Gen */
        GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/
@@ -241,18 +241,19 @@ static int corgi_ssp_resume(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgissp_driver = {
-       .name           = "corgi-ssp",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgissp_driver = {
        .probe          = corgi_ssp_probe,
        .remove         = corgi_ssp_remove,
        .suspend        = corgi_ssp_suspend,
        .resume         = corgi_ssp_resume,
+       .driver         = {
+               .name   = "corgi-ssp",
+       },
 };
 
 int __init corgi_ssp_init(void)
 {
-       return driver_register(&corgissp_driver);
+       return platform_driver_register(&corgissp_driver);
 }
 
 arch_initcall(corgi_ssp_init);
index 4879c0f7da72ce733b799c03f7a50234a0a8d35b..b0c40a1d6671e17d5b5f78cd4f12e8734a8e61b4 100644 (file)
@@ -115,7 +115,7 @@ extern struct battery_thresh spitz_battery_levels_noac[];
 #define CHARGE_LED_ERR()    sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ERROR)
 #define DISCHARGE_ON()      sharpsl_pm.machinfo->discharge(1)
 #define DISCHARGE_OFF()     sharpsl_pm.machinfo->discharge(0)
-#define STATUS_AC_IN        sharpsl_pm.machinfo->status_acin()
-#define STATUS_BATT_LOCKED  READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock)
-#define STATUS_CHRG_FULL    READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull)
-#define STATUS_FATAL        READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)
+#define STATUS_AC_IN()      sharpsl_pm.machinfo->status_acin()
+#define STATUS_BATT_LOCKED()  READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock)
+#define STATUS_CHRG_FULL()  READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull)
+#define STATUS_FATAL()      READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)
index 6c9e871c53d86830598b23529411ae52d0eb2edf..c10be00fb52671ae7e7dc6fd2e1ccc93cb8ac722 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/apm_bios.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 
 #include <asm/hardware.h>
 #include <asm/hardware/scoop.h>
 #define SHARPSL_WAIT_DISCHARGE_ON              100 /* 100 msec */
 #define SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP   10  /* 10 msec */
 #define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT   10  /* 10 msec */
-#define SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD  10  /* 10 msec */
+#define SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN   10  /* 10 msec */
 #define SHARPSL_CHARGE_WAIT_TIME               15  /* 15 msec */
 #define SHARPSL_CHARGE_CO_CHECK_TIME           5   /* 5 msec */
 #define SHARPSL_CHARGE_RETRY_CNT               1   /* eqv. 10 min */
 
 #define SHARPSL_CHARGE_ON_VOLT         0x99  /* 2.9V */
 #define SHARPSL_CHARGE_ON_TEMP         0xe0  /* 2.9V */
-#define SHARPSL_CHARGE_ON_JKVAD_HIGH   0x9b  /* 6V */
-#define SHARPSL_CHARGE_ON_JKVAD_LOW    0x34  /* 2V */
+#define SHARPSL_CHARGE_ON_ACIN_HIGH    0x9b  /* 6V */
+#define SHARPSL_CHARGE_ON_ACIN_LOW     0x34  /* 2V */
 #define SHARPSL_FATAL_ACIN_VOLT        182   /* 3.45V */
 #define SHARPSL_FATAL_NOACIN_VOLT      170   /* 3.40V */
 
@@ -160,9 +160,10 @@ struct battery_thresh  spitz_battery_levels_noac[] = {
 /*
  * Prototypes
  */
-static int sharpsl_read_MainBattery(void);
+static int sharpsl_read_main_battery(void);
 static int sharpsl_off_charge_battery(void);
-static int sharpsl_check_battery(int mode);
+static int sharpsl_check_battery_temp(void);
+static int sharpsl_check_battery_voltage(void);
 static int sharpsl_ac_check(void);
 static int sharpsl_fatal_check(void);
 static int sharpsl_average_value(int ad);
@@ -228,7 +229,7 @@ static void sharpsl_battery_thread(void *private_)
        if (!sharpsl_pm.machinfo)
                return;
 
-       sharpsl_pm.battstat.ac_status = (!(STATUS_AC_IN) ? APM_AC_OFFLINE : APM_AC_ONLINE);
+       sharpsl_pm.battstat.ac_status = (STATUS_AC_IN() ? APM_AC_ONLINE : APM_AC_OFFLINE);
 
        /* Corgi cannot confirm when battery fully charged so periodically kick! */
        if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON)
@@ -236,7 +237,7 @@ static void sharpsl_battery_thread(void *private_)
                schedule_work(&toggle_charger);
 
        while(1) {
-               voltage = sharpsl_read_MainBattery();
+               voltage = sharpsl_read_main_battery();
                if (voltage > 0) break;
                if (i++ > 5) {
                        voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
@@ -317,10 +318,10 @@ static void sharpsl_charge_toggle(void *private_)
 {
        dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
 
-       if (STATUS_AC_IN == 0) {
+       if (STATUS_AC_IN() == 0) {
                sharpsl_charge_off();
                return;
-       } else if ((sharpsl_check_battery(1) < 0) || (sharpsl_ac_check() < 0)) {
+       } else if ((sharpsl_check_battery_temp() < 0) || (sharpsl_ac_check() < 0)) {
                sharpsl_charge_error();
                return;
        }
@@ -335,7 +336,7 @@ static void sharpsl_charge_toggle(void *private_)
 
 static void sharpsl_ac_timer(unsigned long data)
 {
-       int acin = STATUS_AC_IN;
+       int acin = STATUS_AC_IN();
 
        dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin);
 
@@ -364,7 +365,7 @@ static void sharpsl_chrg_full_timer(unsigned long data)
 
        sharpsl_pm.full_count++;
 
-       if (STATUS_AC_IN == 0) {
+       if (STATUS_AC_IN() == 0) {
                dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n");
                if (sharpsl_pm.charge_mode == CHRG_ON)
                        sharpsl_charge_off();
@@ -399,12 +400,12 @@ static irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id, struct pt_regs *fp)
 {
        int is_fatal = 0;
 
-       if (STATUS_BATT_LOCKED == 0) {
+       if (STATUS_BATT_LOCKED() == 0) {
                dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n");
                is_fatal = 1;
        }
 
-       if (sharpsl_pm.machinfo->gpio_fatal && (STATUS_FATAL == 0)) {
+       if (sharpsl_pm.machinfo->gpio_fatal && (STATUS_FATAL() == 0)) {
                dev_err(sharpsl_pm.dev, "Fatal Batt Error! Suspending.\n");
                is_fatal = 1;
        }
@@ -461,12 +462,12 @@ static int read_max1111(int channel)
                        | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
 }
 
-static int sharpsl_read_MainBattery(void)
+static int sharpsl_read_main_battery(void)
 {
        return read_max1111(BATT_AD);
 }
 
-static int sharpsl_read_Temp(void)
+static int sharpsl_read_temp(void)
 {
        int temp;
 
@@ -480,7 +481,7 @@ static int sharpsl_read_Temp(void)
        return temp;
 }
 
-static int sharpsl_read_jkvad(void)
+static int sharpsl_read_acin(void)
 {
        return read_max1111(JK_VAD);
 }
@@ -522,16 +523,14 @@ static int get_select_val(int *val)
        return (sum/3);
 }
 
-/*  mode 0 - Check temperature and voltage
- *       1 - Check temperature only */
-static int sharpsl_check_battery(int mode)
+static int sharpsl_check_battery_temp(void)
 {
        int val, i, buff[5];
 
        /* Check battery temperature */
        for (i=0; i<5; i++) {
                mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
-               buff[i] = sharpsl_read_Temp();
+               buff[i] = sharpsl_read_temp();
        }
 
        val = get_select_val(buff);
@@ -539,8 +538,13 @@ static int sharpsl_check_battery(int mode)
        dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val);
        if (val > SHARPSL_CHARGE_ON_TEMP)
                return -1;
-       if (mode == 1)
-               return 0;
+
+       return 0;
+}
+
+static int sharpsl_check_battery_voltage(void)
+{
+       int val, i, buff[5];
 
        /* disable charge, enable discharge */
        CHARGE_OFF();
@@ -552,7 +556,7 @@ static int sharpsl_check_battery(int mode)
 
        /* Check battery voltage */
        for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_MainBattery();
+               buff[i] = sharpsl_read_main_battery();
                mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
        }
 
@@ -575,14 +579,14 @@ static int sharpsl_ac_check(void)
        int temp, i, buff[5];
 
        for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_jkvad();
-               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD);
+               buff[i] = sharpsl_read_acin();
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
        }
 
        temp = get_select_val(buff);
        dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp);
 
-       if ((temp > SHARPSL_CHARGE_ON_JKVAD_HIGH) || (temp < SHARPSL_CHARGE_ON_JKVAD_LOW)) {
+       if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) {
                dev_err(sharpsl_pm.dev, "Error: AC check failed.\n");
                return -1;
        }
@@ -591,7 +595,7 @@ static int sharpsl_ac_check(void)
 }
 
 #ifdef CONFIG_PM
-static int sharpsl_pm_suspend(struct device *dev, pm_message_t state)
+static int sharpsl_pm_suspend(struct platform_device *pdev, pm_message_t state)
 {
        sharpsl_pm.flags |= SHARPSL_SUSPENDED;
        flush_scheduled_work();
@@ -604,7 +608,7 @@ static int sharpsl_pm_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int sharpsl_pm_resume(struct device *dev)
+static int sharpsl_pm_resume(struct platform_device *pdev)
 {
        /* Clear the reset source indicators as they break the bootloader upon reboot */
        RCSR = 0x0f;
@@ -622,7 +626,7 @@ static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable
        dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG);
        /* not charging and AC-IN! */
 
-       if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (STATUS_AC_IN != 0)) {
+       if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (STATUS_AC_IN() != 0)) {
                dev_dbg(sharpsl_pm.dev, "Activating Offline Charger...\n");
                sharpsl_pm.charge_mode = CHRG_OFF;
                sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
@@ -671,7 +675,7 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab
                dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
        }
 
-       if ((STATUS_BATT_LOCKED == 0) || (sharpsl_fatal_check() < 0) )
+       if ((STATUS_BATT_LOCKED() == 0) || (sharpsl_fatal_check() < 0) )
        {
                dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
                corgi_goto_sleep(alarm_time, alarm_enable, state);
@@ -711,7 +715,7 @@ static int sharpsl_fatal_check(void)
        dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check entered\n");
 
        /* Check AC-Adapter */
-       acin = STATUS_AC_IN;
+       acin = STATUS_AC_IN();
 
        if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
                CHARGE_OFF();
@@ -725,7 +729,7 @@ static int sharpsl_fatal_check(void)
 
        /* Check battery : check inserting battery ? */
        for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_MainBattery();
+               buff[i] = sharpsl_read_main_battery();
                mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
        }
 
@@ -739,7 +743,7 @@ static int sharpsl_fatal_check(void)
        }
 
        temp = get_select_val(buff);
-       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_read_MainBattery());
+       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_read_main_battery());
 
        if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) ||
                        (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT)))
@@ -771,7 +775,7 @@ static int sharpsl_off_charge_battery(void)
                dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 1\n");
 
                /* AC Check */
-               if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery(1) < 0))
+               if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery_temp() < 0))
                        return sharpsl_off_charge_error();
 
                /* Start Charging */
@@ -793,7 +797,7 @@ static int sharpsl_off_charge_battery(void)
 
                dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 2\n");
 
-               if (sharpsl_check_battery(0) < 0)
+               if ((sharpsl_check_battery_temp() < 0) || (sharpsl_check_battery_voltage() < 0))
                        return sharpsl_off_charge_error();
 
                CHARGE_OFF();
@@ -811,7 +815,7 @@ static int sharpsl_off_charge_battery(void)
                        /* Check for timeout */
                        if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
                                return 1;
-                       if (STATUS_CHRG_FULL) {
+                       if (STATUS_CHRG_FULL()) {
                                dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n");
                                sharpsl_pm.full_count++;
                                CHARGE_OFF();
@@ -840,7 +844,7 @@ static int sharpsl_off_charge_battery(void)
                        sharpsl_pm.full_count++;
                        return 1;
                }
-               if (STATUS_CHRG_FULL) {
+               if (STATUS_CHRG_FULL()) {
                        dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n");
                        CHARGE_LED_OFF();
                        CHARGE_OFF();
@@ -886,13 +890,13 @@ static struct pm_ops sharpsl_pm_ops = {
        .finish         = pxa_pm_finish,
 };
 
-static int __init sharpsl_pm_probe(struct device *dev)
+static int __init sharpsl_pm_probe(struct platform_device *pdev)
 {
-       if (!dev->platform_data)
+       if (!pdev->dev.platform_data)
                return -EINVAL;
 
-       sharpsl_pm.dev = dev;
-       sharpsl_pm.machinfo = dev->platform_data;
+       sharpsl_pm.dev = &pdev->dev;
+       sharpsl_pm.machinfo = pdev->dev.platform_data;
        sharpsl_pm.charge_mode = CHRG_OFF;
        sharpsl_pm.flags = 0;
 
@@ -935,8 +939,8 @@ static int __init sharpsl_pm_probe(struct device *dev)
                else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING);
        }
 
-       device_create_file(dev, &dev_attr_battery_percentage);
-       device_create_file(dev, &dev_attr_battery_voltage);
+       device_create_file(&pdev->dev, &dev_attr_battery_percentage);
+       device_create_file(&pdev->dev, &dev_attr_battery_voltage);
 
        apm_get_power_status = sharpsl_apm_get_power_status;
 
@@ -947,12 +951,12 @@ static int __init sharpsl_pm_probe(struct device *dev)
        return 0;
 }
 
-static int sharpsl_pm_remove(struct device *dev)
+static int sharpsl_pm_remove(struct platform_device *pdev)
 {
        pm_set_ops(NULL);
 
-       device_remove_file(dev, &dev_attr_battery_percentage);
-       device_remove_file(dev, &dev_attr_battery_voltage);
+       device_remove_file(&pdev->dev, &dev_attr_battery_percentage);
+       device_remove_file(&pdev->dev, &dev_attr_battery_voltage);
 
        free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr);
        free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr);
@@ -969,23 +973,24 @@ static int sharpsl_pm_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver sharpsl_pm_driver = {
-       .name           = "sharpsl-pm",
-       .bus            = &platform_bus_type,
+static struct platform_driver sharpsl_pm_driver = {
        .probe          = sharpsl_pm_probe,
        .remove         = sharpsl_pm_remove,
        .suspend        = sharpsl_pm_suspend,
        .resume         = sharpsl_pm_resume,
+       .driver         = {
+               .name           = "sharpsl-pm",
+       },
 };
 
 static int __devinit sharpsl_pm_init(void)
 {
-       return driver_register(&sharpsl_pm_driver);
+       return platform_driver_register(&sharpsl_pm_driver);
 }
 
 static void sharpsl_pm_exit(void)
 {
-       driver_unregister(&sharpsl_pm_driver);
+       platform_driver_unregister(&sharpsl_pm_driver);
 }
 
 late_initcall(sharpsl_pm_init);
index 4e9a699ee4280e61560a5672e9bd6c276c36a284..2df1b56615b1029601d405b958f682aae41d8b98 100644 (file)
@@ -345,6 +345,16 @@ static void spitz_irda_transceiver_mode(struct device *dev, int mode)
                reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON);
 }
 
+#ifdef CONFIG_MACH_AKITA
+static void akita_irda_transceiver_mode(struct device *dev, int mode)
+{
+       if (mode & IR_OFF)
+               akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
+       else
+               akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
+}
+#endif
+
 static struct pxaficp_platform_data spitz_ficp_platform_data = {
        .transceiver_cap  = IR_SIRMODE | IR_OFF,
        .transceiver_mode = spitz_irda_transceiver_mode,
@@ -417,6 +427,32 @@ static void __init spitz_init(void)
        platform_device_register(&spitzscoop2_device);
 }
 
+#ifdef CONFIG_MACH_AKITA
+/*
+ * Akita IO Expander
+ */
+struct platform_device akitaioexp_device = {
+       .name           = "akita-ioexp",
+       .id             = -1,
+};
+
+static void __init akita_init(void)
+{
+       spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode;
+
+       /* We just pretend the second element of the array doesn't exist */
+       spitz_pcmcia_config.num_devs = 1;
+       platform_scoop_config = &spitz_pcmcia_config;
+       spitz_bl_machinfo.set_bl_intensity = akita_bl_set_intensity;
+
+       platform_device_register(&akitaioexp_device);
+
+       spitzscoop_device.dev.parent = &akitaioexp_device.dev;
+       common_init();
+}
+#endif
+
+
 static void __init fixup_spitz(struct machine_desc *desc,
                struct tag *tags, char **cmdline, struct meminfo *mi)
 {
@@ -452,3 +488,16 @@ MACHINE_START(BORZOI, "SHARP Borzoi")
        .timer          = &pxa_timer,
 MACHINE_END
 #endif
+
+#ifdef CONFIG_MACH_AKITA
+MACHINE_START(AKITA, "SHARP Akita")
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .fixup          = fixup_spitz,
+       .map_io         = pxa_map_io,
+       .init_irq       = pxa_init_irq,
+       .init_machine   = akita_init,
+       .timer          = &pxa_timer,
+MACHINE_END
+#endif
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
new file mode 100644 (file)
index 0000000..3ce7486
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Battery and Power Management code for the Sharp SL-Cxx00
+ *
+ * Copyright (c) 2005 Richard Purdie
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/stat.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/apm.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/hardware/scoop.h>
+
+#include <asm/arch/sharpsl.h>
+#include <asm/arch/spitz.h>
+#include <asm/arch/pxa-regs.h>
+#include "sharpsl.h"
+
+static int spitz_last_ac_status;
+
+static void spitz_charger_init(void)
+{
+       pxa_gpio_mode(SPITZ_GPIO_KEY_INT | GPIO_IN);
+       pxa_gpio_mode(SPITZ_GPIO_SYNC | GPIO_IN);
+}
+
+static void spitz_charge_led(int val)
+{
+       if (val == SHARPSL_LED_ERROR) {
+               dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
+       } else if (val == SHARPSL_LED_ON) {
+               dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
+               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
+       } else {
+               dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
+               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
+       }
+}
+
+static void spitz_measure_temp(int on)
+{
+       if (on)
+               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_ADC_TEMP_ON);
+       else
+               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_ADC_TEMP_ON);
+}
+
+static void spitz_charge(int on)
+{
+       if (on) {
+               if (sharpsl_pm.flags & SHARPSL_SUSPENDED) {
+                       set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
+                       reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
+               } else {
+                       reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
+                       reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
+               }
+       } else {
+               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_B);
+               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CHRG_ON);
+       }
+}
+
+static void spitz_discharge(int on)
+{
+       if (on)
+               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_A);
+       else
+               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_JK_A);
+}
+
+/* HACK - For unknown reasons, accurate voltage readings are only made with a load
+   on the power bus which the green led on spitz provides */
+static void spitz_discharge1(int on)
+{
+       if (on)
+               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_GREEN);
+       else
+               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_GREEN);
+}
+
+static void spitz_presuspend(void)
+{
+       spitz_last_ac_status = STATUS_AC_IN();
+
+       /* GPIO Sleep Register */
+       PGSR0 = 0x00144018;
+       PGSR1 = 0x00EF0000;
+       if (machine_is_akita()) {
+               PGSR2 = 0x2121C000;
+               PGSR3 = 0x00600400;
+       } else {
+               PGSR2 = 0x0121C000;
+               PGSR3 = 0x00600000;
+       }
+
+       PGSR0 &= ~SPITZ_GPIO_G0_STROBE_BIT;
+       PGSR1 &= ~SPITZ_GPIO_G1_STROBE_BIT;
+       PGSR2 &= ~SPITZ_GPIO_G2_STROBE_BIT;
+       PGSR3 &= ~SPITZ_GPIO_G3_STROBE_BIT;
+       PGSR2 |= GPIO_bit(SPITZ_GPIO_KEY_STROBE0);
+
+       pxa_gpio_mode(GPIO18_RDY|GPIO_OUT | GPIO_DFLT_HIGH);
+
+       PRER = GPIO_bit(SPITZ_GPIO_KEY_INT);
+       PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
+       PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET) | PWER_RTC;
+       PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
+       PKSR = 0xffffffff; // clear
+
+       /* nRESET_OUT Disable */
+       PSLR |= PSLR_SL_ROD;
+
+       /* Clear reset status */
+       RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
+
+       /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
+       PCFR = PCFR_GPR_EN | PCFR_OPDE;
+}
+
+static void spitz_postsuspend(void)
+{
+       pxa_gpio_mode(GPIO18_RDY_MD);
+       pxa_gpio_mode(10 | GPIO_IN);
+}
+
+static int spitz_should_wakeup(unsigned int resume_on_alarm)
+{
+       int is_resume = 0;
+       int acin = STATUS_AC_IN();
+
+       if (spitz_last_ac_status != acin) {
+               if (acin) {
+                       /* charge on */
+                       sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
+                       dev_dbg(sharpsl_pm.dev, "AC Inserted\n");
+               } else {
+                       /* charge off */
+                       dev_dbg(sharpsl_pm.dev, "AC Removed\n");
+                       CHARGE_LED_OFF();
+                       CHARGE_OFF();
+                       sharpsl_pm.charge_mode = CHRG_OFF;
+               }
+               spitz_last_ac_status = acin;
+               /* Return to suspend as this must be what we were woken for */
+               return 0;
+       }
+
+       if (PEDR & GPIO_bit(SPITZ_GPIO_KEY_INT))
+               is_resume |= GPIO_bit(SPITZ_GPIO_KEY_INT);
+
+       if (PKSR & GPIO_bit(SPITZ_GPIO_SYNC))
+               is_resume |= GPIO_bit(SPITZ_GPIO_SYNC);
+
+       if (resume_on_alarm && (PEDR & PWER_RTC))
+               is_resume |= PWER_RTC;
+
+       dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
+       return is_resume;
+}
+
+static unsigned long spitz_charger_wakeup(void)
+{
+       return (~GPLR0 & GPIO_bit(SPITZ_GPIO_KEY_INT)) | (GPLR0 & GPIO_bit(SPITZ_GPIO_SYNC));
+}
+
+static int spitz_acin_status(void)
+{
+       return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
+}
+
+struct sharpsl_charger_machinfo spitz_pm_machinfo = {
+       .init             = spitz_charger_init,
+       .gpio_batlock     = SPITZ_GPIO_BAT_COVER,
+       .gpio_acin        = SPITZ_GPIO_AC_IN,
+       .gpio_batfull     = SPITZ_GPIO_CHRG_FULL,
+       .gpio_fatal       = SPITZ_GPIO_FATAL_BAT,
+       .status_acin      = spitz_acin_status,
+       .discharge        = spitz_discharge,
+       .discharge1       = spitz_discharge1,
+       .charge           = spitz_charge,
+       .chargeled        = spitz_charge_led,
+       .measure_temp     = spitz_measure_temp,
+       .presuspend       = spitz_presuspend,
+       .postsuspend      = spitz_postsuspend,
+       .charger_wakeup   = spitz_charger_wakeup,
+       .should_wakeup    = spitz_should_wakeup,
+       .bat_levels       = 40,
+       .bat_levels_noac  = spitz_battery_levels_noac,
+       .bat_levels_acin  = spitz_battery_levels_acin,
+       .status_high_acin = 188,
+       .status_low_acin  = 178,
+       .status_high_noac = 185,
+       .status_low_noac  = 175,
+};
+
+static struct platform_device *spitzpm_device;
+
+static int __devinit spitzpm_init(void)
+{
+       int ret;
+
+       spitzpm_device = platform_device_alloc("sharpsl-pm", -1);
+       if (!spitzpm_device)
+               return -ENOMEM;
+
+       spitzpm_device->dev.platform_data = &spitz_pm_machinfo;
+       ret = platform_device_add(spitzpm_device);
+
+       if (ret)
+               platform_device_put(spitzpm_device);
+
+       return ret;
+}
+
+static void spitzpm_exit(void)
+{
+       platform_device_unregister(spitzpm_device);
+}
+
+module_init(spitzpm_init);
+module_exit(spitzpm_exit);
index d83e8bad20384291b1ad8c8e99d400277546922d..c06e6041df41bbde4fe03f66f5a0b478c128d949 100644 (file)
@@ -26,8 +26,6 @@
 #include <asm/leds.h>
 #include <asm/io.h>
 
-#define __io_address(n)                __io(IO_ADDRESS(n))
-
 extern struct sys_timer realview_timer;
 
 #define AMBA_DEVICE(name,busid,base,plat)                      \
index 5e917e37d095762e567fd94b60bdcd1d35f1c8ad..c9d7c596b200866b8ccf2f8dfb98127044fbd8e8 100644 (file)
@@ -21,8 +21,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include "core.h"
-
 #define TWD_BASE(cpu)  (__io_address(REALVIEW_TWD_BASE) + \
                         ((cpu) * REALVIEW_TWD_SIZE))
 
index 0c7d4ac9a7b371c7a4221d96a918812cbdb7c811..a8fbd76d8be5855e97eea74502f949cde0abf828 100644 (file)
@@ -17,8 +17,7 @@
 #include <asm/cacheflush.h>
 #include <asm/hardware/arm_scu.h>
 #include <asm/hardware.h>
-
-#include "core.h"
+#include <asm/io.h>
 
 extern void realview_secondary_startup(void);
 
index 1be2567a7486606039f1f36902d97fad891b0aaf..4d962717fdf78e32a1ce31eb9e51bf8e92a8f787 100644 (file)
@@ -203,7 +203,7 @@ static struct s3c24xx_uart_clksrc bast_serial_clocks[] = {
                .name           = "pclk",
                .divisor        = 1,
                .min_baud       = 0,
-               .max_baud       = 0.
+               .max_baud       = 0,
        }
 };
 
@@ -216,7 +216,7 @@ static struct s3c2410_uartcfg bast_uartcfgs[] = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = bast_serial_clocks,
-               .clocks_size = ARRAY_SIZE(bast_serial_clocks)
+               .clocks_size = ARRAY_SIZE(bast_serial_clocks),
        },
        [1] = {
                .hwport      = 1,
@@ -225,7 +225,7 @@ static struct s3c2410_uartcfg bast_uartcfgs[] = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = bast_serial_clocks,
-               .clocks_size = ARRAY_SIZE(bast_serial_clocks)
+               .clocks_size = ARRAY_SIZE(bast_serial_clocks),
        },
        /* port 2 is not actually used */
        [2] = {
@@ -235,7 +235,7 @@ static struct s3c2410_uartcfg bast_uartcfgs[] = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = bast_serial_clocks,
-               .clocks_size = ARRAY_SIZE(bast_serial_clocks)
+               .clocks_size = ARRAY_SIZE(bast_serial_clocks),
        }
 };
 
@@ -268,7 +268,7 @@ static struct mtd_partition bast_default_nand_part[] = {
        [0] = {
                .name   = "Boot Agent",
                .size   = SZ_16K,
-               .offset = 0
+               .offset = 0,
        },
        [1] = {
                .name   = "/boot",
@@ -296,28 +296,28 @@ static struct s3c2410_nand_set bast_nand_sets[] = {
                .nr_chips       = 1,
                .nr_map         = smartmedia_map,
                .nr_partitions  = ARRAY_SIZE(bast_default_nand_part),
-               .partitions     = bast_default_nand_part
+               .partitions     = bast_default_nand_part,
        },
        [1] = {
                .name           = "chip0",
                .nr_chips       = 1,
                .nr_map         = chip0_map,
                .nr_partitions  = ARRAY_SIZE(bast_default_nand_part),
-               .partitions     = bast_default_nand_part
+               .partitions     = bast_default_nand_part,
        },
        [2] = {
                .name           = "chip1",
                .nr_chips       = 1,
                .nr_map         = chip1_map,
                .nr_partitions  = ARRAY_SIZE(bast_default_nand_part),
-               .partitions     = bast_default_nand_part
+               .partitions     = bast_default_nand_part,
        },
        [3] = {
                .name           = "chip2",
                .nr_chips       = 1,
                .nr_map         = chip2_map,
                .nr_partitions  = ARRAY_SIZE(bast_default_nand_part),
-               .partitions     = bast_default_nand_part
+               .partitions     = bast_default_nand_part,
        }
 };
 
@@ -355,17 +355,17 @@ static struct resource bast_dm9k_resource[] = {
        [0] = {
                .start = S3C2410_CS5 + BAST_PA_DM9000,
                .end   = S3C2410_CS5 + BAST_PA_DM9000 + 3,
-               .flags = IORESOURCE_MEM
+               .flags = IORESOURCE_MEM,
        },
        [1] = {
                .start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
                .end   = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
-               .flags = IORESOURCE_MEM
+               .flags = IORESOURCE_MEM,
        },
        [2] = {
                .start = IRQ_DM9000,
                .end   = IRQ_DM9000,
-               .flags = IORESOURCE_IRQ
+               .flags = IORESOURCE_IRQ,
        }
 
 };
@@ -375,7 +375,7 @@ static struct resource bast_dm9k_resource[] = {
 */
 
 static struct dm9000_plat_data bast_dm9k_platdata = {
-       .flags          = DM9000_PLATF_16BITONLY
+       .flags          = DM9000_PLATF_16BITONLY,
 };
 
 static struct platform_device bast_device_dm9k = {
@@ -492,7 +492,7 @@ static struct s3c24xx_board bast_board __initdata = {
        .devices       = bast_devices,
        .devices_count = ARRAY_SIZE(bast_devices),
        .clocks        = bast_clocks,
-       .clocks_count  = ARRAY_SIZE(bast_clocks)
+       .clocks_count  = ARRAY_SIZE(bast_clocks),
 };
 
 static void __init bast_map_io(void)
index 69f1970646c628e3a9e8f68a2adddf511a16297b..9e02bc3712a00b5046245e71a13c1c99101bbcbc 100644 (file)
@@ -137,7 +137,7 @@ static struct sa1100_port_fns neponset_port_fns __initdata = {
        .get_mctrl      = neponset_get_mctrl,
 };
 
-static int neponset_probe(struct device *dev)
+static int neponset_probe(struct platform_device *dev)
 {
        sa1100_register_uart_fns(&neponset_port_fns);
 
@@ -178,27 +178,27 @@ static int neponset_probe(struct device *dev)
 /*
  * LDM power management.
  */
-static int neponset_suspend(struct device *dev, pm_message_t state)
+static int neponset_suspend(struct platform_device *dev, pm_message_t state)
 {
        /*
         * Save state.
         */
-       if (!dev->power.saved_state)
-               dev->power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
-       if (!dev->power.saved_state)
+       if (!dev->dev.power.saved_state)
+               dev->dev.power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
+       if (!dev->dev.power.saved_state)
                return -ENOMEM;
 
-       *(unsigned int *)dev->power.saved_state = NCR_0;
+       *(unsigned int *)dev->dev.power.saved_state = NCR_0;
 
        return 0;
 }
 
-static int neponset_resume(struct device *dev)
+static int neponset_resume(struct platform_device *dev)
 {
-       if (dev->power.saved_state) {
-               NCR_0 = *(unsigned int *)dev->power.saved_state;
-               kfree(dev->power.saved_state);
-               dev->power.saved_state = NULL;
+       if (dev->dev.power.saved_state) {
+               NCR_0 = *(unsigned int *)dev->dev.power.saved_state;
+               kfree(dev->dev.power.saved_state);
+               dev->dev.power.saved_state = NULL;
        }
 
        return 0;
@@ -209,12 +209,13 @@ static int neponset_resume(struct device *dev)
 #define neponset_resume  NULL
 #endif
 
-static struct device_driver neponset_device_driver = {
-       .name           = "neponset",
-       .bus            = &platform_bus_type,
+static struct platform_driver neponset_device_driver = {
        .probe          = neponset_probe,
        .suspend        = neponset_suspend,
        .resume         = neponset_resume,
+       .driver         = {
+               .name   = "neponset",
+       },
 };
 
 static struct resource neponset_resources[] = {
@@ -293,7 +294,7 @@ static struct platform_device *devices[] __initdata = {
 
 static int __init neponset_init(void)
 {
-       driver_register(&neponset_device_driver);
+       platform_driver_register(&neponset_device_driver);
 
        /*
         * The Neponset is only present on the Assabet machine type.
index a1468d7326eb5b4485c516b40c29ce428ef36639..38d7ebf879207cb116ed17fc1c81e2b1ab7ec946 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 #include <linux/init.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/arch/dmtimer.h>
 #include <asm/io.h>
 #include <asm/arch/irqs.h>
index 2ede2ee8cae420ecf4b5a24593e572058c942929..b86148227480607686bddbd40dbec8c31d11880b 100644 (file)
@@ -34,7 +34,7 @@
 
 #include <asm/io.h>
 #include <asm/hardware/clock.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 #define OCPI_BASE              0xfffec320
 #define OCPI_FAULT             (OCPI_BASE + 0x00)
index 966cca031ca7460f6ad7deb75e70463d68127aaa..1a24e2c10714e498942cdaae1d3386af6f9f7b37 100644 (file)
@@ -509,7 +509,7 @@ static void omap_pm_init_proc(void)
  *     @state:         suspend state we're entering.
  *
  */
-//#include <asm/arch/hardware.h>
+//#include <asm/hardware.h>
 
 static int omap_pm_prepare(suspend_state_t state)
 {
index 4bea36964a005faa91a16c88cfa0550c3e449cc6..66414cc8e6e38650da20a9447eaa34fd09b28b21 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/arch/io.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
        .text
 
index ae7c64b8cec3d1997d260794dbcaf35481be26d3..048c9c19aa4fa508bb7e9f12831845a0202c205a 100644 (file)
@@ -12,7 +12,7 @@
 #
 #   http://www.arm.linux.org.uk/developer/machines/?action=new
 #
-# Last update: Mon Oct 10 09:46:25 2005
+# Last update: Fri Nov 11 21:55:04 2005
 #
 # machine_is_xxx       CONFIG_xxxx             MACH_TYPE_xxx           number
 #
@@ -460,7 +460,7 @@ esl_sarva           MACH_ESL_SARVA          ESL_SARVA               443
 xm250                  MACH_XM250              XM250                   444
 t6tc1xb                        MACH_T6TC1XB            T6TC1XB                 445
 ess710                 MACH_ESS710             ESS710                  446
-mx31ads                        MACH_MX3ADS             MX3ADS                  447
+mx31ads                        MACH_MX31ADS            MX31ADS                 447
 himalaya               MACH_HIMALAYA           HIMALAYA                448
 bolfenk                        MACH_BOLFENK            BOLFENK                 449
 at91rm9200kr           MACH_AT91RM9200KR       AT91RM9200KR            450
@@ -802,7 +802,7 @@ cpuat91                     MACH_CPUAT91            CPUAT91                 787
 rea9200                        MACH_REA9200            REA9200                 788
 acts_pune_sa1110       MACH_ACTS_PUNE_SA1110   ACTS_PUNE_SA1110        789
 ixp425                 MACH_IXP425             IXP425                  790
-argonplusodyssey       MACH_ODYSSEY            ODYSSEY                 791
+argonplusodyssey       MACH_ARGONPLUSODYSSEY   ARGONPLUSODYSSEY        791
 perch                  MACH_PERCH              PERCH                   792
 eis05r1                        MACH_EIS05R1            EIS05R1                 793
 pepperpad              MACH_PEPPERPAD          PEPPERPAD               794
@@ -816,7 +816,7 @@ iq_nextgen_c                MACH_IQ_NEXTGEN_C       IQ_NEXTGEN_C            801
 iq_nextgen_d           MACH_IQ_NEXTGEN_D       IQ_NEXTGEN_D            802
 iq_nextgen_e           MACH_IQ_NEXTGEN_E       IQ_NEXTGEN_E            803
 mallow_at91            MACH_MALLOW_AT91        MALLOW_AT91             804
-cybertracker           MACH_CYBERTRACKER       CYBERTRACKER            805
+cybertracker_i         MACH_CYBERTRACKER_I     CYBERTRACKER_I          805
 gesbc931x              MACH_GESBC931X          GESBC931X               806
 centipad               MACH_CENTIPAD           CENTIPAD                807
 armsoc                 MACH_ARMSOC             ARMSOC                  808
@@ -869,3 +869,38 @@ davinci_dvdp               MACH_DAVINCI_DVDP       DAVINCI_DVDP            854
 htcuniversal           MACH_HTCUNIVERSAL       HTCUNIVERSAL            855
 tpad                   MACH_TPAD               TPAD                    856
 roverp3                        MACH_ROVERP3            ROVERP3                 857
+jornada928             MACH_JORNADA928         JORNADA928              858
+mv88fxx81              MACH_MV88FXX81          MV88FXX81               859
+stmp36xx               MACH_STMP36XX           STMP36XX                860
+sxni79524              MACH_SXNI79524          SXNI79524               861
+ams_delta              MACH_AMS_DELTA          AMS_DELTA               862
+uranium                        MACH_URANIUM            URANIUM                 863
+ucon                   MACH_UCON               UCON                    864
+nas100d                        MACH_NAS100D            NAS100D                 865
+l083                   MACH_L083_1000          L083_1000               866
+ezx                    MACH_EZX                EZX                     867
+pnx5220                        MACH_PNX5220            PNX5220                 868
+butte                  MACH_BUTTE              BUTTE                   869
+srm2                   MACH_SRM2               SRM2                    870
+dsbr                   MACH_DSBR               DSBR                    871
+crystalball            MACH_CRYSTALBALL        CRYSTALBALL             872
+tinypxa27x             MACH_TINYPXA27X         TINYPXA27X              873
+herbie                 MACH_HERBIE             HERBIE                  874
+magician               MACH_MAGICIAN           MAGICIAN                875
+cm4002                 MACH_CM4002             CM4002                  876
+b4                     MACH_B4                 B4                      877
+maui                   MACH_MAUI               MAUI                    878
+cybertracker_g         MACH_CYBERTRACKER_G     CYBERTRACKER_G          879
+nxdkn                  MACH_NXDKN              NXDKN                   880
+mio8390                        MACH_MIO8390            MIO8390                 881
+omi_board              MACH_OMI_BOARD          OMI_BOARD               882
+mx21civ                        MACH_MX21CIV            MX21CIV                 883
+mahi_cdac              MACH_MAHI_CDAC          MAHI_CDAC               884
+xscale_palmtx          MACH_XSCALE_PALMTX      XSCALE_PALMTX           885
+arch_s3c2413           MACH_ARCH_S3C2413       ARCH_S3C2413            886
+s3c2413                        MACH_S3C2413            S3C2413                 887
+samsys_ep0             MACH_SAMSYS_EP0         SAMSYS_EP0              888
+wg302v1                        MACH_WG302V1            WG302V1                 889
+wg302v2                        MACH_WG302V2            WG302V2                 890
+eb42x                  MACH_EB42X              EB42X                   891
+iq331es                        MACH_IQ331ES            IQ331ES                 892
index 1a1e8a119c3d722aa7d9b64ddabe820ace45bc4b..712c3c24c954008d520f7925a492eee0a85f97e5 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/config.h>
 #include <linux/init.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/sysctl.h>
index dbf90ad6eac363a082deae5141c7fcac7a385279..6004bb0795e0992687ffdc2548798c7661736e2a 100644 (file)
@@ -699,7 +699,7 @@ depends on PM && !X86_VISWS
 
 config APM
        tristate "APM (Advanced Power Management) BIOS support"
-       depends on PM
+       depends on PM && PM_LEGACY
        ---help---
          APM is a BIOS specification for saving power using several different
          techniques. This is mostly useful for battery powered laptops with
index b66c13c0cc0f8b45742021e35119067b3778d6dc..f36677241ecd528527528cc779ee6fb067de7926 100644 (file)
 
 #ifdef CONFIG_X86_64
 
-static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
-{
-}
 extern void __init clustered_apic_check(void);
-static inline int ioapic_setup_disabled(void)
-{
-       return 0;
-}
 
+extern int gsi_irq_sharing(int gsi);
 #include <asm/proto.h>
 
+static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
+
+
 #else                          /* X86 */
 
 #ifdef CONFIG_X86_LOCAL_APIC
@@ -57,6 +54,8 @@ static inline int ioapic_setup_disabled(void)
 #include <mach_mpparse.h>
 #endif                         /* CONFIG_X86_LOCAL_APIC */
 
+static inline int gsi_irq_sharing(int gsi) { return gsi; }
+
 #endif                         /* X86 */
 
 #define BAD_MADT_ENTRY(entry, end) (                                       \
@@ -459,7 +458,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
                *irq = IO_APIC_VECTOR(gsi);
        else
 #endif
-               *irq = gsi;
+               *irq = gsi_irq_sharing(gsi);
        return 0;
 }
 
@@ -543,7 +542,7 @@ acpi_scan_rsdp(unsigned long start, unsigned long length)
         * RSDP signature.
         */
        for (offset = 0; offset < length; offset += 16) {
-               if (strncmp((char *)(start + offset), "RSD PTR ", sig_len))
+               if (strncmp((char *)(phys_to_virt(start) + offset), "RSD PTR ", sig_len))
                        continue;
                return (start + offset);
        }
index 003548b8735f961b24794da2306bff45944ee63e..1e60acbed3c1468189d6323437a03420383deb25 100644 (file)
 #include <linux/time.h>
 #include <linux/sched.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/smp.h>
index 53a1681cd9648daf41bd218bbd7241bf746275e4..e344ef88cfcdd404383965207e7eaa18372c5b41 100644 (file)
@@ -206,9 +206,9 @@ static void __init init_amd(struct cpuinfo_x86 *c)
        display_cacheinfo(c);
 
        if (cpuid_eax(0x80000000) >= 0x80000008) {
-               c->x86_num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
-               if (c->x86_num_cores & (c->x86_num_cores - 1))
-                       c->x86_num_cores = 1;
+               c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
+               if (c->x86_max_cores & (c->x86_max_cores - 1))
+                       c->x86_max_cores = 1;
        }
 
 #ifdef CONFIG_X86_HT
@@ -217,15 +217,15 @@ static void __init init_amd(struct cpuinfo_x86 *c)
         * distingush the cores.  Assumes number of cores is a power
         * of two.
         */
-       if (c->x86_num_cores > 1) {
+       if (c->x86_max_cores > 1) {
                int cpu = smp_processor_id();
                unsigned bits = 0;
-               while ((1 << bits) < c->x86_num_cores)
+               while ((1 << bits) < c->x86_max_cores)
                        bits++;
                cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
                phys_proc_id[cpu] >>= bits;
                printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
-                      cpu, c->x86_num_cores, cpu_core_id[cpu]);
+                      cpu, c->x86_max_cores, cpu_core_id[cpu]);
        }
 #endif
 }
index c145fb30002ed6894d37ffa03b33227166337243..31e344b26bae824f255baa1446980486d8aff52a 100644 (file)
@@ -231,10 +231,10 @@ static void __init early_cpu_detect(void)
                cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
                c->x86 = (tfms >> 8) & 15;
                c->x86_model = (tfms >> 4) & 15;
-               if (c->x86 == 0xf) {
+               if (c->x86 == 0xf)
                        c->x86 += (tfms >> 20) & 0xff;
+               if (c->x86 >= 0x6)
                        c->x86_model += ((tfms >> 16) & 0xF) << 4;
-               }
                c->x86_mask = tfms & 15;
                if (cap0 & (1<<19))
                        c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
@@ -333,7 +333,7 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
        c->x86_model = c->x86_mask = 0; /* So far unknown... */
        c->x86_vendor_id[0] = '\0'; /* Unset */
        c->x86_model_id[0] = '\0';  /* Unset */
-       c->x86_num_cores = 1;
+       c->x86_max_cores = 1;
        memset(&c->x86_capability, 0, sizeof c->x86_capability);
 
        if (!have_cpuid_p()) {
@@ -443,52 +443,44 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
 void __devinit detect_ht(struct cpuinfo_x86 *c)
 {
        u32     eax, ebx, ecx, edx;
-       int     index_msb, tmp;
+       int     index_msb, core_bits;
        int     cpu = smp_processor_id();
 
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+
+       c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
+
        if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
                return;
 
-       cpuid(1, &eax, &ebx, &ecx, &edx);
        smp_num_siblings = (ebx & 0xff0000) >> 16;
 
        if (smp_num_siblings == 1) {
                printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
        } else if (smp_num_siblings > 1 ) {
-               index_msb = 31;
 
                if (smp_num_siblings > NR_CPUS) {
                        printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
                        smp_num_siblings = 1;
                        return;
                }
-               tmp = smp_num_siblings;
-               while ((tmp & 0x80000000 ) == 0) {
-                       tmp <<=1 ;
-                       index_msb--;
-               }
-               if (smp_num_siblings & (smp_num_siblings - 1))
-                       index_msb++;
+
+               index_msb = get_count_order(smp_num_siblings);
                phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
 
                printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
                       phys_proc_id[cpu]);
 
-               smp_num_siblings = smp_num_siblings / c->x86_num_cores;
+               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
 
-               tmp = smp_num_siblings;
-               index_msb = 31;
-               while ((tmp & 0x80000000) == 0) {
-                       tmp <<=1 ;
-                       index_msb--;
-               }
+               index_msb = get_count_order(smp_num_siblings) ;
 
-               if (smp_num_siblings & (smp_num_siblings - 1))
-                       index_msb++;
+               core_bits = get_count_order(c->x86_max_cores);
 
-               cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
+               cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
+                                              ((1 << core_bits) - 1);
 
-               if (c->x86_num_cores > 1)
+               if (c->x86_max_cores > 1)
                        printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
                               cpu_core_id[cpu]);
        }
index 43601de0f6331415aaa8b19594112a3de080ae4f..5e2da704f0faa8200fa744e39d8ffb86dd860542 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/bitops.h>
 #include <linux/smp.h>
 #include <linux/thread_info.h>
+#include <linux/module.h>
 
 #include <asm/processor.h>
 #include <asm/msr.h>
@@ -157,7 +158,7 @@ static void __devinit init_intel(struct cpuinfo_x86 *c)
        if ( p )
                strcpy(c->x86_model_id, p);
        
-       c->x86_num_cores = num_cpu_cores(c);
+       c->x86_max_cores = num_cpu_cores(c);
 
        detect_ht(c);
 
@@ -264,5 +265,52 @@ __init int intel_cpu_init(void)
        return 0;
 }
 
+#ifndef CONFIG_X86_CMPXCHG
+unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new)
+{
+       u8 prev;
+       unsigned long flags;
+
+       /* Poor man's cmpxchg for 386. Unsuitable for SMP */
+       local_irq_save(flags);
+       prev = *(u8 *)ptr;
+       if (prev == old)
+               *(u8 *)ptr = new;
+       local_irq_restore(flags);
+       return prev;
+}
+EXPORT_SYMBOL(cmpxchg_386_u8);
+
+unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new)
+{
+       u16 prev;
+       unsigned long flags;
+
+       /* Poor man's cmpxchg for 386. Unsuitable for SMP */
+       local_irq_save(flags);
+       prev = *(u16 *)ptr;
+       if (prev == old)
+               *(u16 *)ptr = new;
+       local_irq_restore(flags);
+       return prev;
+}
+EXPORT_SYMBOL(cmpxchg_386_u16);
+
+unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new)
+{
+       u32 prev;
+       unsigned long flags;
+
+       /* Poor man's cmpxchg for 386. Unsuitable for SMP */
+       local_irq_save(flags);
+       prev = *(u32 *)ptr;
+       if (prev == old)
+               *(u32 *)ptr = new;
+       local_irq_restore(flags);
+       return prev;
+}
+EXPORT_SYMBOL(cmpxchg_386_u32);
+#endif
+
 // arch_initcall(intel_cpu_init);
 
index 4dc42a189ae5ebefc3b3f0595211a51a2182f8be..fbfd374aa336aff467612054031a19356b41b1a7 100644 (file)
@@ -293,29 +293,45 @@ static struct _cpuid4_info *cpuid4_info[NR_CPUS];
 #ifdef CONFIG_SMP
 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
 {
-       struct _cpuid4_info     *this_leaf;
+       struct _cpuid4_info     *this_leaf, *sibling_leaf;
        unsigned long num_threads_sharing;
-#ifdef CONFIG_X86_HT
-       struct cpuinfo_x86 *c = cpu_data + cpu;
-#endif
+       int index_msb, i;
+       struct cpuinfo_x86 *c = cpu_data;
 
        this_leaf = CPUID4_INFO_IDX(cpu, index);
        num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
 
        if (num_threads_sharing == 1)
                cpu_set(cpu, this_leaf->shared_cpu_map);
-#ifdef CONFIG_X86_HT
-       else if (num_threads_sharing == smp_num_siblings)
-               this_leaf->shared_cpu_map = cpu_sibling_map[cpu];
-       else if (num_threads_sharing == (c->x86_num_cores * smp_num_siblings))
-               this_leaf->shared_cpu_map = cpu_core_map[cpu];
-       else
-               printk(KERN_DEBUG "Number of CPUs sharing cache didn't match "
-                               "any known set of CPUs\n");
-#endif
+       else {
+               index_msb = get_count_order(num_threads_sharing);
+
+               for_each_online_cpu(i) {
+                       if (c[i].apicid >> index_msb ==
+                           c[cpu].apicid >> index_msb) {
+                               cpu_set(i, this_leaf->shared_cpu_map);
+                               if (i != cpu && cpuid4_info[i])  {
+                                       sibling_leaf = CPUID4_INFO_IDX(i, index);
+                                       cpu_set(cpu, sibling_leaf->shared_cpu_map);
+                               }
+                       }
+               }
+       }
+}
+static void __devinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
+{
+       struct _cpuid4_info     *this_leaf, *sibling_leaf;
+       int sibling;
+
+       this_leaf = CPUID4_INFO_IDX(cpu, index);
+       for_each_cpu_mask(sibling, this_leaf->shared_cpu_map) {
+               sibling_leaf = CPUID4_INFO_IDX(sibling, index); 
+               cpu_clear(cpu, sibling_leaf->shared_cpu_map);
+       }
 }
 #else
 static void __init cache_shared_cpu_map_setup(unsigned int cpu, int index) {}
+static void __init cache_remove_shared_cpu_map(unsigned int cpu, int index) {}
 #endif
 
 static void free_cache_attributes(unsigned int cpu)
@@ -574,8 +590,10 @@ static void __cpuexit cache_remove_dev(struct sys_device * sys_dev)
        unsigned int cpu = sys_dev->id;
        unsigned long i;
 
-       for (i = 0; i < num_cache_leaves; i++)
+       for (i = 0; i < num_cache_leaves; i++) {
+               cache_remove_shared_cpu_map(cpu, i);
                kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj));
+       }
        kobject_unregister(cache_kobject[cpu]);
        cpuid4_cache_sysfs_exit(cpu);
        return;
index dd4ebd6af7e4cc5e014dff4ab72a3a1ac2650619..1e9db198c440e3a1dac2c5bdcbe38038a31f3c26 100644 (file)
@@ -626,6 +626,14 @@ void __init mtrr_bp_init(void)
                if (cpuid_eax(0x80000000) >= 0x80000008) {
                        u32 phys_addr;
                        phys_addr = cpuid_eax(0x80000008) & 0xff;
+                       /* CPUID workaround for Intel 0F33/0F34 CPU */
+                       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
+                           boot_cpu_data.x86 == 0xF &&
+                           boot_cpu_data.x86_model == 0x3 &&
+                           (boot_cpu_data.x86_mask == 0x3 ||
+                            boot_cpu_data.x86_mask == 0x4))
+                               phys_addr = 36;
+
                        size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
                        size_and_mask = ~size_or_mask & 0xfff00000;
                } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
index 41b871ecf4b353ddd1e0dfa0f366e7668cdc220c..e7921315ae9d8fe5df562cc745f908b6081ed1ab 100644 (file)
@@ -94,12 +94,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
        if (c->x86_cache_size >= 0)
                seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
 #ifdef CONFIG_X86_HT
-       if (c->x86_num_cores * smp_num_siblings > 1) {
+       if (c->x86_max_cores * smp_num_siblings > 1) {
                seq_printf(m, "physical id\t: %d\n", phys_proc_id[n]);
-               seq_printf(m, "siblings\t: %d\n",
-                               c->x86_num_cores * smp_num_siblings);
+               seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[n]));
                seq_printf(m, "core id\t\t: %d\n", cpu_core_id[n]);
-               seq_printf(m, "cpu cores\t: %d\n", c->x86_num_cores);
+               seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
        }
 #endif
        
index af809ccf5fbe14d526dfca29be0a3a160c6eacd4..0248e084017ceddd74bcc7e92052cef801b897ff 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/hardirq.h>
 #include <asm/nmi.h>
 #include <asm/hw_irq.h>
+#include <asm/apic.h>
 #include <mach_ipi.h>
 
 
@@ -147,6 +148,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu)
                regs = &fixed_regs;
        }
        crash_save_this_cpu(regs, cpu);
+       disable_local_APIC();
        atomic_dec(&waiting_for_crash_ipi);
        /* Assume hlt works */
        halt();
@@ -186,6 +188,7 @@ static void nmi_shootdown_cpus(void)
        }
 
        /* Leave the nmi callback set */
+       disable_local_APIC();
 }
 #else
 static void nmi_shootdown_cpus(void)
@@ -210,5 +213,9 @@ void machine_crash_shutdown(struct pt_regs *regs)
        /* Make a note of crashing cpu. Will be used in NMI callback.*/
        crashing_cpu = smp_processor_id();
        nmi_shootdown_cpus();
+       lapic_shutdown();
+#if defined(CONFIG_X86_IO_APIC)
+       disable_IO_APIC();
+#endif
        crash_save_self(regs);
 }
index 9e24f7b207ee1636eabcafc48f6f630b56ed8d3e..e50b93155249b79732378ccbc6d4bc41c2d74207 100644 (file)
@@ -560,11 +560,10 @@ nmi_stack_fixup:
 nmi_debug_stack_check:
        cmpw $__KERNEL_CS,16(%esp)
        jne nmi_stack_correct
-       cmpl $debug - 1,(%esp)
-       jle nmi_stack_correct
+       cmpl $debug,(%esp)
+       jb nmi_stack_correct
        cmpl $debug_esp_fix_insn,(%esp)
-       jle nmi_debug_stack_fixup
-nmi_debug_stack_fixup:
+       ja nmi_stack_correct
        FIX_STACK(24,nmi_stack_correct, 1)
        jmp nmi_stack_correct
 
index bc5a9d97466b572cf5e6755fc5e5de0eb828b11f..d16520da4550e6d1b5d318a56a2f1ba1b852728c 100644 (file)
@@ -72,9 +72,11 @@ int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
 /* Core ID of each logical CPU */
 int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
 
+/* representing HT siblings of each logical CPU */
 cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
 EXPORT_SYMBOL(cpu_sibling_map);
 
+/* representing HT and core siblings of each logical CPU */
 cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
 EXPORT_SYMBOL(cpu_core_map);
 
@@ -442,35 +444,60 @@ static void __devinit smp_callin(void)
 
 static int cpucount;
 
+/* representing cpus for which sibling maps can be computed */
+static cpumask_t cpu_sibling_setup_map;
+
 static inline void
 set_cpu_sibling_map(int cpu)
 {
        int i;
+       struct cpuinfo_x86 *c = cpu_data;
+
+       cpu_set(cpu, cpu_sibling_setup_map);
 
        if (smp_num_siblings > 1) {
-               for (i = 0; i < NR_CPUS; i++) {
-                       if (!cpu_isset(i, cpu_callout_map))
-                               continue;
-                       if (cpu_core_id[cpu] == cpu_core_id[i]) {
+               for_each_cpu_mask(i, cpu_sibling_setup_map) {
+                       if (phys_proc_id[cpu] == phys_proc_id[i] &&
+                           cpu_core_id[cpu] == cpu_core_id[i]) {
                                cpu_set(i, cpu_sibling_map[cpu]);
                                cpu_set(cpu, cpu_sibling_map[i]);
+                               cpu_set(i, cpu_core_map[cpu]);
+                               cpu_set(cpu, cpu_core_map[i]);
                        }
                }
        } else {
                cpu_set(cpu, cpu_sibling_map[cpu]);
        }
 
-       if (current_cpu_data.x86_num_cores > 1) {
-               for (i = 0; i < NR_CPUS; i++) {
-                       if (!cpu_isset(i, cpu_callout_map))
-                               continue;
-                       if (phys_proc_id[cpu] == phys_proc_id[i]) {
-                               cpu_set(i, cpu_core_map[cpu]);
-                               cpu_set(cpu, cpu_core_map[i]);
-                       }
-               }
-       } else {
+       if (current_cpu_data.x86_max_cores == 1) {
                cpu_core_map[cpu] = cpu_sibling_map[cpu];
+               c[cpu].booted_cores = 1;
+               return;
+       }
+
+       for_each_cpu_mask(i, cpu_sibling_setup_map) {
+               if (phys_proc_id[cpu] == phys_proc_id[i]) {
+                       cpu_set(i, cpu_core_map[cpu]);
+                       cpu_set(cpu, cpu_core_map[i]);
+                       /*
+                        *  Does this new cpu bringup a new core?
+                        */
+                       if (cpus_weight(cpu_sibling_map[cpu]) == 1) {
+                               /*
+                                * for each core in package, increment
+                                * the booted_cores for this new cpu
+                                */
+                               if (first_cpu(cpu_sibling_map[i]) == i)
+                                       c[cpu].booted_cores++;
+                               /*
+                                * increment the core count for all
+                                * the other cpus in this package
+                                */
+                               if (i != cpu)
+                                       c[i].booted_cores++;
+                       } else if (i != cpu && !c[cpu].booted_cores)
+                               c[cpu].booted_cores = c[i].booted_cores;
+               }
        }
 }
 
@@ -1095,11 +1122,8 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
 
        current_thread_info()->cpu = 0;
        smp_tune_scheduling();
-       cpus_clear(cpu_sibling_map[0]);
-       cpu_set(0, cpu_sibling_map[0]);
 
-       cpus_clear(cpu_core_map[0]);
-       cpu_set(0, cpu_core_map[0]);
+       set_cpu_sibling_map(0);
 
        /*
         * If we couldn't find an SMP configuration at boot time,
@@ -1278,15 +1302,24 @@ static void
 remove_siblinginfo(int cpu)
 {
        int sibling;
+       struct cpuinfo_x86 *c = cpu_data;
 
+       for_each_cpu_mask(sibling, cpu_core_map[cpu]) {
+               cpu_clear(cpu, cpu_core_map[sibling]);
+               /*
+                * last thread sibling in this cpu core going down
+                */
+               if (cpus_weight(cpu_sibling_map[cpu]) == 1)
+                       c[sibling].booted_cores--;
+       }
+                       
        for_each_cpu_mask(sibling, cpu_sibling_map[cpu])
                cpu_clear(cpu, cpu_sibling_map[sibling]);
-       for_each_cpu_mask(sibling, cpu_core_map[cpu])
-               cpu_clear(cpu, cpu_core_map[sibling]);
        cpus_clear(cpu_sibling_map[cpu]);
        cpus_clear(cpu_core_map[cpu]);
        phys_proc_id[cpu] = BAD_APICID;
        cpu_core_id[cpu] = BAD_APICID;
+       cpu_clear(cpu, cpu_sibling_setup_map);
 }
 
 int __cpu_disable(void)
index 8de658db814624b012cf31cd387d461cf1605686..52b3ed5d2cb53c88bb6a48659ac91901bc872d41 100644 (file)
@@ -137,8 +137,8 @@ static void __init parse_memory_affinity_structure (char *sratp)
                 "enabled and removable" : "enabled" ) );
 }
 
-#if MAX_NR_ZONES != 3
-#error "MAX_NR_ZONES != 3, chunk_to_zone requires review"
+#if MAX_NR_ZONES != 4
+#error "MAX_NR_ZONES != 4, chunk_to_zone requires review"
 #endif
 /* Take a chunk of pages from page frame cstart to cend and count the number
  * of pages in each zone, returned via zones[].
index e42e46d351591d583782921f6b30e5b302b2285a..b9b6bd56b9bafc27b2be1d3dd2621c4a47a8a782 100644 (file)
@@ -25,8 +25,9 @@ static int __init init_pit(char* override)
 {
        /* check clock override */
        if (override[0] && strncmp(override,"pit",3))
-               printk(KERN_ERR "Warning: clock= override failed. Defaulting to PIT\n");
+               printk(KERN_ERR "Warning: clock= override failed. Defaulting "
+                               "to PIT\n");
+       init_cpu_khz();
        count_p = LATCH;
        return 0;
 }
index 542d9298da5e91571bf75f45152e8901d473a684..06e26f0062382301e02c13a6c2fa24617a48b663 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/proc_fs.h>
 #include <linux/efi.h>
 #include <linux/memory_hotplug.h>
+#include <linux/initrd.h>
 
 #include <asm/processor.h>
 #include <asm/system.h>
@@ -267,7 +268,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)
        pkmap_page_table = pte; 
 }
 
-void __devinit free_new_highpage(struct page *page)
+static void __devinit free_new_highpage(struct page *page)
 {
        set_page_count(page, 1);
        __free_page(page);
index 3984226a8b98f432ec83a1222c4701a671de01e5..eeb1b1f2d548bf96471ed2b947f6db3f682bcbab 100644 (file)
@@ -433,9 +433,8 @@ static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
                return; /* only applies to certain Toshibas (so far) */
 
        /* Restore config space on Toshiba laptops */
-       mdelay(10);
        pci_write_config_word(dev, PCI_CACHE_LINE_SIZE, toshiba_line_size);
-       pci_write_config_word(dev, PCI_INTERRUPT_LINE, dev->irq);
+       pci_read_config_byte(dev, PCI_INTERRUPT_LINE, (u8 *)&dev->irq);
        pci_write_config_dword(dev, PCI_BASE_ADDRESS_0,
                               pci_resource_start(dev, 0));
        pci_write_config_dword(dev, PCI_BASE_ADDRESS_1,
index d4de8a4814be36781c9b266c8205d01123e0ad9f..b76ce1fe2e7f31c04858901fac13dd66e7efff29 100644 (file)
@@ -58,6 +58,10 @@ config IA64_UNCACHED_ALLOCATOR
        bool
        select GENERIC_ALLOCATOR
 
+config ZONE_DMA_IS_DMA32
+       bool
+       default y
+
 choice
        prompt "System type"
        default IA64_GENERIC
@@ -164,6 +168,19 @@ config IA64_PAGE_SIZE_64KB
 
 endchoice
 
+choice
+       prompt "Page Table Levels"
+       default PGTABLE_3
+
+config PGTABLE_3
+       bool "3 Levels"
+
+config PGTABLE_4
+       depends on !IA64_PAGE_SIZE_64KB
+       bool "4 Levels"
+
+endchoice
+
 source kernel/Kconfig.hz
 
 config IA64_BRL_EMU
index 08112ab384686d9e204b31f40f1126a7550e7e71..87cfd31a4a3932a401d6e69d5dd0c86bd843112d 100644 (file)
@@ -80,6 +80,8 @@ CONFIG_MCKINLEY=y
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+# CONFIG_PGTABLE_3 is not set
+CONFIG_PGTABLE_4=y
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
index 6e3f147e03e57b51b785ed67ae2ce5a7fc369a8e..275a26c6e5aa5eec4ef4d3c8c15ccf62ca6dd861 100644 (file)
@@ -82,6 +82,8 @@ CONFIG_MCKINLEY=y
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+CONFIG_PGTABLE_3=y
+# CONFIG_PGTABLE_4 is not set
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
index f72ea6aebcb15bb3bf0213ff0d1829863c8e418d..a3aa45cbcfa03e460dab2d8696259126688407fb 100644 (file)
@@ -987,7 +987,7 @@ efi_initialize_iomem_resources(struct resource *code_resource,
                                break;
                }
 
-               if ((res = kcalloc(1, sizeof(struct resource), GFP_KERNEL)) == NULL) {
+               if ((res = kzalloc(sizeof(struct resource), GFP_KERNEL)) == NULL) {
                        printk(KERN_ERR "failed to alocate resource for iomem\n");
                        return;
                }
index c13ca0d49c4a04be59c32e2317149264fda092fa..301f2e9d262edbf57ccb07e9afc47cc5b24bb160 100644 (file)
@@ -91,16 +91,17 @@ ENTRY(vhpt_miss)
         * (the "original") TLB miss, which may either be caused by an instruction
         * fetch or a data access (or non-access).
         *
-        * What we do here is normal TLB miss handing for the _original_ miss, followed
-        * by inserting the TLB entry for the virtual page table page that the VHPT
-        * walker was attempting to access.  The latter gets inserted as long
-        * as both L1 and L2 have valid mappings for the faulting address.
-        * The TLB entry for the original miss gets inserted only if
-        * the L3 entry indicates that the page is present.
+        * What we do here is normal TLB miss handing for the _original_ miss,
+        * followed by inserting the TLB entry for the virtual page table page
+        * that the VHPT walker was attempting to access.  The latter gets
+        * inserted as long as page table entry above pte level have valid
+        * mappings for the faulting address.  The TLB entry for the original
+        * miss gets inserted only if the pte entry indicates that the page is
+        * present.
         *
         * do_page_fault gets invoked in the following cases:
         *      - the faulting virtual address uses unimplemented address bits
-        *      - the faulting virtual address has no L1, L2, or L3 mapping
+        *      - the faulting virtual address has no valid page table mapping
         */
        mov r16=cr.ifa                          // get address that caused the TLB miss
 #ifdef CONFIG_HUGETLB_PAGE
@@ -114,7 +115,7 @@ ENTRY(vhpt_miss)
        shl r21=r16,3                           // shift bit 60 into sign bit
        shr.u r17=r16,61                        // get the region number into r17
        ;;
-       shr r22=r21,3
+       shr.u r22=r21,3
 #ifdef CONFIG_HUGETLB_PAGE
        extr.u r26=r25,2,6
        ;;
@@ -126,7 +127,7 @@ ENTRY(vhpt_miss)
 #endif
        ;;
        cmp.eq p6,p7=5,r17                      // is IFA pointing into to region 5?
-       shr.u r18=r22,PGDIR_SHIFT               // get bits 33-63 of the faulting address
+       shr.u r18=r22,PGDIR_SHIFT               // get bottom portion of pgd index bit
        ;;
 (p7)   dep r17=r17,r19,(PAGE_SHIFT-3),3        // put region number bits in place
 
@@ -137,24 +138,38 @@ ENTRY(vhpt_miss)
 (p6)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
 (p7)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
        ;;
-(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=PTA + IFA(33,42)*8
-(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
+(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=pgd_offset for region 5
+(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=pgd_offset for region[0-4]
        cmp.eq p7,p6=0,r21                      // unused address bits all zeroes?
-       shr.u r18=r22,PMD_SHIFT                 // shift L2 index into position
+#ifdef CONFIG_PGTABLE_4
+       shr.u r28=r22,PUD_SHIFT                 // shift pud index into position
+#else
+       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
+#endif
+       ;;
+       ld8 r17=[r17]                           // get *pgd (may be 0)
+       ;;
+(p7)   cmp.eq p6,p7=r17,r0                     // was pgd_present(*pgd) == NULL?
+#ifdef CONFIG_PGTABLE_4
+       dep r28=r28,r17,3,(PAGE_SHIFT-3)        // r28=pud_offset(pgd,addr)
        ;;
-       ld8 r17=[r17]                           // fetch the L1 entry (may be 0)
+       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
+(p7)   ld8 r29=[r28]                           // get *pud (may be 0)
        ;;
-(p7)   cmp.eq p6,p7=r17,r0                     // was L1 entry NULL?
-       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // compute address of L2 page table entry
+(p7)   cmp.eq.or.andcm p6,p7=r29,r0            // was pud_present(*pud) == NULL?
+       dep r17=r18,r29,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pud,addr)
+#else
+       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pgd,addr)
+#endif
        ;;
-(p7)   ld8 r20=[r17]                           // fetch the L2 entry (may be 0)
-       shr.u r19=r22,PAGE_SHIFT                // shift L3 index into position
+(p7)   ld8 r20=[r17]                           // get *pmd (may be 0)
+       shr.u r19=r22,PAGE_SHIFT                // shift pte index into position
        ;;
-(p7)   cmp.eq.or.andcm p6,p7=r20,r0            // was L2 entry NULL?
-       dep r21=r19,r20,3,(PAGE_SHIFT-3)        // compute address of L3 page table entry
+(p7)   cmp.eq.or.andcm p6,p7=r20,r0            // was pmd_present(*pmd) == NULL?
+       dep r21=r19,r20,3,(PAGE_SHIFT-3)        // r21=pte_offset(pmd,addr)
        ;;
-(p7)   ld8 r18=[r21]                           // read the L3 PTE
-       mov r19=cr.isr                          // cr.isr bit 0 tells us if this is an insn miss
+(p7)   ld8 r18=[r21]                           // read *pte
+       mov r19=cr.isr                          // cr.isr bit 32 tells us if this is an insn miss
        ;;
 (p7)   tbit.z p6,p7=r18,_PAGE_P_BIT            // page present bit cleared?
        mov r22=cr.iha                          // get the VHPT address that caused the TLB miss
@@ -188,18 +203,33 @@ ENTRY(vhpt_miss)
        dv_serialize_data
 
        /*
-        * Re-check L2 and L3 pagetable.  If they changed, we may have received a ptc.g
+        * Re-check pagetable entry.  If they changed, we may have received a ptc.g
         * between reading the pagetable and the "itc".  If so, flush the entry we
-        * inserted and retry.
+        * inserted and retry.  At this point, we have:
+        *
+        * r28 = equivalent of pud_offset(pgd, ifa)
+        * r17 = equivalent of pmd_offset(pud, ifa)
+        * r21 = equivalent of pte_offset(pmd, ifa)
+        *
+        * r29 = *pud
+        * r20 = *pmd
+        * r18 = *pte
         */
-       ld8 r25=[r21]                           // read L3 PTE again
-       ld8 r26=[r17]                           // read L2 entry again
+       ld8 r25=[r21]                           // read *pte again
+       ld8 r26=[r17]                           // read *pmd again
+#ifdef CONFIG_PGTABLE_4
+       ld8 r19=[r28]                           // read *pud again
+#endif
+       cmp.ne p6,p7=r0,r0
        ;;
-       cmp.ne p6,p7=r26,r20                    // did L2 entry change
+       cmp.ne.or.andcm p6,p7=r26,r20           // did *pmd change
+#ifdef CONFIG_PGTABLE_4
+       cmp.ne.or.andcm p6,p7=r19,r29           // did *pud change
+#endif
        mov r27=PAGE_SHIFT<<2
        ;;
 (p6)   ptc.l r22,r27                           // purge PTE page translation
-(p7)   cmp.ne.or.andcm p6,p7=r25,r18           // did L3 PTE change
+(p7)   cmp.ne.or.andcm p6,p7=r25,r18           // did *pte change
        ;;
 (p6)   ptc.l r16,r27                           // purge translation
 #endif
@@ -214,19 +244,19 @@ END(vhpt_miss)
 ENTRY(itlb_miss)
        DBG_FAULT(1)
        /*
-        * The ITLB handler accesses the L3 PTE via the virtually mapped linear
+        * The ITLB handler accesses the PTE via the virtually mapped linear
         * page table.  If a nested TLB miss occurs, we switch into physical
-        * mode, walk the page table, and then re-execute the L3 PTE read
-        * and go on normally after that.
+        * mode, walk the page table, and then re-execute the PTE read and
+        * go on normally after that.
         */
        mov r16=cr.ifa                          // get virtual address
        mov r29=b0                              // save b0
        mov r31=pr                              // save predicates
 .itlb_fault:
-       mov r17=cr.iha                          // get virtual address of L3 PTE
+       mov r17=cr.iha                          // get virtual address of PTE
        movl r30=1f                             // load nested fault continuation point
        ;;
-1:     ld8 r18=[r17]                           // read L3 PTE
+1:     ld8 r18=[r17]                           // read *pte
        ;;
        mov b0=r29
        tbit.z p6,p0=r18,_PAGE_P_BIT            // page present bit cleared?
@@ -241,7 +271,7 @@ ENTRY(itlb_miss)
         */
        dv_serialize_data
 
-       ld8 r19=[r17]                           // read L3 PTE again and see if same
+       ld8 r19=[r17]                           // read *pte again and see if same
        mov r20=PAGE_SHIFT<<2                   // setup page size for purge
        ;;
        cmp.ne p7,p0=r18,r19
@@ -258,19 +288,19 @@ END(itlb_miss)
 ENTRY(dtlb_miss)
        DBG_FAULT(2)
        /*
-        * The DTLB handler accesses the L3 PTE via the virtually mapped linear
+        * The DTLB handler accesses the PTE via the virtually mapped linear
         * page table.  If a nested TLB miss occurs, we switch into physical
-        * mode, walk the page table, and then re-execute the L3 PTE read
-        * and go on normally after that.
+        * mode, walk the page table, and then re-execute the PTE read and
+        * go on normally after that.
         */
        mov r16=cr.ifa                          // get virtual address
        mov r29=b0                              // save b0
        mov r31=pr                              // save predicates
 dtlb_fault:
-       mov r17=cr.iha                          // get virtual address of L3 PTE
+       mov r17=cr.iha                          // get virtual address of PTE
        movl r30=1f                             // load nested fault continuation point
        ;;
-1:     ld8 r18=[r17]                           // read L3 PTE
+1:     ld8 r18=[r17]                           // read *pte
        ;;
        mov b0=r29
        tbit.z p6,p0=r18,_PAGE_P_BIT            // page present bit cleared?
@@ -285,7 +315,7 @@ dtlb_fault:
         */
        dv_serialize_data
 
-       ld8 r19=[r17]                           // read L3 PTE again and see if same
+       ld8 r19=[r17]                           // read *pte again and see if same
        mov r20=PAGE_SHIFT<<2                   // setup page size for purge
        ;;
        cmp.ne p7,p0=r18,r19
@@ -399,7 +429,7 @@ ENTRY(nested_dtlb_miss)
         *              r30:    continuation address
         *              r31:    saved pr
         *
-        * Output:      r17:    physical address of L3 PTE of faulting address
+        * Output:      r17:    physical address of PTE of faulting address
         *              r29:    saved b0
         *              r30:    continuation address
         *              r31:    saved pr
@@ -429,21 +459,33 @@ ENTRY(nested_dtlb_miss)
 (p6)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
 (p7)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
        ;;
-(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=PTA + IFA(33,42)*8
-(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
+(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=pgd_offset for region 5
+(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=pgd_offset for region[0-4]
        cmp.eq p7,p6=0,r21                      // unused address bits all zeroes?
-       shr.u r18=r22,PMD_SHIFT                 // shift L2 index into position
+#ifdef CONFIG_PGTABLE_4
+       shr.u r18=r22,PUD_SHIFT                 // shift pud index into position
+#else
+       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
+#endif
        ;;
-       ld8 r17=[r17]                           // fetch the L1 entry (may be 0)
+       ld8 r17=[r17]                           // get *pgd (may be 0)
        ;;
-(p7)   cmp.eq p6,p7=r17,r0                     // was L1 entry NULL?
-       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // compute address of L2 page table entry
+(p7)   cmp.eq p6,p7=r17,r0                     // was pgd_present(*pgd) == NULL?
+       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=p[u|m]d_offset(pgd,addr)
        ;;
-(p7)   ld8 r17=[r17]                           // fetch the L2 entry (may be 0)
-       shr.u r19=r22,PAGE_SHIFT                // shift L3 index into position
+#ifdef CONFIG_PGTABLE_4
+(p7)   ld8 r17=[r17]                           // get *pud (may be 0)
+       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
+       ;;
+(p7)   cmp.eq.or.andcm p6,p7=r17,r0            // was pud_present(*pud) == NULL?
+       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pud,addr)
+       ;;
+#endif
+(p7)   ld8 r17=[r17]                           // get *pmd (may be 0)
+       shr.u r19=r22,PAGE_SHIFT                // shift pte index into position
        ;;
-(p7)   cmp.eq.or.andcm p6,p7=r17,r0            // was L2 entry NULL?
-       dep r17=r19,r17,3,(PAGE_SHIFT-3)        // compute address of L3 page table entry
+(p7)   cmp.eq.or.andcm p6,p7=r17,r0            // was pmd_present(*pmd) == NULL?
+       dep r17=r19,r17,3,(PAGE_SHIFT-3)        // r17=pte_offset(pmd,addr);
 (p6)   br.cond.spnt page_fault
        mov b0=r30
        br.sptk.many b0                         // return to continuation point
index 96736a119c911e22fcbab6d6e7aabb1529a04a9a..801eeaeaf3de6c760905361ec61b9ad7eb8ebaf5 100644 (file)
@@ -347,7 +347,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
                ((struct fnptr *)kretprobe_trampoline)->ip;
 
        spin_lock_irqsave(&kretprobe_lock, flags);
-        head = kretprobe_inst_table_head(current);
+       head = kretprobe_inst_table_head(current);
 
        /*
         * It is possible to have multiple instances associated with a given
@@ -363,9 +363,9 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
         *       kretprobe_trampoline
         */
        hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
-                if (ri->task != current)
+               if (ri->task != current)
                        /* another task is sharing our hash bucket */
-                        continue;
+                       continue;
 
                if (ri->rp && ri->rp->handler)
                        ri->rp->handler(ri, regs);
@@ -394,7 +394,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
         * kprobe_handler() that we don't want the post_handler
         * to run (and have re-enabled preemption)
         */
-        return 1;
+       return 1;
 }
 
 /* Called with kretprobe_lock held */
@@ -739,12 +739,16 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
 
        switch(val) {
        case DIE_BREAK:
-               if (pre_kprobes_handler(args))
-                       ret = NOTIFY_STOP;
+               /* err is break number from ia64_bad_break() */
+               if (args->err == 0x80200 || args->err == 0x80300)
+                       if (pre_kprobes_handler(args))
+                               ret = NOTIFY_STOP;
                break;
-       case DIE_SS:
-               if (post_kprobes_handler(args->regs))
-                       ret = NOTIFY_STOP;
+       case DIE_FAULT:
+               /* err is vector number from ia64_fault() */
+               if (args->err == 36)
+                       if (post_kprobes_handler(args->regs))
+                               ret = NOTIFY_STOP;
                break;
        case DIE_PAGE_FAULT:
                /* kprobe_running() needs smp_processor_id() */
index 52c47da17246ace5033f519670ea028a7474f214..355af15287c7eb318f08382cf6d695a6bb677524 100644 (file)
@@ -51,6 +51,9 @@
  *
  * 2005-08-12 Keith Owens <kaos@sgi.com>
  *           Convert MCA/INIT handlers to use per event stacks and SAL/OS state.
+ *
+ * 2005-10-07 Keith Owens <kaos@sgi.com>
+ *           Add notify_die() hooks.
  */
 #include <linux/config.h>
 #include <linux/types.h>
@@ -58,7 +61,6 @@
 #include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
-#include <linux/kallsyms.h>
 #include <linux/smp_lock.h>
 #include <linux/bootmem.h>
 #include <linux/acpi.h>
@@ -69,6 +71,7 @@
 #include <linux/workqueue.h>
 
 #include <asm/delay.h>
+#include <asm/kdebug.h>
 #include <asm/machvec.h>
 #include <asm/meminit.h>
 #include <asm/page.h>
@@ -132,6 +135,14 @@ extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe);
 
 static int mca_init;
 
+
+static void inline
+ia64_mca_spin(const char *func)
+{
+       printk(KERN_EMERG "%s: spinning here, not returning to SAL\n", func);
+       while (1)
+               cpu_relax();
+}
 /*
  * IA64_MCA log support
  */
@@ -526,13 +537,16 @@ ia64_mca_wakeup_all(void)
  *  Outputs :   None
  */
 static irqreturn_t
-ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs)
+ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs)
 {
        unsigned long flags;
        int cpu = smp_processor_id();
 
        /* Mask all interrupts */
        local_irq_save(flags);
+       if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
 
        ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE;
        /* Register with the SAL monarch that the slave has
@@ -540,10 +554,18 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs)
         */
        ia64_sal_mc_rendez();
 
+       if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
+
        /* Wait for the monarch cpu to exit. */
        while (monarch_cpu != -1)
               cpu_relax();     /* spin until monarch leaves */
 
+       if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
+
        /* Enable all interrupts */
        local_irq_restore(flags);
        return IRQ_HANDLED;
@@ -933,6 +955,9 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
        oops_in_progress = 1;   /* FIXME: make printk NMI/MCA/INIT safe */
        previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA");
        monarch_cpu = cpu;
+       if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
        ia64_wait_for_slaves(cpu);
 
        /* Wakeup all the processors which are spinning in the rendezvous loop.
@@ -942,6 +967,9 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
         * spinning in SAL does not work.
         */
        ia64_mca_wakeup_all();
+       if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
 
        /* Get the MCA error record and log it */
        ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA);
@@ -960,6 +988,9 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
                ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA);
                sos->os_status = IA64_MCA_CORRECTED;
        }
+       if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, 0, 0, recover)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
 
        set_curr_task(cpu, previous_current);
        monarch_cpu = -1;
@@ -1188,6 +1219,37 @@ ia64_mca_cpe_poll (unsigned long dummy)
 
 #endif /* CONFIG_ACPI */
 
+static int
+default_monarch_init_process(struct notifier_block *self, unsigned long val, void *data)
+{
+       int c;
+       struct task_struct *g, *t;
+       if (val != DIE_INIT_MONARCH_PROCESS)
+               return NOTIFY_DONE;
+       printk(KERN_ERR "Processes interrupted by INIT -");
+       for_each_online_cpu(c) {
+               struct ia64_sal_os_state *s;
+               t = __va(__per_cpu_mca[c] + IA64_MCA_CPU_INIT_STACK_OFFSET);
+               s = (struct ia64_sal_os_state *)((char *)t + MCA_SOS_OFFSET);
+               g = s->prev_task;
+               if (g) {
+                       if (g->pid)
+                               printk(" %d", g->pid);
+                       else
+                               printk(" %d (cpu %d task 0x%p)", g->pid, task_cpu(g), g);
+               }
+       }
+       printk("\n\n");
+       if (read_trylock(&tasklist_lock)) {
+               do_each_thread (g, t) {
+                       printk("\nBacktrace of pid %d (%s)\n", t->pid, t->comm);
+                       show_stack(t, NULL);
+               } while_each_thread (g, t);
+               read_unlock(&tasklist_lock);
+       }
+       return NOTIFY_DONE;
+}
+
 /*
  * C portion of the OS INIT handler
  *
@@ -1212,8 +1274,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
        static atomic_t slaves;
        static atomic_t monarchs;
        task_t *previous_current;
-       int cpu = smp_processor_id(), c;
-       struct task_struct *g, *t;
+       int cpu = smp_processor_id();
 
        oops_in_progress = 1;   /* FIXME: make printk NMI/MCA/INIT safe */
        console_loglevel = 15;  /* make sure printks make it to console */
@@ -1253,8 +1314,17 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
                ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_INIT;
                while (monarch_cpu == -1)
                       cpu_relax();     /* spin until monarch enters */
+               if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, 0, 0, 0)
+                               == NOTIFY_STOP)
+                       ia64_mca_spin(__FUNCTION__);
+               if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, 0, 0, 0)
+                               == NOTIFY_STOP)
+                       ia64_mca_spin(__FUNCTION__);
                while (monarch_cpu != -1)
                       cpu_relax();     /* spin until monarch leaves */
+               if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, 0, 0, 0)
+                               == NOTIFY_STOP)
+                       ia64_mca_spin(__FUNCTION__);
                printk("Slave on cpu %d returning to normal service.\n", cpu);
                set_curr_task(cpu, previous_current);
                ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
@@ -1263,6 +1333,9 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
        }
 
        monarch_cpu = cpu;
+       if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
 
        /*
         * Wait for a bit.  On some machines (e.g., HP's zx2000 and zx6000, INIT can be
@@ -1273,27 +1346,16 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
        printk("Delaying for 5 seconds...\n");
        udelay(5*1000000);
        ia64_wait_for_slaves(cpu);
-       printk(KERN_ERR "Processes interrupted by INIT -");
-       for_each_online_cpu(c) {
-               struct ia64_sal_os_state *s;
-               t = __va(__per_cpu_mca[c] + IA64_MCA_CPU_INIT_STACK_OFFSET);
-               s = (struct ia64_sal_os_state *)((char *)t + MCA_SOS_OFFSET);
-               g = s->prev_task;
-               if (g) {
-                       if (g->pid)
-                               printk(" %d", g->pid);
-                       else
-                               printk(" %d (cpu %d task 0x%p)", g->pid, task_cpu(g), g);
-               }
-       }
-       printk("\n\n");
-       if (read_trylock(&tasklist_lock)) {
-               do_each_thread (g, t) {
-                       printk("\nBacktrace of pid %d (%s)\n", t->pid, t->comm);
-                       show_stack(t, NULL);
-               } while_each_thread (g, t);
-               read_unlock(&tasklist_lock);
-       }
+       /* If nobody intercepts DIE_INIT_MONARCH_PROCESS then we drop through
+        * to default_monarch_init_process() above and just print all the
+        * tasks.
+        */
+       if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
+       if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, 0, 0, 0)
+                       == NOTIFY_STOP)
+               ia64_mca_spin(__FUNCTION__);
        printk("\nINIT dump complete.  Monarch on cpu %d returning to normal service.\n", cpu);
        atomic_dec(&monarchs);
        set_curr_task(cpu, previous_current);
@@ -1462,6 +1524,10 @@ ia64_mca_init(void)
        s64 rc;
        struct ia64_sal_retval isrv;
        u64 timeout = IA64_MCA_RENDEZ_TIMEOUT;  /* platform specific */
+       static struct notifier_block default_init_monarch_nb = {
+               .notifier_call = default_monarch_init_process,
+               .priority = 0/* we need to notified last */
+       };
 
        IA64_MCA_DEBUG("%s: begin\n", __FUNCTION__);
 
@@ -1555,6 +1621,10 @@ ia64_mca_init(void)
                       "(status %ld)\n", rc);
                return;
        }
+       if (register_die_notifier(&default_init_monarch_nb)) {
+               printk(KERN_ERR "Failed to register default monarch INIT process\n");
+               return;
+       }
 
        IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __FUNCTION__);
 
index eb39bc9c133bd05dbf5adba4017dc286d56e473a..3492e3211a4416ce615a1d0f14810be94aa6178d 100644 (file)
@@ -547,9 +547,20 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
                (pal_processor_state_info_t*)peidx_psp(peidx);
 
        /*
-        * We cannot recover errors with other than bus_check.
+        * Processor recovery status must key off of the PAL recovery
+        * status in the Processor State Parameter.
         */
-       if (psp->cc || psp->rc || psp->uc)
+
+       /*
+        * The machine check is corrected.
+        */
+       if (psp->cm == 1)
+               return 1;
+
+       /*
+        * The error was not contained.  Software must be reset.
+        */
+       if (psp->us || psp->ci == 0)
                return 0;
 
        /*
@@ -570,8 +581,6 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
                return 0;
        if (pbci->eb && pbci->bsi > 0)
                return 0;
-       if (psp->ci == 0)
-               return 0;
 
        /*
         * This is a local MCA and estimated as recoverble external bus error.
index 640d6908f8ec9727525f798fd306af5f981617eb..4305d2ba76f6c61e6301c4df94823c819b30ee52 100644 (file)
@@ -4,6 +4,9 @@
  * Copyright (C) 1998-2003 Hewlett-Packard Co
  *     David Mosberger-Tang <davidm@hpl.hp.com>
  * 04/11/17 Ashok Raj  <ashok.raj@intel.com> Added CPU Hotplug Support
+ *
+ * 2005-10-07 Keith Owens <kaos@sgi.com>
+ *           Add notify_die() hooks.
  */
 #define __KERNEL_SYSCALLS__    /* see <asm/unistd.h> */
 #include <linux/config.h>
@@ -34,6 +37,7 @@
 #include <asm/elf.h>
 #include <asm/ia32.h>
 #include <asm/irq.h>
+#include <asm/kdebug.h>
 #include <asm/pgalloc.h>
 #include <asm/processor.h>
 #include <asm/sal.h>
@@ -198,12 +202,9 @@ default_idle (void)
 {
        local_irq_enable();
        while (!need_resched()) {
-               if (can_do_pal_halt) {
-                       local_irq_disable();
-                       if (!need_resched())
-                               safe_halt();
-                       local_irq_enable();
-               } else
+               if (can_do_pal_halt)
+                       safe_halt();
+               else
                        cpu_relax();
        }
 }
@@ -268,10 +269,14 @@ cpu_idle (void)
 {
        void (*mark_idle)(int) = ia64_mark_idle;
        int cpu = smp_processor_id();
-       set_thread_flag(TIF_POLLING_NRFLAG);
 
        /* endless idle loop with no priority at all */
        while (1) {
+               if (can_do_pal_halt)
+                       clear_thread_flag(TIF_POLLING_NRFLAG);
+               else
+                       set_thread_flag(TIF_POLLING_NRFLAG);
+
                if (!need_resched()) {
                        void (*idle)(void);
 #ifdef CONFIG_SMP
@@ -808,12 +813,14 @@ cpu_halt (void)
 void
 machine_restart (char *restart_cmd)
 {
+       (void) notify_die(DIE_MACHINE_RESTART, restart_cmd, NULL, 0, 0, 0);
        (*efi.reset_system)(EFI_RESET_WARM, 0, 0, NULL);
 }
 
 void
 machine_halt (void)
 {
+       (void) notify_die(DIE_MACHINE_HALT, "", NULL, 0, 0, 0);
        cpu_halt();
 }
 
index 3af6de36a4822e72c537a12f4a8ef6fe6f950ef7..5add0bcf87a7a338974d39fbff41fe68ce3d6956 100644 (file)
@@ -461,6 +461,7 @@ setup_arch (char **cmdline_p)
 #endif
 
        cpu_init();     /* initialize the bootstrap CPU */
+       mmu_context_init();     /* initialize context_id bitmap */
 
 #ifdef CONFIG_ACPI
        acpi_boot_init();
index 774f34b675cfdb3c688e2831b4fb599d1081b2ae..58ce07efc56e060bda10d23498592f960e2858bf 100644 (file)
@@ -387,15 +387,14 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
             struct sigscratch *scr)
 {
        extern char __kernel_sigtramp[];
-       unsigned long tramp_addr, new_rbs = 0;
+       unsigned long tramp_addr, new_rbs = 0, new_sp;
        struct sigframe __user *frame;
        long err;
 
-       frame = (void __user *) scr->pt.r12;
+       new_sp = scr->pt.r12;
        tramp_addr = (unsigned long) __kernel_sigtramp;
-       if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags((unsigned long) frame) == 0) {
-               frame = (void __user *) ((current->sas_ss_sp + current->sas_ss_size)
-                                        & ~(STACK_ALIGN - 1));
+       if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) {
+               new_sp = current->sas_ss_sp + current->sas_ss_size;
                /*
                 * We need to check for the register stack being on the signal stack
                 * separately, because it's switched separately (memory stack is switched
@@ -404,7 +403,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
                if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
                        new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
        }
-       frame = (void __user *) frame - ((sizeof(*frame) + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1));
+       frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return force_sigsegv_info(sig, frame);
index f970359e7edf2fbb67117695c2f7b1a25f86b4d0..fba5fdd1f9689351dda3adf028e864ff8c05c0bf 100644 (file)
@@ -30,17 +30,20 @@ fpswa_interface_t *fpswa_interface;
 EXPORT_SYMBOL(fpswa_interface);
 
 struct notifier_block *ia64die_chain;
-static DEFINE_SPINLOCK(die_notifier_lock);
 
-int register_die_notifier(struct notifier_block *nb)
+int
+register_die_notifier(struct notifier_block *nb)
 {
-       int err = 0;
-       unsigned long flags;
-       spin_lock_irqsave(&die_notifier_lock, flags);
-       err = notifier_chain_register(&ia64die_chain, nb);
-       spin_unlock_irqrestore(&die_notifier_lock, flags);
-       return err;
+       return notifier_chain_register(&ia64die_chain, nb);
 }
+EXPORT_SYMBOL_GPL(register_die_notifier);
+
+int
+unregister_die_notifier(struct notifier_block *nb)
+{
+       return notifier_chain_unregister(&ia64die_chain, nb);
+}
+EXPORT_SYMBOL_GPL(unregister_die_notifier);
 
 void __init
 trap_init (void)
@@ -105,6 +108,7 @@ die (const char *str, struct pt_regs *regs, long err)
        if (++die.lock_owner_depth < 3) {
                printk("%s[%d]: %s %ld [%d]\n",
                        current->comm, current->pid, str, err, ++die_counter);
+               (void) notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV);
                show_regs(regs);
        } else
                printk(KERN_ERR "Recursive die() failure, output suppressed\n");
@@ -155,9 +159,8 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
        switch (break_num) {
              case 0: /* unknown error (used by GCC for __builtin_abort()) */
                if (notify_die(DIE_BREAK, "break 0", regs, break_num, TRAP_BRKPT, SIGTRAP)
-                               == NOTIFY_STOP) {
+                               == NOTIFY_STOP)
                        return;
-               }
                die_if_kernel("bugcheck!", regs, break_num);
                sig = SIGILL; code = ILL_ILLOPC;
                break;
@@ -210,15 +213,6 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
                sig = SIGILL; code = __ILL_BNDMOD;
                break;
 
-             case 0x80200:
-             case 0x80300:
-               if (notify_die(DIE_BREAK, "kprobe", regs, break_num, TRAP_BRKPT, SIGTRAP)
-                               == NOTIFY_STOP) {
-                       return;
-               }
-               sig = SIGTRAP; code = TRAP_BRKPT;
-               break;
-
              default:
                if (break_num < 0x40000 || break_num > 0x100000)
                        die_if_kernel("Bad break", regs, break_num);
@@ -226,6 +220,9 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
                if (break_num < 0x80000) {
                        sig = SIGILL; code = __ILL_BREAK;
                } else {
+                       if (notify_die(DIE_BREAK, "bad break", regs, break_num, TRAP_BRKPT, SIGTRAP)
+                                       == NOTIFY_STOP)
+                               return;
                        sig = SIGTRAP; code = TRAP_BRKPT;
                }
        }
@@ -578,12 +575,11 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
 #endif
                        break;
                      case 35: siginfo.si_code = TRAP_BRANCH; ifa = 0; break;
-                     case 36:
-                             if (notify_die(DIE_SS, "ss", &regs, vector,
-                                            vector, SIGTRAP) == NOTIFY_STOP)
-                                     return;
-                             siginfo.si_code = TRAP_TRACE; ifa = 0; break;
+                     case 36: siginfo.si_code = TRAP_TRACE; ifa = 0; break;
                }
+               if (notify_die(DIE_FAULT, "ia64_fault", &regs, vector, siginfo.si_code, SIGTRAP)
+                               == NOTIFY_STOP)
+                       return;
                siginfo.si_signo = SIGTRAP;
                siginfo.si_errno = 0;
                siginfo.si_addr  = (void __user *) ifa;
index a88cdb7232f8ea1586473973c65f9a63d8ecdde7..0f776b032d31355da25f2bdbb47982e3560301cb 100644 (file)
@@ -350,14 +350,12 @@ static void __init initialize_pernode_data(void)
  *     for best.
  * @nid: node id
  * @pernodesize: size of this node's pernode data
- * @align: alignment to use for this node's pernode data
  */
-static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize,
-       unsigned long align)
+static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize)
 {
        void *ptr = NULL;
        u8 best = 0xff;
-       int bestnode = -1, node;
+       int bestnode = -1, node, anynode = 0;
 
        for_each_online_node(node) {
                if (node_isset(node, memory_less_mask))
@@ -366,13 +364,15 @@ static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize,
                        best = node_distance(nid, node);
                        bestnode = node;
                }
+               anynode = node;
        }
 
-       ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat,
-               pernodesize, align, __pa(MAX_DMA_ADDRESS));
+       if (bestnode == -1)
+               bestnode = anynode;
+
+       ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat, pernodesize,
+               PERCPU_PAGE_SIZE, __pa(MAX_DMA_ADDRESS));
 
-       if (!ptr)
-               panic("NO memory for memory less node\n");
        return ptr;
 }
 
@@ -413,8 +413,7 @@ static void __init memory_less_nodes(void)
 
        for_each_node_mask(node, memory_less_mask) {
                pernodesize = compute_pernodesize(node);
-               pernode = memory_less_node_alloc(node, pernodesize,
-                       (node) ? (node * PERCPU_PAGE_SIZE) : (1024*1024));
+               pernode = memory_less_node_alloc(node, pernodesize);
                fill_pernode(node, __pa(pernode), pernodesize);
        }
 
index c79a9b96d02b3759eb2adffb8ac807a4ac55e18d..41105d45442366940006aac1945c425fa93ec8bf 100644 (file)
@@ -8,6 +8,8 @@
  *             Modified RID allocation for SMP
  *          Goutham Rao <goutham.rao@intel.com>
  *              IPI based ptc implementation and A-step IPI implementation.
+ * Rohit Seth <rohit.seth@intel.com>
+ * Ken Chen <kenneth.w.chen@intel.com>
  */
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/smp.h>
 #include <linux/mm.h>
+#include <linux/bootmem.h>
 
 #include <asm/delay.h>
 #include <asm/mmu_context.h>
 #include <asm/pgalloc.h>
 #include <asm/pal.h>
 #include <asm/tlbflush.h>
+#include <asm/dma.h>
 
 static struct {
        unsigned long mask;     /* mask of supported purge page-sizes */
-       unsigned long max_bits; /* log2() of largest supported purge page-size */
+       unsigned long max_bits; /* log2 of largest supported purge page-size */
 } purge;
 
 struct ia64_ctx ia64_ctx = {
        .lock =         SPIN_LOCK_UNLOCKED,
        .next =         1,
-       .limit =        (1 << 15) - 1,          /* start out with the safe (architected) limit */
        .max_ctx =      ~0U
 };
 
 DEFINE_PER_CPU(u8, ia64_need_tlb_flush);
 
+/*
+ * Initializes the ia64_ctx.bitmap array based on max_ctx+1.
+ * Called after cpu_init() has setup ia64_ctx.max_ctx based on
+ * maximum RID that is supported by boot CPU.
+ */
+void __init
+mmu_context_init (void)
+{
+       ia64_ctx.bitmap = alloc_bootmem((ia64_ctx.max_ctx+1)>>3);
+       ia64_ctx.flushmap = alloc_bootmem((ia64_ctx.max_ctx+1)>>3);
+}
+
 /*
  * Acquire the ia64_ctx.lock before calling this function!
  */
 void
 wrap_mmu_context (struct mm_struct *mm)
 {
-       unsigned long tsk_context, max_ctx = ia64_ctx.max_ctx;
-       struct task_struct *tsk;
-       int i;
+       int i, cpu;
+       unsigned long flush_bit;
 
-       if (ia64_ctx.next > max_ctx)
-               ia64_ctx.next = 300;    /* skip daemons */
-       ia64_ctx.limit = max_ctx + 1;
+       for (i=0; i <= ia64_ctx.max_ctx / BITS_PER_LONG; i++) {
+               flush_bit = xchg(&ia64_ctx.flushmap[i], 0);
+               ia64_ctx.bitmap[i] ^= flush_bit;
+       }
+       /* use offset at 300 to skip daemons */
+       ia64_ctx.next = find_next_zero_bit(ia64_ctx.bitmap,
+                               ia64_ctx.max_ctx, 300);
+       ia64_ctx.limit = find_next_bit(ia64_ctx.bitmap,
+                               ia64_ctx.max_ctx, ia64_ctx.next);
 
        /*
-        * Scan all the task's mm->context and set proper safe range
+        * can't call flush_tlb_all() here because of race condition
+        * with O(1) scheduler [EF]
         */
-
-       read_lock(&tasklist_lock);
-  repeat:
-       for_each_process(tsk) {
-               if (!tsk->mm)
-                       continue;
-               tsk_context = tsk->mm->context;
-               if (tsk_context == ia64_ctx.next) {
-                       if (++ia64_ctx.next >= ia64_ctx.limit) {
-                               /* empty range: reset the range limit and start over */
-                               if (ia64_ctx.next > max_ctx)
-                                       ia64_ctx.next = 300;
-                               ia64_ctx.limit = max_ctx + 1;
-                               goto repeat;
-                       }
-               }
-               if ((tsk_context > ia64_ctx.next) && (tsk_context < ia64_ctx.limit))
-                       ia64_ctx.limit = tsk_context;
-       }
-       read_unlock(&tasklist_lock);
-       /* can't call flush_tlb_all() here because of race condition with O(1) scheduler [EF] */
-       {
-               int cpu = get_cpu(); /* prevent preemption/migration */
-               for_each_online_cpu(i) {
-                       if (i != cpu)
-                               per_cpu(ia64_need_tlb_flush, i) = 1;
-               }
-               put_cpu();
-       }
+       cpu = get_cpu(); /* prevent preemption/migration */
+       for_each_online_cpu(i)
+               if (i != cpu)
+                       per_cpu(ia64_need_tlb_flush, i) = 1;
+       put_cpu();
        local_flush_tlb_all();
 }
 
 void
-ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long nbits)
+ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start,
+                      unsigned long end, unsigned long nbits)
 {
        static DEFINE_SPINLOCK(ptcg_lock);
 
@@ -135,7 +134,8 @@ local_flush_tlb_all (void)
 }
 
 void
-flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long end)
+flush_tlb_range (struct vm_area_struct *vma, unsigned long start,
+                unsigned long end)
 {
        struct mm_struct *mm = vma->vm_mm;
        unsigned long size = end - start;
@@ -149,7 +149,8 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long
 #endif
 
        nbits = ia64_fls(size + 0xfff);
-       while (unlikely (((1UL << nbits) & purge.mask) == 0) && (nbits < purge.max_bits))
+       while (unlikely (((1UL << nbits) & purge.mask) == 0) &&
+                       (nbits < purge.max_bits))
                ++nbits;
        if (nbits > purge.max_bits)
                nbits = purge.max_bits;
@@ -191,5 +192,5 @@ ia64_tlb_init (void)
        local_cpu_data->ptce_stride[0] = ptce_info.stride[0];
        local_cpu_data->ptce_stride[1] = ptce_info.stride[1];
 
-       local_flush_tlb_all();          /* nuke left overs from bootstrapping... */
+       local_flush_tlb_all();  /* nuke left overs from bootstrapping... */
 }
index 017cfc3f47890ba85dc2dcba952fafaa6e6c7fbb..20d76fae24e8eaf3ff7eca62b47b49aa4b1947a6 100644 (file)
@@ -95,7 +95,7 @@ pci_sal_write (unsigned int seg, unsigned int bus, unsigned int devfn,
 }
 
 static struct pci_raw_ops pci_sal_ops = {
-       .read =         pci_sal_read,
+       .read =         pci_sal_read,
        .write =        pci_sal_write
 };
 
@@ -137,35 +137,98 @@ alloc_pci_controller (int seg)
        return controller;
 }
 
-static u64 __devinit
-add_io_space (struct acpi_resource_address64 *addr)
+struct pci_root_info {
+       struct pci_controller *controller;
+       char *name;
+};
+
+static unsigned int
+new_space (u64 phys_base, int sparse)
 {
-       u64 offset;
-       int sparse = 0;
+       u64 mmio_base;
        int i;
 
-       if (addr->address_translation_offset == 0)
-               return IO_SPACE_BASE(0);        /* part of legacy IO space */
-
-       if (addr->attribute.io.translation_attribute == ACPI_SPARSE_TRANSLATION)
-               sparse = 1;
+       if (phys_base == 0)
+               return 0;       /* legacy I/O port space */
 
-       offset = (u64) ioremap(addr->address_translation_offset, 0);
+       mmio_base = (u64) ioremap(phys_base, 0);
        for (i = 0; i < num_io_spaces; i++)
-               if (io_space[i].mmio_base == offset &&
+               if (io_space[i].mmio_base == mmio_base &&
                    io_space[i].sparse == sparse)
-                       return IO_SPACE_BASE(i);
+                       return i;
 
        if (num_io_spaces == MAX_IO_SPACES) {
-               printk("Too many IO port spaces\n");
+               printk(KERN_ERR "PCI: Too many IO port spaces "
+                       "(MAX_IO_SPACES=%lu)\n", MAX_IO_SPACES);
                return ~0;
        }
 
        i = num_io_spaces++;
-       io_space[i].mmio_base = offset;
+       io_space[i].mmio_base = mmio_base;
        io_space[i].sparse = sparse;
 
-       return IO_SPACE_BASE(i);
+       return i;
+}
+
+static u64 __devinit
+add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
+{
+       struct resource *resource;
+       char *name;
+       u64 base, min, max, base_port;
+       unsigned int sparse = 0, space_nr, len;
+
+       resource = kzalloc(sizeof(*resource), GFP_KERNEL);
+       if (!resource) {
+               printk(KERN_ERR "PCI: No memory for %s I/O port space\n",
+                       info->name);
+               goto out;
+       }
+
+       len = strlen(info->name) + 32;
+       name = kzalloc(len, GFP_KERNEL);
+       if (!name) {
+               printk(KERN_ERR "PCI: No memory for %s I/O port space name\n",
+                       info->name);
+               goto free_resource;
+       }
+
+       min = addr->min_address_range;
+       max = min + addr->address_length - 1;
+       if (addr->attribute.io.translation_attribute == ACPI_SPARSE_TRANSLATION)
+               sparse = 1;
+
+       space_nr = new_space(addr->address_translation_offset, sparse);
+       if (space_nr == ~0)
+               goto free_name;
+
+       base = __pa(io_space[space_nr].mmio_base);
+       base_port = IO_SPACE_BASE(space_nr);
+       snprintf(name, len, "%s I/O Ports %08lx-%08lx", info->name,
+               base_port + min, base_port + max);
+
+       /*
+        * The SDM guarantees the legacy 0-64K space is sparse, but if the
+        * mapping is done by the processor (not the bridge), ACPI may not
+        * mark it as sparse.
+        */
+       if (space_nr == 0)
+               sparse = 1;
+
+       resource->name  = name;
+       resource->flags = IORESOURCE_MEM;
+       resource->start = base + (sparse ? IO_SPACE_SPARSE_ENCODING(min) : min);
+       resource->end   = base + (sparse ? IO_SPACE_SPARSE_ENCODING(max) : max);
+       insert_resource(&iomem_resource, resource);
+
+       return base_port;
+
+free_name:
+       kfree(name);
+free_resource:
+       kfree(resource);
+out:
+       return ~0;
 }
 
 static acpi_status __devinit resource_to_window(struct acpi_resource *resource,
@@ -205,11 +268,6 @@ count_window (struct acpi_resource *resource, void *data)
        return AE_OK;
 }
 
-struct pci_root_info {
-       struct pci_controller *controller;
-       char *name;
-};
-
 static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
 {
        struct pci_root_info *info = data;
@@ -231,7 +289,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
        } else if (addr.resource_type == ACPI_IO_RANGE) {
                flags = IORESOURCE_IO;
                root = &ioport_resource;
-               offset = add_io_space(&addr);
+               offset = add_io_space(info, &addr);
                if (offset == ~0)
                        return AE_OK;
        } else
@@ -241,7 +299,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
        window->resource.name = info->name;
        window->resource.flags = flags;
        window->resource.start = addr.min_address_range + offset;
-       window->resource.end = addr.max_address_range + offset;
+       window->resource.end = window->resource.start + addr.address_length - 1;
        window->resource.child = NULL;
        window->offset = offset;
 
@@ -739,7 +797,7 @@ int pci_vector_resources(int last, int nr_released)
 {
        int count = nr_released;
 
-       count += (IA64_LAST_DEVICE_VECTOR - last);
+       count += (IA64_LAST_DEVICE_VECTOR - last);
 
        return count;
 }
index b4f5053f5e1be852a05d8c64ab845ca5719c91e2..05e4ea8899818f8bc06cff895246a3cd55906bbe 100644 (file)
@@ -349,7 +349,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
                return;         /*bus # does not exist */
        prom_bussoft_ptr = __va(prom_bussoft_ptr);
 
-       controller = kcalloc(1,sizeof(struct pci_controller), GFP_KERNEL);
+       controller = kzalloc(sizeof(struct pci_controller), GFP_KERNEL);
        controller->segment = segment;
        if (!controller)
                BUG();
index 0fb579ef18c2b7b9df80d52706306d453e3fe6a7..e510dce9971f53647863cb2a081702e91dabac07 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/root_dev.h>
 #include <linux/nodemask.h>
 #include <linux/pm.h>
+#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/sal.h>
@@ -242,6 +243,135 @@ static void __init sn_check_for_wars(void)
        }
 }
 
+/*
+ * Scan the EFI PCDP table (if it exists) for an acceptable VGA console
+ * output device.  If one exists, pick it and set sn_legacy_{io,mem} to
+ * reflect the bus offsets needed to address it.
+ *
+ * Since pcdp support in SN is not supported in the 2.4 kernel (or at least
+ * the one lbs is based on) just declare the needed structs here.
+ *
+ * Reference spec http://www.dig64.org/specifications/DIG64_PCDPv20.pdf
+ *
+ * Returns 0 if no acceptable vga is found, !0 otherwise.
+ *
+ * Note:  This stuff is duped here because Altix requires the PCDP to
+ * locate a usable VGA device due to lack of proper ACPI support.  Structures
+ * could be used from drivers/firmware/pcdp.h, but it was decided that moving
+ * this file to a more public location just for Altix use was undesireable.
+ */
+
+struct hcdp_uart_desc {
+       u8      pad[45];
+};
+
+struct pcdp {
+       u8      signature[4];   /* should be 'HCDP' */
+       u32     length;
+       u8      rev;            /* should be >=3 for pcdp, <3 for hcdp */
+       u8      sum;
+       u8      oem_id[6];
+       u64     oem_tableid;
+       u32     oem_rev;
+       u32     creator_id;
+       u32     creator_rev;
+       u32     num_type0;
+       struct hcdp_uart_desc uart[0];  /* num_type0 of these */
+       /* pcdp descriptors follow */
+}  __attribute__((packed));
+
+struct pcdp_device_desc {
+       u8      type;
+       u8      primary;
+       u16     length;
+       u16     index;
+       /* interconnect specific structure follows */
+       /* device specific structure follows that */
+}  __attribute__((packed));
+
+struct pcdp_interface_pci {
+       u8      type;           /* 1 == pci */
+       u8      reserved;
+       u16     length;
+       u8      segment;
+       u8      bus;
+       u8      dev;
+       u8      fun;
+       u16     devid;
+       u16     vendid;
+       u32     acpi_interrupt;
+       u64     mmio_tra;
+       u64     ioport_tra;
+       u8      flags;
+       u8      translation;
+}  __attribute__((packed));
+
+struct pcdp_vga_device {
+       u8      num_eas_desc;
+       /* ACPI Extended Address Space Desc follows */
+}  __attribute__((packed));
+
+/* from pcdp_device_desc.primary */
+#define PCDP_PRIMARY_CONSOLE   0x01
+
+/* from pcdp_device_desc.type */
+#define PCDP_CONSOLE_INOUT     0x0
+#define PCDP_CONSOLE_DEBUG     0x1
+#define PCDP_CONSOLE_OUT       0x2
+#define PCDP_CONSOLE_IN                0x3
+#define PCDP_CONSOLE_TYPE_VGA  0x8
+
+#define PCDP_CONSOLE_VGA       (PCDP_CONSOLE_TYPE_VGA | PCDP_CONSOLE_OUT)
+
+/* from pcdp_interface_pci.type */
+#define PCDP_IF_PCI            1
+
+/* from pcdp_interface_pci.translation */
+#define PCDP_PCI_TRANS_IOPORT  0x02
+#define PCDP_PCI_TRANS_MMIO    0x01
+
+static void
+sn_scan_pcdp(void)
+{
+       u8 *bp;
+       struct pcdp *pcdp;
+       struct pcdp_device_desc device;
+       struct pcdp_interface_pci if_pci;
+       extern struct efi efi;
+
+       pcdp = efi.hcdp;
+       if (! pcdp)
+               return;         /* no hcdp/pcdp table */
+
+       if (pcdp->rev < 3)
+               return;         /* only support PCDP (rev >= 3) */
+
+       for (bp = (u8 *)&pcdp->uart[pcdp->num_type0];
+            bp < (u8 *)pcdp + pcdp->length;
+            bp += device.length) {
+               memcpy(&device, bp, sizeof(device));
+               if (! (device.primary & PCDP_PRIMARY_CONSOLE))
+                       continue;       /* not primary console */
+
+               if (device.type != PCDP_CONSOLE_VGA)
+                       continue;       /* not VGA descriptor */
+
+               memcpy(&if_pci, bp+sizeof(device), sizeof(if_pci));
+               if (if_pci.type != PCDP_IF_PCI)
+                       continue;       /* not PCI interconnect */
+
+               if (if_pci.translation & PCDP_PCI_TRANS_IOPORT)
+                       vga_console_iobase =
+                               if_pci.ioport_tra | __IA64_UNCACHED_OFFSET;
+
+               if (if_pci.translation & PCDP_PCI_TRANS_MMIO)
+                       vga_console_membase =
+                               if_pci.mmio_tra | __IA64_UNCACHED_OFFSET;
+
+               break; /* once we find the primary, we're done */
+       }
+}
+
 /**
  * sn_setup - SN platform setup routine
  * @cmdline_p: kernel command line
@@ -263,16 +393,35 @@ void __init sn_setup(char **cmdline_p)
 
 #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
        /*
-        * If there was a primary vga adapter identified through the
-        * EFI PCDP table, make it the preferred console.  Otherwise
-        * zero out conswitchp.
+        * Handle SN vga console.
+        *
+        * SN systems do not have enough ACPI table information
+        * being passed from prom to identify VGA adapters and the legacy
+        * addresses to access them.  Until that is done, SN systems rely
+        * on the PCDP table to identify the primary VGA console if one
+        * exists.
+        *
+        * However, kernel PCDP support is optional, and even if it is built
+        * into the kernel, it will not be used if the boot cmdline contains
+        * console= directives.
+        *
+        * So, to work around this mess, we duplicate some of the PCDP code
+        * here so that the primary VGA console (as defined by PCDP) will
+        * work on SN systems even if a different console (e.g. serial) is
+        * selected on the boot line (or CONFIG_EFI_PCDP is off).
         */
 
+       if (! vga_console_membase)
+               sn_scan_pcdp();
+
        if (vga_console_membase) {
                /* usable vga ... make tty0 the preferred default console */
-               add_preferred_console("tty", 0, NULL);
+               if (!strstr(*cmdline_p, "console="))
+                       add_preferred_console("tty", 0, NULL);
        } else {
                printk(KERN_DEBUG "SGI: Disabling VGA console\n");
+               if (!strstr(*cmdline_p, "console="))
+                       add_preferred_console("ttySG", 0, NULL);
 #ifdef CONFIG_DUMMY_CONSOLE
                conswitchp = &dummy_con;
 #else
index fbcedc7c27fa93686a821722418b0f61aaa7d09e..5483a9f227d457bb2af4702b99e697cfed49b220 100644 (file)
@@ -163,7 +163,7 @@ struct xpc_vars {
        u8 version;
        u64 heartbeat;
        u64 heartbeating_to_mask;
-       u64 kdb_status;         /* 0 = machine running */
+       u64 heartbeat_offline;  /* if 0, heartbeat should be changing */
        int act_nasid;
        int act_phys_cpuid;
        u64 vars_part_pa;
index cece3c7c69be399d39031ab80fcbe697a8b97b38..b617236524c690ea2eb95122e26b9ad133d30819 100644 (file)
@@ -57,6 +57,7 @@
 #include <linux/reboot.h>
 #include <asm/sn/intr.h>
 #include <asm/sn/sn_sal.h>
+#include <asm/kdebug.h>
 #include <asm/uaccess.h>
 #include "xpc.h"
 
@@ -188,6 +189,11 @@ static struct notifier_block xpc_reboot_notifier = {
        .notifier_call = xpc_system_reboot,
 };
 
+static int xpc_system_die(struct notifier_block *, unsigned long, void *);
+static struct notifier_block xpc_die_notifier = {
+       .notifier_call = xpc_system_die,
+};
+
 
 /*
  * Timer function to enforce the timelimit on the partition disengage request.
@@ -997,6 +1003,9 @@ xpc_do_exit(enum xpc_retval reason)
        /* take ourselves off of the reboot_notifier_list */
        (void) unregister_reboot_notifier(&xpc_reboot_notifier);
 
+       /* take ourselves off of the die_notifier list */
+       (void) unregister_die_notifier(&xpc_die_notifier);
+
        /* close down protections for IPI operations */
        xpc_restrict_IPI_ops();
 
@@ -1010,6 +1019,63 @@ xpc_do_exit(enum xpc_retval reason)
 }
 
 
+/*
+ * Called when the system is about to be either restarted or halted.
+ */
+static void
+xpc_die_disengage(void)
+{
+       struct xpc_partition *part;
+       partid_t partid;
+       unsigned long engaged;
+       long time, print_time, disengage_request_timeout;
+
+
+       /* keep xpc_hb_checker thread from doing anything (just in case) */
+       xpc_exiting = 1;
+
+       xpc_vars->heartbeating_to_mask = 0;  /* indicate we're deactivated */
+
+       for (partid = 1; partid < XP_MAX_PARTITIONS; partid++) {
+               part = &xpc_partitions[partid];
+
+               if (!XPC_SUPPORTS_DISENGAGE_REQUEST(part->
+                                                       remote_vars_version)) {
+
+                       /* just in case it was left set by an earlier XPC */
+                       xpc_clear_partition_engaged(1UL << partid);
+                       continue;
+               }
+
+               if (xpc_partition_engaged(1UL << partid) ||
+                                       part->act_state != XPC_P_INACTIVE) {
+                       xpc_request_partition_disengage(part);
+                       xpc_mark_partition_disengaged(part);
+                       xpc_IPI_send_disengage(part);
+               }
+       }
+
+       print_time = rtc_time();
+       disengage_request_timeout = print_time +
+               (xpc_disengage_request_timelimit * sn_rtc_cycles_per_second);
+
+       /* wait for all other partitions to disengage from us */
+
+       while ((engaged = xpc_partition_engaged(-1UL)) &&
+                       (time = rtc_time()) < disengage_request_timeout) {
+
+               if (time >= print_time) {
+                       dev_info(xpc_part, "waiting for remote partitions to "
+                               "disengage, engaged=0x%lx\n", engaged);
+                       print_time = time + (XPC_DISENGAGE_PRINTMSG_INTERVAL *
+                                               sn_rtc_cycles_per_second);
+               }
+       }
+       dev_info(xpc_part, "finished waiting for remote partitions to "
+                               "disengage, engaged=0x%lx\n", engaged);
+}
+
+
 /*
  * This function is called when the system is being rebooted.
  */
@@ -1038,6 +1104,33 @@ xpc_system_reboot(struct notifier_block *nb, unsigned long event, void *unused)
 }
 
 
+/*
+ * This function is called when the system is being rebooted.
+ */
+static int
+xpc_system_die(struct notifier_block *nb, unsigned long event, void *unused)
+{
+       switch (event) {
+       case DIE_MACHINE_RESTART:
+       case DIE_MACHINE_HALT:
+               xpc_die_disengage();
+               break;
+       case DIE_MCA_MONARCH_ENTER:
+       case DIE_INIT_MONARCH_ENTER:
+               xpc_vars->heartbeat++;
+               xpc_vars->heartbeat_offline = 1;
+               break;
+       case DIE_MCA_MONARCH_LEAVE:
+       case DIE_INIT_MONARCH_LEAVE:
+               xpc_vars->heartbeat++;
+               xpc_vars->heartbeat_offline = 0;
+               break;
+       }
+
+       return NOTIFY_DONE;
+}
+
+
 int __init
 xpc_init(void)
 {
@@ -1154,6 +1247,12 @@ xpc_init(void)
                dev_warn(xpc_part, "can't register reboot notifier\n");
        }
 
+       /* add ourselves to the die_notifier list (i.e., ia64die_chain) */
+       ret = register_die_notifier(&xpc_die_notifier);
+       if (ret != 0) {
+               dev_warn(xpc_part, "can't register die notifier\n");
+       }
+
 
        /*
         * Set the beating to other partitions into motion.  This is
@@ -1179,6 +1278,9 @@ xpc_init(void)
                /* take ourselves off of the reboot_notifier_list */
                (void) unregister_reboot_notifier(&xpc_reboot_notifier);
 
+               /* take ourselves off of the die_notifier list */
+               (void) unregister_die_notifier(&xpc_die_notifier);
+
                del_timer_sync(&xpc_hb_timer);
                free_irq(SGI_XPC_ACTIVATE, NULL);
                xpc_restrict_IPI_ops();
index 581e113d2d375df458f40f9c60c9d4cd79d6c8b3..cdd6431853a1b4cc7cfaafa1d30612ed215b104e 100644 (file)
@@ -436,13 +436,13 @@ xpc_check_remote_hb(void)
                }
 
                dev_dbg(xpc_part, "partid = %d, heartbeat = %ld, last_heartbeat"
-                       " = %ld, kdb_status = %ld, HB_mask = 0x%lx\n", partid,
-                       remote_vars->heartbeat, part->last_heartbeat,
-                       remote_vars->kdb_status,
+                       " = %ld, heartbeat_offline = %ld, HB_mask = 0x%lx\n",
+                       partid, remote_vars->heartbeat, part->last_heartbeat,
+                       remote_vars->heartbeat_offline,
                        remote_vars->heartbeating_to_mask);
 
                if (((remote_vars->heartbeat == part->last_heartbeat) &&
-                       (remote_vars->kdb_status == 0)) ||
+                       (remote_vars->heartbeat_offline == 0)) ||
                             !xpc_hb_allowed(sn_partition_id, remote_vars)) {
 
                        XPC_DEACTIVATE_PARTITION(part, xpcNoHeartbeat);
index 9f03d4e5121c62f92791af2b2384e98e32d2b8c4..dda196c9e324e3c8056bc77cb666b5b64397b7e0 100644 (file)
@@ -218,7 +218,7 @@ tioce_alloc_map(struct tioce_kernel *ce_kern, int type, int port,
        if (i > last)
                return 0;
 
-       map = kcalloc(1, sizeof(struct tioce_dmamap), GFP_ATOMIC);
+       map = kzalloc(sizeof(struct tioce_dmamap), GFP_ATOMIC);
        if (!map)
                return 0;
 
@@ -555,7 +555,7 @@ tioce_kern_init(struct tioce_common *tioce_common)
        struct tioce *tioce_mmr;
        struct tioce_kernel *tioce_kern;
 
-       tioce_kern = kcalloc(1, sizeof(struct tioce_kernel), GFP_KERNEL);
+       tioce_kern = kzalloc(sizeof(struct tioce_kernel), GFP_KERNEL);
        if (!tioce_kern) {
                return NULL;
        }
@@ -727,7 +727,7 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
         * Allocate kernel bus soft and copy from prom.
         */
 
-       tioce_common = kcalloc(1, sizeof(struct tioce_common), GFP_KERNEL);
+       tioce_common = kzalloc(sizeof(struct tioce_common), GFP_KERNEL);
        if (!tioce_common)
                return NULL;
 
index 9571a21d6ad42b0d0f9de6a63038fd1d4f5cee9c..a1629194e3fd917260604e372371416a1def8b64 100644 (file)
@@ -381,10 +381,8 @@ fpsp_done:
 .Lnotkern:
        SAVE_ALL_INT
        GET_CURRENT(%d0)
-       tstb    %curptr@(TASK_NEEDRESCHED)
-       jne     ret_from_exception      | deliver signals,
-                                       | reschedule etc..
-       RESTORE_ALL
+       | deliver signals, reschedule etc..
+       jra     ret_from_exception
 
 |
 |      mem_write --- write to user or supervisor address space
index 4ba2c74da93da6070d80e26cd754ca59b671d046..b2dbdf5ee3090ba7359eda1fcdca7971aa76ecae 100644 (file)
@@ -75,10 +75,8 @@ _060_isp_done:
 .Lnotkern:
        SAVE_ALL_INT
        GET_CURRENT(%d0)
-       tstb    %curptr@(TASK_NEEDRESCHED)
-       jne     ret_from_exception      | deliver signals,
-                                       | reschedule etc..
-       RESTORE_ALL
+       | deliver signals, reschedule etc..
+       jra     ret_from_exception
 
 |
 | _060_real_chk():
index cee3317b866505da52f3d3e5afe16abec5846f77..c787c5ba951310fe13f53e2e99d949c79f868e37 100644 (file)
@@ -25,12 +25,8 @@ int main(void)
        DEFINE(TASK_STATE, offsetof(struct task_struct, state));
        DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
        DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
-       DEFINE(TASK_WORK, offsetof(struct task_struct, thread.work));
-       DEFINE(TASK_NEEDRESCHED, offsetof(struct task_struct, thread.work.need_resched));
-       DEFINE(TASK_SYSCALL_TRACE, offsetof(struct task_struct, thread.work.syscall_trace));
-       DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending));
-       DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume));
        DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
+       DEFINE(TASK_INFO, offsetof(struct task_struct, thread.info));
        DEFINE(TASK_MM, offsetof(struct task_struct, mm));
        DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
 
@@ -45,6 +41,10 @@ int main(void)
        DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl));
        DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate));
 
+       /* offsets into the thread_info struct */
+       DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count));
+       DEFINE(TINFO_FLAGS, offsetof(struct thread_info, flags));
+
        /* offsets into the pt_regs */
        DEFINE(PT_D0, offsetof(struct pt_regs, d0));
        DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0));
index 23ca60a4555249af81024a3d53b27ba2e8a28d03..320fde05dc631a646d7b51dee0c8fbf2ea6d65a5 100644 (file)
@@ -44,9 +44,7 @@
 
 #include <asm/asm-offsets.h>
 
-.globl system_call, buserr, trap
-.globl resume, ret_from_exception
-.globl ret_from_signal
+.globl system_call, buserr, trap, resume
 .globl inthandler, sys_call_table
 .globl sys_fork, sys_clone, sys_vfork
 .globl ret_from_interrupt, bad_interrupt
@@ -58,7 +56,7 @@ ENTRY(buserr)
        movel   %sp,%sp@-               | stack frame pointer argument
        bsrl    buserr_c
        addql   #4,%sp
-       jra     ret_from_exception
+       jra     .Lret_from_exception
 
 ENTRY(trap)
        SAVE_ALL_INT
@@ -66,7 +64,7 @@ ENTRY(trap)
        movel   %sp,%sp@-               | stack frame pointer argument
        bsrl    trap_c
        addql   #4,%sp
-       jra     ret_from_exception
+       jra     .Lret_from_exception
 
        | After a fork we jump here directly from resume,
        | so that %d1 contains the previous task
@@ -75,30 +73,31 @@ ENTRY(ret_from_fork)
        movel   %d1,%sp@-
        jsr     schedule_tail
        addql   #4,%sp
-       jra     ret_from_exception
+       jra     .Lret_from_exception
 
-badsys:
-       movel   #-ENOSYS,%sp@(PT_D0)
-       jra     ret_from_exception
-
-do_trace:
+do_trace_entry:
        movel   #-ENOSYS,%sp@(PT_D0)    | needed for strace
        subql   #4,%sp
        SAVE_SWITCH_STACK
        jbsr    syscall_trace
        RESTORE_SWITCH_STACK
        addql   #4,%sp
-       movel   %sp@(PT_ORIG_D0),%d1
-       movel   #-ENOSYS,%d0
-       cmpl    #NR_syscalls,%d1
-       jcc     1f
-       jbsr    @(sys_call_table,%d1:l:4)@(0)
-1:     movel   %d0,%sp@(PT_D0)         | save the return value
-       subql   #4,%sp                  | dummy return address
+       movel   %sp@(PT_ORIG_D0),%d0
+       cmpl    #NR_syscalls,%d0
+       jcs     syscall
+badsys:
+       movel   #-ENOSYS,%sp@(PT_D0)
+       jra     ret_from_syscall
+
+do_trace_exit:
+       subql   #4,%sp
        SAVE_SWITCH_STACK
        jbsr    syscall_trace
+       RESTORE_SWITCH_STACK
+       addql   #4,%sp
+       jra     .Lret_from_exception
 
-ret_from_signal:
+ENTRY(ret_from_signal)
        RESTORE_SWITCH_STACK
        addql   #4,%sp
 /* on 68040 complete pending writebacks if any */
@@ -111,7 +110,7 @@ ret_from_signal:
        addql   #4,%sp
 1:
 #endif
-       jra     ret_from_exception
+       jra     .Lret_from_exception
 
 ENTRY(system_call)
        SAVE_ALL_SYS
@@ -120,30 +119,34 @@ ENTRY(system_call)
        | save top of frame
        movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
 
-       tstb    %curptr@(TASK_SYSCALL_TRACE)
-       jne     do_trace
+       | syscall trace?
+       tstb    %curptr@(TASK_INFO+TINFO_FLAGS+2)
+       jmi     do_trace_entry
        cmpl    #NR_syscalls,%d0
        jcc     badsys
+syscall:
        jbsr    @(sys_call_table,%d0:l:4)@(0)
        movel   %d0,%sp@(PT_D0)         | save the return value
-
+ret_from_syscall:
        |oriw   #0x0700,%sr
-       movel   %curptr@(TASK_WORK),%d0
+       movew   %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
        jne     syscall_exit_work
 1:     RESTORE_ALL
 
 syscall_exit_work:
        btst    #5,%sp@(PT_SR)          | check if returning to kernel
        bnes    1b                      | if so, skip resched, signals
-       tstw    %d0
-       jeq     do_signal_return
-       tstb    %d0
-       jne     do_delayed_trace
-
+       lslw    #1,%d0
+       jcs     do_trace_exit
+       jmi     do_delayed_trace
+       lslw    #8,%d0
+       jmi     do_signal_return
        pea     resume_userspace
-       jmp     schedule
+       jra     schedule
+
 
-ret_from_exception:
+ENTRY(ret_from_exception)
+.Lret_from_exception:
        btst    #5,%sp@(PT_SR)          | check if returning to kernel
        bnes    1f                      | if so, skip resched, signals
        | only allow interrupts when we are really the last one on the
@@ -152,19 +155,18 @@ ret_from_exception:
        andw    #ALLOWINT,%sr
 
 resume_userspace:
-       movel   %curptr@(TASK_WORK),%d0
-       lsrl    #8,%d0
+       moveb   %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
        jne     exit_work
 1:     RESTORE_ALL
 
 exit_work:
        | save top of frame
        movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
-       tstb    %d0
-       jeq     do_signal_return
-
+       lslb    #1,%d0
+       jmi     do_signal_return
        pea     resume_userspace
-       jmp     schedule
+       jra     schedule
+
 
 do_signal_return:
        |andw   #ALLOWINT,%sr
@@ -254,7 +256,7 @@ ret_from_interrupt:
 
        /* check if we need to do software interrupts */
        tstl    irq_stat+CPUSTAT_SOFTIRQ_PENDING
-       jeq     ret_from_exception
+       jeq     .Lret_from_exception
        pea     ret_from_exception
        jra     do_softirq
 
index 7e54422685cfc1ed8737d29bac74124b3a4f8cdd..540638ca81f9832fe390b1f0b381d54ea7b2b20e 100644 (file)
@@ -109,7 +109,7 @@ static inline void singlestep_disable(struct task_struct *child)
 {
        unsigned long tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16);
        put_reg(child, PT_SR, tmp);
-       child->thread.work.delayed_trace = 0;
+       clear_tsk_thread_flag(child, TIF_DELAYED_TRACE);
 }
 
 /*
@@ -118,7 +118,7 @@ static inline void singlestep_disable(struct task_struct *child)
 void ptrace_disable(struct task_struct *child)
 {
        singlestep_disable(child);
-       child->thread.work.syscall_trace = 0;
+       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
 }
 
 long arch_ptrace(struct task_struct *child, long request, long addr, long data)
@@ -198,9 +198,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        goto out_eio;
 
                if (request == PTRACE_SYSCALL)
-                       child->thread.work.syscall_trace = ~0;
+                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
                else
-                       child->thread.work.syscall_trace = 0;
+                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
                child->exit_code = data;
                singlestep_disable(child);
                wake_up_process(child);
@@ -223,10 +223,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                if (!valid_signal(data))
                        goto out_eio;
 
-               child->thread.work.syscall_trace = 0;
+               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
                tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
                put_reg(child, PT_SR, tmp);
-               child->thread.work.delayed_trace = 1;
+               set_tsk_thread_flag(child, TIF_DELAYED_TRACE);
 
                child->exit_code = data;
                /* give it a chance to run. */
@@ -288,9 +288,6 @@ out_eio:
 
 asmlinkage void syscall_trace(void)
 {
-       if (!current->thread.work.delayed_trace &&
-           !current->thread.work.syscall_trace)
-               return;
        ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
                                 ? 0x80 : 0));
        /*
index 02692027730ae3e9e34b557d4984fb32acfeac5b..e14ba5e01a360270d4be99bce5a56b9eda8fa6a1 100644 (file)
@@ -700,6 +700,7 @@ load-$(CONFIG_SNI_RM200_PCI)        += 0xffffffff80600000
 #
 core-$(CONFIG_TOSHIBA_JMR3927) += arch/mips/jmr3927/rbhma3100/ \
                                   arch/mips/jmr3927/common/
+cflags-$(CONFIG_TOSHIBA_JMR3927) += -Iinclude/asm-mips/mach-jmr3927
 load-$(CONFIG_TOSHIBA_JMR3927) += 0xffffffff80050000
 
 #
index f85093b8d54dca800e6f0e8a0cdfd5e5d3cfa23f..f4926315fb683feaae38234b06d150c6603946ad 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/config.h>
 #include <linux/init.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/slab.h>
 #include <linux/sysctl.h>
 #include <linux/jiffies.h>
index 4f21f42d096bad6737343318c64d45a802cffa77..08c8c855cc9cbf5fc3ceb0ba34bd378eadc2e306 100644 (file)
@@ -93,7 +93,7 @@ void __init plat_setup(void)
 
        argptr = prom_getcmdline();
 
-#ifdef CONFIG_SERIAL_AU1X00_CONSOLE
+#if defined(CONFIG_SERIAL_AU1X00_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
        if ((argptr = strstr(argptr, "console=")) == NULL) {
                argptr = prom_getcmdline();
                strcat(argptr, " console=ttyS0,115200");
index 0b21bed7ee553f5413253bc7808bc64b03f26ebb..2cab7629702c3f6b6066250c8c9bc8db2dd36241 100644 (file)
@@ -348,7 +348,7 @@ endpoint_stall(endpoint_t * ep)
 {
        u32 cs;
 
-       warn(__FUNCTION__);
+       warn("%s", __FUNCTION__);
 
        cs = au_readl(ep->reg->ctrl_stat) | USBDEV_CS_STALL;
        au_writel(cs, ep->reg->ctrl_stat);
@@ -360,7 +360,7 @@ endpoint_unstall(endpoint_t * ep)
 {
        u32 cs;
 
-       warn(__FUNCTION__);
+       warn("%s", __FUNCTION__);
 
        cs = au_readl(ep->reg->ctrl_stat) & ~USBDEV_CS_STALL;
        au_writel(cs, ep->reg->ctrl_stat);
index 132ec3dac63fb0472ea380789f00ca1c0616aa13..74990758154b24171f4a472361332b9095e0db4a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:13 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 12:14:02 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -191,6 +209,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -309,6 +328,10 @@ CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -363,6 +386,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_TARGET_NFQUEUE=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -412,6 +436,7 @@ CONFIG_IP6_NF_MATCH_PHYSDEV=m
 CONFIG_IP6_NF_FILTER=m
 CONFIG_IP6_NF_TARGET_LOG=m
 CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_NFQUEUE=m
 CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_TARGET_HL=m
@@ -472,10 +497,18 @@ CONFIG_IPDDP_DECAP=y
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CLK_JIFFIES=y
 # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -488,8 +521,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -498,13 +533,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-CONFIG_NET_CLS_IND=y
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -565,18 +601,9 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -643,6 +670,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -653,6 +681,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -707,6 +736,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -736,7 +766,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -754,6 +783,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -933,6 +963,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -991,6 +1022,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -1037,7 +1072,7 @@ CONFIG_JFS_SECURITY=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
 # CONFIG_XFS_RT is not set
index 25e8a08e68be044181a4fd1c9d9d031ce8399607..ea4b75604c2301ff336e994aae2a344888d82be0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:17 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:04:36 2005
 #
 CONFIG_MIPS=y
 
@@ -60,6 +60,23 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -127,8 +144,8 @@ CONFIG_SIBYTE_SB1xxx_SOC=y
 # CONFIG_CPU_SB1_PASS_2_112x is not set
 # CONFIG_CPU_SB1_PASS_3 is not set
 # CONFIG_SIMULATION is not set
-# CONFIG_CONFIG_SB1_CEX_ALWAYS_FATAL is not set
-# CONFIG_CONFIG_SB1_CERR_STALL is not set
+# CONFIG_SB1_CEX_ALWAYS_FATAL is not set
+# CONFIG_SB1_CERR_STALL is not set
 CONFIG_SIBYTE_CFE=y
 # CONFIG_SIBYTE_CFE_CONSOLE is not set
 # CONFIG_SIBYTE_BUS_WATCHER is not set
@@ -198,6 +215,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_SMP=y
 CONFIG_NR_CPUS=4
 CONFIG_PREEMPT_NONE=y
@@ -295,6 +313,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -353,14 +375,6 @@ CONFIG_BLK_DEV_NBD=m
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -443,6 +457,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -582,6 +597,7 @@ CONFIG_GEN_RTC=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -634,6 +650,7 @@ CONFIG_SENSORS_PCA9539=y
 CONFIG_SENSORS_PCF8591=y
 CONFIG_SENSORS_RTC8564=y
 CONFIG_SENSORS_MAX6875=y
+# CONFIG_RTC_X1205_I2C is not set
 CONFIG_I2C_DEBUG_CORE=y
 CONFIG_I2C_DEBUG_ALGO=y
 CONFIG_I2C_DEBUG_BUS=y
@@ -685,6 +702,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -823,6 +844,8 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE=""
 # CONFIG_DEBUG_STACK_USAGE is not set
index bfbaa08c47cb7ff1c7d1672e6bf31bdf7d677cfa..a86cc9d9bdaeeed3028994074986ef0c12a53003 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:20 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:04:39 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -182,6 +200,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -270,6 +289,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -329,16 +352,7 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -412,7 +426,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -430,6 +443,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -586,6 +600,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -601,6 +616,7 @@ CONFIG_GPIO_VR41XX=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -659,6 +675,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 4b4d1ddb3d42ce35417f22f486c27eea93cab4af..3558c79b0eb79df0e6c8e59d5ceca9c839ec39f1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:23 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:04:42 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -172,6 +190,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -256,6 +275,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -287,6 +310,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -316,18 +340,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -401,7 +416,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -419,6 +433,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -574,6 +589,7 @@ CONFIG_COBALT_LCD=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -632,6 +648,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 6501144ec612cca139655ffba8b7c805b8ca627c..3b103fec7b86a05b4b765f75b5131a2155fa426e 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:26 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:11:04 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -178,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -201,7 +220,6 @@ CONFIG_PCMCIA_IOCTL=y
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 
 #
@@ -259,15 +277,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -293,6 +315,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -343,6 +369,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -399,6 +426,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -417,18 +449,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -473,7 +496,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -490,6 +512,7 @@ CONFIG_CICADA_PHY=m
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 CONFIG_MIPS_AU1X00_ENET=y
+# CONFIG_SMC91X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -532,6 +555,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -598,13 +622,17 @@ CONFIG_HW_CONSOLE=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
@@ -633,11 +661,14 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -696,6 +727,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index b8cd2cd923ddf26c2534d3ab4423438ec4d285c8..79cdd940c6a8a35c3f4f7382215f19f29f18561b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:29 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:11:07 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -178,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -247,15 +266,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -281,6 +304,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -331,6 +358,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -387,6 +415,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -405,18 +438,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -461,7 +485,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -478,6 +501,7 @@ CONFIG_CICADA_PHY=m
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 CONFIG_MIPS_AU1X00_ENET=y
+# CONFIG_SMC91X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -507,6 +531,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -573,13 +598,16 @@ CONFIG_HW_CONSOLE=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
@@ -608,6 +636,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -650,12 +679,11 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
-CONFIG_FB_AU1100=y
 # CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_AU1100=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -664,6 +692,7 @@ CONFIG_FB_AU1100=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 CONFIG_FONTS=y
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -697,6 +726,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 530b6c2d99f6e4709dace0e1a0f3f51852a1659c..b6bad69398e1b3ecf8f52dc7a38380a03d587e50 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:32 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:11:10 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +197,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -200,7 +219,6 @@ CONFIG_PCMCIA_IOCTL=y
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 CONFIG_PCMCIA_AU1X00=m
 
 #
@@ -255,13 +273,17 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -287,6 +309,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -333,6 +359,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -394,6 +421,11 @@ CONFIG_MTD_NAND_IDS=y
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -414,16 +446,7 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -495,6 +518,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
 
@@ -545,6 +569,7 @@ CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 # CONFIG_MIPS_AU1X00_ENET is not set
+# CONFIG_SMC91X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -638,13 +663,17 @@ CONFIG_HW_CONSOLE=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
@@ -673,11 +702,14 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 # CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -720,12 +752,11 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
-CONFIG_FB_AU1200=y
 # CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_AU1200=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -756,6 +787,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -862,6 +897,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
index 1c2784dee6974bd2317cf0a9b9367af5074d5ef9..dbaf189fc9c0e3d663dc5ae734084b2eba86181a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:36 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:11:15 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -180,6 +198,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -208,7 +227,6 @@ CONFIG_CARDBUS=y
 # CONFIG_YENTA is not set
 # CONFIG_PD6729 is not set
 # CONFIG_I82092 is not set
-# CONFIG_TCIC is not set
 CONFIG_PCMCIA_AU1X00=m
 
 #
@@ -267,15 +285,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -301,6 +323,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -351,6 +377,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -408,6 +435,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -432,18 +464,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_UB is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -518,7 +541,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -537,7 +559,9 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MIPS_AU1X00_ENET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_SMC91X is not set
 
 #
 # Tulip family network device support
@@ -599,6 +623,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -664,13 +689,17 @@ CONFIG_SERIO_RAW=m
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
@@ -702,12 +731,15 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -756,12 +788,94 @@ CONFIG_SOUND=y
 #
 # Advanced Linux Sound Architecture
 #
-# CONFIG_SND is not set
+CONFIG_SND=m
+CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_AC97_BUS=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_GENERIC_DRIVER=y
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+CONFIG_SND_VIRMIDI=m
+CONFIG_SND_MTPAV=m
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_HDA_INTEL is not set
+
+#
+# ALSA MIPS devices
+#
+CONFIG_SND_AU1X00=m
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# PCMCIA devices
+#
 
 #
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=y
+CONFIG_OBSOLETE_OSS_DRIVER=y
 # CONFIG_SOUND_BT878 is not set
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
@@ -774,7 +888,7 @@ CONFIG_SOUND_PRIME=y
 # CONFIG_SOUND_MAESTRO3 is not set
 # CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
-CONFIG_SOUND_AU1000=y
+# CONFIG_SOUND_AU1000 is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
@@ -815,12 +929,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # USB Device Class drivers
 #
 # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
index 64248e2e924a7fe2b95504a2cac1d3ec565a67d6..59c1ef214fc0bbd2460edfedd8b846ea996addcd 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:39 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:11:18 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +197,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -207,7 +226,6 @@ CONFIG_CARDBUS=y
 # CONFIG_YENTA is not set
 # CONFIG_PD6729 is not set
 # CONFIG_I82092 is not set
-# CONFIG_TCIC is not set
 CONFIG_PCMCIA_AU1X00=m
 
 #
@@ -266,15 +284,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -300,6 +322,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -350,6 +376,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -412,6 +439,11 @@ CONFIG_MTD_NAND_AU1550=m
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -435,18 +467,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -550,7 +573,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -569,7 +591,9 @@ CONFIG_MII=m
 CONFIG_MIPS_AU1X00_ENET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_SMC91X is not set
 
 #
 # Tulip family network device support
@@ -639,6 +663,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -704,13 +729,17 @@ CONFIG_SERIO_RAW=m
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
@@ -742,12 +771,15 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -800,6 +832,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 326f3aa637419a4583edb299e3a715f60b9571fe..4ba29e612bdf8409f2a6b063716ca843e4291ac4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:42 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:04 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -173,6 +191,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -261,6 +280,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -292,6 +315,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -321,18 +345,9 @@ CONFIG_CONNECTOR=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -412,7 +427,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -430,6 +444,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
@@ -443,7 +458,6 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -591,6 +605,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -633,7 +648,6 @@ CONFIG_FB=y
 # CONFIG_FB_CFB_FILLRECT is not set
 # CONFIG_FB_CFB_COPYAREA is not set
 # CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_SOFT_CURSOR is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
@@ -642,6 +656,7 @@ CONFIG_FB=y
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
@@ -658,7 +673,6 @@ CONFIG_FB=y
 # CONFIG_FB_SMIVGX is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -687,6 +701,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index c2a01df3c8dfca188dc5a9125048e5e587bc0d62..ea4e9046bbeebe271b4c2d088645fe6f3fef0386 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:45 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:08 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -173,6 +191,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -260,6 +279,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -291,6 +314,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -319,18 +343,9 @@ CONFIG_CONNECTOR=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -382,7 +397,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -400,6 +414,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -575,6 +590,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -633,6 +649,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 5bc885b72d1432173ea60b45d92883a3bdee9257..1ac6c9b7ef963c4e5fa929084b11d727413ec3a0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:48 2005
+# Linux kernel version: 2.6.14
+# Fri Nov 11 13:29:30 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -178,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -262,6 +281,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -318,16 +341,7 @@ CONFIG_BLK_DEV_LOOP=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -365,12 +379,13 @@ CONFIG_SCSI_CONSTANTS=y
 #
 CONFIG_SCSI_SPI_ATTRS=m
 # CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
 CONFIG_SCSI_SAS_ATTRS=m
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 CONFIG_SCSI_DECNCR=y
 # CONFIG_SCSI_DECSII is not set
 # CONFIG_SCSI_SATA is not set
@@ -407,7 +422,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -491,10 +505,7 @@ CONFIG_ZS=y
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_DZ=y
-CONFIG_SERIAL_DZ_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_DZ is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -520,6 +531,7 @@ CONFIG_RTC=y
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -562,15 +574,14 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_PMAG_AA is not set
 CONFIG_FB_PMAG_BA=y
 CONFIG_FB_PMAGB_B=y
 # CONFIG_FB_MAXINE is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -594,6 +605,10 @@ CONFIG_LOGO_DEC_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -746,6 +761,8 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE=""
 # CONFIG_DEBUG_STACK_USAGE is not set
index c0d06ea5566cf70aebc4fe4654281bab9c87bd74..a89d2f66cdfa5d22adf35d7190db2cf2fc950ea2 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:51 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:15 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -180,6 +198,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -262,6 +281,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -317,16 +340,7 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -403,7 +417,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -427,7 +440,6 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -552,6 +564,7 @@ CONFIG_WATCHDOG=y
 # CONFIG_WDT is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
@@ -564,6 +577,7 @@ CONFIG_GPIO_VR41XX=y
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -622,6 +636,10 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index f1309d84d2fe8da9a92498acb6a063f414b1baa6..e6c3c27f41fef5432b63c47633797bb79b0c28ac 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:54 2005
+# Linux kernel version: 2.6.14
+# Wed Nov  9 11:05:12 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 # CONFIG_KMOD is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -181,6 +199,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -267,6 +286,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -326,18 +349,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -389,7 +403,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -407,6 +420,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -464,6 +478,7 @@ CONFIG_PPP_ASYNC=y
 # CONFIG_PPP_SYNC_TTY is not set
 # CONFIG_PPP_DEFLATE is not set
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 # CONFIG_PPPOE is not set
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -569,6 +584,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -627,6 +643,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 8ac55b7acc019948d68e391724fd9ef6db2f45ff..52ca6bf5be66f74ad7a737c7369518f6764e7939 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:57 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:22 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 # CONFIG_KMOD is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -185,6 +203,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -269,6 +288,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -323,18 +346,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -379,7 +393,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -518,6 +531,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -575,6 +589,10 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 3ae3838f283c6dfbdfd58621ddf57a9aa6d7d371..79e3fe7e2d54a576b35850f473e39c42c68d98a9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:01 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 13:38:41 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -187,6 +205,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
@@ -292,6 +311,10 @@ CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -345,6 +368,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_TARGET_NFQUEUE=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -393,6 +417,7 @@ CONFIG_IP6_NF_MATCH_EUI64=m
 CONFIG_IP6_NF_FILTER=m
 CONFIG_IP6_NF_TARGET_LOG=m
 CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_NFQUEUE=m
 CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_TARGET_HL=m
@@ -424,10 +449,18 @@ CONFIG_SCTP_HMAC_MD5=y
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 # CONFIG_NET_SCH_CLK_JIFFIES is not set
 CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -440,8 +473,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -450,13 +485,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-# CONFIG_NET_CLS_IND is not set
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -509,18 +545,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -564,6 +591,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 CONFIG_SGIWD93_SCSI=y
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -599,7 +627,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -752,6 +779,7 @@ CONFIG_MAX_RAW_DEVS=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -820,6 +848,10 @@ CONFIG_LOGO_SGI_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -856,7 +888,7 @@ CONFIG_FS_MBCACHE=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 # CONFIG_XFS_POSIX_ACL is not set
 # CONFIG_XFS_RT is not set
index d962f61d5b98789bf6f5917351c60804da428d4e..72998ec35b0b4c730e059e603b8cbb249e17aaa2 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:04 2005
+# Linux kernel version: 2.6.15-rc1
+# Sun Nov 13 23:56:52 2005
 #
 CONFIG_MIPS=y
 
@@ -59,6 +59,23 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -186,6 +203,7 @@ CONFIG_DISCONTIGMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_NEED_MULTIPLE_NODES=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_SMP=y
 CONFIG_NR_CPUS=64
 CONFIG_PREEMPT_NONE=y
@@ -284,10 +302,18 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 # CONFIG_NET_SCH_CLK_JIFFIES is not set
 CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -300,8 +326,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -310,12 +338,13 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-# CONFIG_NET_CLS_IND is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -377,14 +406,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -428,6 +449,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -437,6 +459,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 # CONFIG_SCSI_AIC79XX is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -447,7 +470,6 @@ CONFIG_SCSI_SAS_ATTRS=m
 # CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 CONFIG_SCSI_QLOGIC_1280=y
-CONFIG_SCSI_QLOGIC_1280_1040=y
 CONFIG_SCSI_QLA2XXX=y
 # CONFIG_SCSI_QLA21XX is not set
 # CONFIG_SCSI_QLA22XX is not set
@@ -487,6 +509,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -516,7 +539,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -532,8 +554,12 @@ CONFIG_CICADA_PHY=m
 #
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
+CONFIG_SGI_IOC3_ETH=y
+CONFIG_SGI_IOC3_ETH_HW_RX_CSUM=y
+CONFIG_SGI_IOC3_ETH_HW_TX_CSUM=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -672,6 +698,7 @@ CONFIG_SGI_IP27_RTC=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -724,6 +751,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -762,7 +793,7 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
 # CONFIG_XFS_RT is not set
index bf8fb95b21dc958f2248bd1fab47a8e37cd3da02..955e30f1b1add9a9076f9ea8b27c9f53dae39876 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:07 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:32 2005
 #
 CONFIG_MIPS=y
 
@@ -51,6 +51,23 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
@@ -271,6 +289,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -302,6 +324,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -334,14 +357,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -385,6 +400,7 @@ CONFIG_SCSI_SAS_ATTRS=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -399,6 +415,7 @@ CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
 # CONFIG_SCSI_AIC79XX is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -432,6 +449,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -461,7 +479,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -480,6 +497,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_SGI_O2MACE_ETH=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -637,6 +655,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -695,6 +714,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 0940771bafb15529cc3b4f8edcf1a5a87abbdc55..f631385217db94b177397c9cfe677fbdfd19d53a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:09 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 13:42:45 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -181,6 +199,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -266,6 +285,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -315,6 +338,7 @@ CONFIG_MTD_CHAR=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -372,6 +396,11 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -390,18 +419,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -467,7 +487,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -609,6 +628,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -669,10 +689,10 @@ CONFIG_SOUND=y
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=y
+# CONFIG_OBSOLETE_OSS_DRIVER is not set
 CONFIG_SOUND_IT8172=y
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
-# CONFIG_SOUND_AD1980 is not set
 
 #
 # USB support
@@ -680,6 +700,10 @@ CONFIG_SOUND_IT8172=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 9ba61dfc490dd34a2818533bceadce12a3acef94..8d94ac753e7898bb86845a7cacce799605331082 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:12 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:38 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -178,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -265,6 +284,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -324,18 +347,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -409,7 +423,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -427,6 +440,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -539,7 +553,8 @@ CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_QTRONIX_KEYBOARD=y
-# CONFIG_IT8172_SCR0 is not set
+CONFIG_IT8172_SCR0=y
+CONFIG_IT8172_SCR1=y
 
 #
 # Serial drivers
@@ -583,6 +598,7 @@ CONFIG_RTC=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -641,6 +657,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 21b2b8042f917e44d1a06c8138aa12a95074fe27..a8b4c9a9a63b008c6fd2b7c0aa0080027b2eb2c8 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:14 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:41 2005
 #
 CONFIG_MIPS=y
 
@@ -54,6 +54,24 @@ CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -184,6 +202,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_SMP is not set
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
@@ -259,6 +278,10 @@ CONFIG_IPV6_TUNNEL=m
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -317,18 +340,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -380,7 +394,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -398,6 +411,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -591,6 +605,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 6390a753e80bc49edc3f07c2f4f36ee0127947d7..c0ac5c793ec7478a92b93fdd607ff51f3c3de869 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:17 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:44 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -168,6 +186,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -256,6 +275,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -287,6 +310,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -315,18 +339,9 @@ CONFIG_CONNECTOR=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -378,7 +393,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -396,6 +410,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -561,6 +576,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -603,7 +619,6 @@ CONFIG_FB=y
 # CONFIG_FB_CFB_FILLRECT is not set
 # CONFIG_FB_CFB_COPYAREA is not set
 # CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_SOFT_CURSOR is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
@@ -612,6 +627,7 @@ CONFIG_FB=y
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
@@ -628,7 +644,6 @@ CONFIG_FB=y
 # CONFIG_FB_SMIVGX is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -656,6 +671,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 03cd0ca6e6390067804b1c2ecde23e0d31da6f99..f2bd620ff0fa3979d998240ad5bd6e56fb666865 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:19 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:47 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -184,6 +202,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -267,6 +286,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -317,6 +340,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -374,6 +398,11 @@ CONFIG_MTD_LASAT=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -396,18 +425,9 @@ CONFIG_MTD_LASAT=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -511,7 +531,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -529,6 +548,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -684,6 +704,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -742,6 +763,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 2acdec959dd0953a6864a12ebf28d31c93a80b9a..e48e1de442b433348d0c63aee90b967c6f2d6f55 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:22 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 13:42:55 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -197,6 +215,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -315,6 +334,10 @@ CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -369,6 +392,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_TARGET_NFQUEUE=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -418,6 +442,7 @@ CONFIG_IP6_NF_MATCH_PHYSDEV=m
 CONFIG_IP6_NF_FILTER=m
 CONFIG_IP6_NF_TARGET_LOG=m
 CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_NFQUEUE=m
 CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_TARGET_HL=m
@@ -478,10 +503,18 @@ CONFIG_IPDDP_DECAP=y
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CLK_JIFFIES=y
 # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -494,8 +527,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -504,13 +539,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-CONFIG_NET_CLS_IND=y
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -572,18 +608,9 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -680,6 +707,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
 CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
@@ -695,6 +723,7 @@ CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -745,6 +774,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -774,7 +804,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -792,6 +821,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -967,6 +997,7 @@ CONFIG_RTC=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -1025,6 +1056,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -1071,7 +1106,7 @@ CONFIG_JFS_SECURITY=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
 # CONFIG_XFS_RT is not set
index fb9bdd9e3151b01d150cc827ea621872612ad8a3..04abd1b3202b5087d120ed34ad3dbdfba778fbc4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:25 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:05:55 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -184,6 +202,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -281,10 +300,18 @@ CONFIG_SCTP_HMAC_MD5=y
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CLK_JIFFIES=y
 # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -297,8 +324,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -311,6 +340,7 @@ CONFIG_NET_CLS_ROUTE=y
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 # CONFIG_NET_CLS_POLICE is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -361,16 +391,7 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -537,6 +558,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -588,6 +610,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -721,6 +747,8 @@ CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE="nfsroot=192.168.192.169:/u1/mipsel,timeo=20 ip=dhcp"
 # CONFIG_DEBUG_STACK_USAGE is not set
index e2c082128532080eb52f60e8fbec30b3aa055ee2..46814be0ac38a2e79c9910dd4ef9cea2cfa18a94 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:28 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:12:01 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -182,6 +200,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -210,7 +229,6 @@ CONFIG_PCMCIA_IOCTL=y
 # CONFIG_YENTA is not set
 # CONFIG_PD6729 is not set
 # CONFIG_I82092 is not set
-# CONFIG_TCIC is not set
 CONFIG_PCMCIA_VRC4173=y
 
 #
@@ -281,6 +299,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -341,16 +363,7 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_UB is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -612,6 +625,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -625,6 +639,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 # CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 CONFIG_GPIO_VR41XX=y
 # CONFIG_RAW_DRIVER is not set
 
@@ -632,6 +648,7 @@ CONFIG_GPIO_VR41XX=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -713,12 +730,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
index f18d05c2ca775abc6ccedc22ec7845e355e52512..e12118c30db4d19a8d65809a6a7bd496db74cee0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:30 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 14:01:36 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -187,6 +205,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_SMP is not set
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
@@ -265,15 +284,19 @@ CONFIG_IPV6=m
 # CONFIG_IPV6_TUNNEL is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -305,6 +328,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -365,16 +392,7 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -411,12 +429,13 @@ CONFIG_SCSI_PROC_FS=y
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
 CONFIG_SCSI_SAS_ATTRS=m
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -427,6 +446,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -461,6 +481,7 @@ CONFIG_SCSI_QLA2XXX=m
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -490,7 +511,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -508,6 +528,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -589,6 +610,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -691,6 +713,7 @@ CONFIG_RTC=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -733,7 +756,6 @@ CONFIG_FB=y
 # CONFIG_FB_CFB_FILLRECT is not set
 # CONFIG_FB_CFB_COPYAREA is not set
 # CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_SOFT_CURSOR is not set
 # CONFIG_FB_MACMODES is not set
 CONFIG_FB_MODE_HELPERS=y
 # CONFIG_FB_TILEBLITTING is not set
@@ -742,6 +764,7 @@ CONFIG_FB_MODE_HELPERS=y
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
@@ -758,7 +781,6 @@ CONFIG_FB_MODE_HELPERS=y
 # CONFIG_FB_SMIVGX is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -767,6 +789,7 @@ CONFIG_FB_MODE_HELPERS=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -792,6 +815,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index d3a5fee02b79d07e150efe572e7ba86f6eff8981..99f0c980aee77f33c939a6afcf2fdacb66e52f23 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:33 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:05 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,23 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -176,6 +193,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -267,6 +285,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -298,6 +320,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -329,14 +352,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -388,7 +403,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -406,6 +420,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -562,6 +577,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -620,6 +636,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 1edde12ebff9bf8b7ebf340e7daa1ebb6d34b2d6..11c7d74ee1e5e55398ba1dbaf216b67c1a872558 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:35 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:08 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -181,6 +199,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -265,6 +284,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -296,6 +319,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -319,18 +343,9 @@ CONFIG_CONNECTOR=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -375,7 +390,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -513,6 +527,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -570,6 +585,10 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index e2d5188cdc15c9cbf393a5054d70719a25327d5d..9ced1a9029d4d37f5bf817350bce8984c8165cd2 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:38 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:11 2005
 #
 CONFIG_MIPS=y
 
@@ -50,6 +50,23 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +196,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -270,6 +288,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -301,6 +323,7 @@ CONFIG_FW_LOADER=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -332,14 +355,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_CDROM_PKTCDVD=y
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=y
 
 #
@@ -391,7 +406,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -410,6 +424,7 @@ CONFIG_MII=y
 CONFIG_GALILEO_64240_ETH=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -565,6 +580,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -623,6 +639,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 47247addee1b8ddd0b9af62950e7ac3ed85aabc4..dbcaa77add7cd3023cd418aca2c3f286c8a79cab 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:41 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:12:31 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -180,6 +198,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -203,7 +222,6 @@ CONFIG_PCMCIA_IOCTL=y
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 
 #
@@ -261,15 +279,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -295,6 +317,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -345,6 +371,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -401,6 +428,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -419,18 +451,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -475,7 +498,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -492,6 +514,7 @@ CONFIG_CICADA_PHY=m
 CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_MIPS_AU1X00_ENET is not set
+# CONFIG_SMC91X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -526,6 +549,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -592,12 +616,19 @@ CONFIG_HW_CONSOLE=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
 # CONFIG_SERIAL_AU1X00 is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -624,11 +655,14 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -687,6 +721,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index f91a4eaae51a8a55f76c7d807b1ea5fcb4d8b1b0..5b685ceb6fded5fefd89bcfa944f1b4273916dab 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:44 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:14:25 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +197,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -207,7 +226,6 @@ CONFIG_CARDBUS=y
 # CONFIG_YENTA is not set
 CONFIG_PD6729=m
 # CONFIG_I82092 is not set
-# CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 CONFIG_PCCARD_NONSTATIC=m
 
@@ -267,15 +285,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -301,6 +323,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -351,6 +377,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -408,6 +435,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -431,18 +463,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -546,7 +569,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -565,7 +587,9 @@ CONFIG_MII=m
 CONFIG_MIPS_AU1X00_ENET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_SMC91X is not set
 
 #
 # Tulip family network device support
@@ -635,6 +659,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -700,13 +725,17 @@ CONFIG_SERIO_RAW=m
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
@@ -738,12 +767,15 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -796,6 +828,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index bbad27cb40a25bfce5e882464aab8825cd51c8c4..f8f32e99f72d675239e971f28c1922aebc252282 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:47 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:15:34 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +197,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -207,7 +226,6 @@ CONFIG_CARDBUS=y
 # CONFIG_YENTA is not set
 CONFIG_PD6729=m
 # CONFIG_I82092 is not set
-# CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 CONFIG_PCCARD_NONSTATIC=m
 
@@ -267,15 +285,19 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -301,6 +323,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -351,6 +377,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -408,6 +435,11 @@ CONFIG_MTD_ALCHEMY=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -431,18 +463,9 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -546,7 +569,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -565,7 +587,9 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MIPS_AU1X00_ENET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_SMC91X is not set
 
 #
 # Tulip family network device support
@@ -627,6 +651,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -692,13 +717,17 @@ CONFIG_SERIO_RAW=m
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_AU1X00=y
 
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_AU1X00=y
-CONFIG_SERIAL_AU1X00_CONSOLE=y
+# CONFIG_SERIAL_AU1X00 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
@@ -730,12 +759,15 @@ CONFIG_LEGACY_PTY_COUNT=256
 # PCMCIA character devices
 #
 CONFIG_SYNCLINK_CS=m
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -788,6 +820,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 555837e4c06f00866b678cb20bbb065bc2f80ca0..5820e5f2295ec44fe8b88b13158ebf19d9858c36 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:50 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:25 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -179,6 +197,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -265,6 +284,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -325,16 +348,7 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -423,12 +437,13 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
 # CONFIG_SCSI_SAS_ATTRS is not set
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -439,6 +454,7 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -473,6 +489,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -510,6 +527,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -681,6 +699,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -763,12 +782,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1039,6 +1061,8 @@ CONFIG_DEBUG_SLAB=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
 # CONFIG_DEBUG_STACK_USAGE is not set
@@ -1055,7 +1079,31 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=m
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_TEST is not set
 
 #
 # Hardware crypto devices
@@ -1067,4 +1115,4 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
 CONFIG_CRC_CCITT=m
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
+CONFIG_LIBCRC32C=m
index 37bd8d5c865d7e88aeecc9f33a7100ab54dc8acb..a4ebb538e15c4fa4f05cb49cc6c7ced99bdfbf76 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:53 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 14:02:38 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -180,6 +198,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -255,13 +274,17 @@ CONFIG_IPV6=m
 # CONFIG_IPV6_TUNNEL is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -293,6 +316,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -352,16 +379,7 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -451,12 +469,13 @@ CONFIG_BLK_DEV_SD=y
 #
 CONFIG_SCSI_SPI_ATTRS=m
 # CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
 # CONFIG_SCSI_SAS_ATTRS is not set
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -472,6 +491,7 @@ CONFIG_AIC7XXX_DEBUG_MASK=0
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -506,6 +526,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -543,6 +564,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -622,6 +644,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 # CONFIG_PPPOE is not set
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -746,6 +769,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -796,6 +820,7 @@ CONFIG_I2C_ALGOBIT=m
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -872,7 +897,6 @@ CONFIG_FB=y
 # CONFIG_FB_CFB_FILLRECT is not set
 # CONFIG_FB_CFB_COPYAREA is not set
 # CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_SOFT_CURSOR is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
@@ -881,6 +905,7 @@ CONFIG_FB=y
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
@@ -897,7 +922,6 @@ CONFIG_FB=y
 # CONFIG_FB_SMIVGX is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -946,12 +970,15 @@ CONFIG_USB_DEVICEFS=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1235,7 +1262,31 @@ CONFIG_CMDLINE=""
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_SHA1=m
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_TEST is not set
 
 #
 # Hardware crypto devices
@@ -1247,6 +1298,6 @@ CONFIG_CMDLINE=""
 CONFIG_CRC_CCITT=m
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=m
index 741a9a9713678a5ed9ba29043e768e2254a19401..5d39162077f4dc56e0aaeef29c158cf5de6ca1c1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:56 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:31 2005
 #
 CONFIG_MIPS=y
 
@@ -49,6 +49,24 @@ CONFIG_BASE_SMALL=1
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
 #
 # Machine selection
 #
@@ -168,6 +186,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -234,6 +253,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -265,6 +288,7 @@ CONFIG_STANDALONE=y
 # Connector - unified userspace <-> kernelspace linker
 #
 CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
 
 #
 # Memory Technology Devices (MTD)
@@ -289,16 +313,7 @@ CONFIG_CONNECTOR=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -353,7 +368,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=y
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -385,7 +399,6 @@ CONFIG_NET_ISA=y
 # CONFIG_ETH16I is not set
 CONFIG_NE2000=y
 # CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -557,6 +570,10 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 897420d39053fc9899a1a49e3488744164a707de..047e0b4236f8298cd7de207e153d889ff8b30d66 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:26:59 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 14:02:45 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -188,6 +206,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -265,15 +284,19 @@ CONFIG_IPV6=m
 # CONFIG_IPV6_TUNNEL is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+# CONFIG_NF_CONNTRACK is not set
 
 #
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
-CONFIG_IP_NF_PPTP=m
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
 # CONFIG_IP_NF_ARPTABLES is not set
@@ -305,6 +328,10 @@ CONFIG_IP_NF_PPTP=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -355,6 +382,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -411,6 +439,11 @@ CONFIG_MTD_CFI_UTIL=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -438,16 +471,7 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -556,7 +580,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -574,6 +597,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
@@ -619,7 +643,6 @@ CONFIG_NET_PCI=y
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
 # CONFIG_LAN_SAA9730 is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -668,7 +691,6 @@ CONFIG_NET_RADIO=y
 # CONFIG_IPW2100 is not set
 # CONFIG_IPW_DEBUG is not set
 CONFIG_IPW2200=m
-# CONFIG_AIRO is not set
 # CONFIG_HERMES is not set
 # CONFIG_ATMEL is not set
 
@@ -692,6 +714,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 # CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -804,6 +827,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -847,7 +871,6 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
@@ -856,6 +879,7 @@ CONFIG_FB_SOFT_CURSOR=y
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
@@ -876,7 +900,6 @@ CONFIG_FB_ATY_CT=y
 # CONFIG_FB_SMIVGX is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -926,12 +949,15 @@ CONFIG_USB=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
@@ -1106,6 +1132,7 @@ CONFIG_RELAYFS_FS=m
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
index 988a05824f0171db6f0f857c2bf6df1eb2f10832..55458062352e27c76267134fc891a5b6fc9bd039 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:03 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 14:02:50 2005
 #
 CONFIG_MIPS=y
 
@@ -58,6 +58,24 @@ CONFIG_MODVERSIONS=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -190,6 +208,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
@@ -272,6 +291,10 @@ CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -325,6 +348,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_TARGET_NFQUEUE=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -374,6 +398,7 @@ CONFIG_IP6_NF_MATCH_PHYSDEV=m
 CONFIG_IP6_NF_FILTER=m
 CONFIG_IP6_NF_TARGET_LOG=m
 CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_NFQUEUE=m
 CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_TARGET_HL=m
@@ -430,10 +455,18 @@ CONFIG_DECNET=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CLK_JIFFIES=y
 # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -446,8 +479,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -456,13 +491,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-# CONFIG_NET_CLS_IND is not set
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -583,18 +619,9 @@ CONFIG_BLK_DEV_UB=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -638,6 +665,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -651,6 +679,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_DTC3280 is not set
@@ -723,6 +752,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -752,7 +782,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -770,6 +799,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
@@ -984,6 +1014,7 @@ CONFIG_RTC=m
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -1074,12 +1105,15 @@ CONFIG_USB_UHCI_HCD=m
 #
 # USB Device Class drivers
 #
-CONFIG_USB_BLUETOOTH_TTY=m
 CONFIG_USB_ACM=m
 CONFIG_USB_PRINTER=m
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1196,6 +1230,7 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 CONFIG_USB_SERIAL_KLSI=m
 CONFIG_USB_SERIAL_KOBIL_SCT=m
 CONFIG_USB_SERIAL_MCT_U232=m
+# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 CONFIG_USB_SERIAL_PL2303=m
 CONFIG_USB_SERIAL_HP4X=m
 CONFIG_USB_SERIAL_SAFE=m
@@ -1271,7 +1306,7 @@ CONFIG_REISERFS_FS_SECURITY=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 # CONFIG_XFS_POSIX_ACL is not set
 # CONFIG_XFS_RT is not set
index 4365d9c8c42e6ef86a60695fbd6303080bc060c4..dc453a1e4806fe13ee5408a008a2223e1c52a66c 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:05 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:43 2005
 #
 CONFIG_MIPS=y
 
@@ -58,6 +58,23 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -126,8 +143,8 @@ CONFIG_CPU_SB1_PASS_1=y
 # CONFIG_CPU_SB1_PASS_3 is not set
 CONFIG_SIBYTE_HAS_LDT=y
 # CONFIG_SIMULATION is not set
-# CONFIG_CONFIG_SB1_CEX_ALWAYS_FATAL is not set
-# CONFIG_CONFIG_SB1_CERR_STALL is not set
+# CONFIG_SB1_CEX_ALWAYS_FATAL is not set
+# CONFIG_SB1_CERR_STALL is not set
 CONFIG_SIBYTE_CFE=y
 # CONFIG_SIBYTE_CFE_CONSOLE is not set
 # CONFIG_SIBYTE_BUS_WATCHER is not set
@@ -200,6 +217,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
 CONFIG_PREEMPT_NONE=y
@@ -295,6 +313,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -359,14 +381,6 @@ CONFIG_BLK_DEV_INITRD=y
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -441,7 +455,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -459,6 +472,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -599,6 +613,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -651,6 +666,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index d835f6db1f41ca9f842cbc56527d01d122fe1386..aa27d583162dd05617f13e7fa578b81ed007a776 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:07 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:45 2005
 #
 CONFIG_MIPS=y
 
@@ -47,6 +47,24 @@ CONFIG_BASE_SMALL=0
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -173,6 +191,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -242,17 +261,8 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=18432
 CONFIG_BLK_DEV_INITRD=y
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
 
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-
 #
 # ATA/ATAPI/MFM/RLL support
 #
@@ -353,6 +363,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -403,6 +414,10 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index bf60a17de2b013e7060b9b43e7766de325c7a5b1..ddc7e45996f28f0cc192728485cd4da341e14b64 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:10 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:49 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -183,6 +201,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -277,6 +296,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -339,16 +362,7 @@ CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -385,12 +399,13 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
 # CONFIG_SCSI_SAS_ATTRS is not set
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -401,6 +416,7 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -435,6 +451,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 # CONFIG_FUSION_SPI is not set
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -464,7 +481,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -482,6 +498,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -634,6 +651,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -650,6 +668,7 @@ CONFIG_GPIO_VR41XX=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -733,12 +752,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
index ac8b64e87b8a8a8fb181305f010044e3ba302ff0..e8c82f011e989b6d637ec82df39e14cfb261ae23 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:13 2005
+# Linux kernel version: 2.6.14
+# Wed Nov  9 11:11:47 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -183,6 +201,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -278,6 +297,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -341,18 +364,9 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -404,7 +418,6 @@ CONFIG_DUMMY=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -422,6 +435,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -504,6 +518,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
 CONFIG_PPPOE=m
 CONFIG_SLIP=m
 CONFIG_SLIP_COMPRESSED=y
@@ -589,6 +604,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -605,6 +621,7 @@ CONFIG_GPIO_VR41XX=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -688,12 +705,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
index ab13621ef3b9b43ef5df0ea2d95459bd89cf5b37..125b2997abfe6054b68e5369969b7fb7fa536142 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:16 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 11:17:02 2005
 #
 CONFIG_MIPS=y
 
@@ -56,6 +56,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -180,6 +198,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -273,6 +292,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -328,16 +351,7 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -415,7 +429,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -439,7 +452,6 @@ CONFIG_MII=m
 # CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -577,6 +589,7 @@ CONFIG_WATCHDOG=y
 # CONFIG_WDT is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
+# CONFIG_RTC_VR41XX is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
@@ -588,12 +601,15 @@ CONFIG_WATCHDOG=y
 # PCMCIA character devices
 #
 # CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_GPIO_VR41XX is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -652,6 +668,10 @@ CONFIG_DUMMY_CONSOLE=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
index 5b0b7f30e205aca052b60d080d4c5ffce51e2430..d90790b2ab30bcb18feec62aa7d2fb33c6cbc32b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:27:18 2005
+# Linux kernel version: 2.6.14
+# Mon Nov  7 23:06:59 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_OBSOLETE_MODPARM=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -181,6 +199,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
 CONFIG_PREEMPT_NONE=y
@@ -260,6 +279,10 @@ CONFIG_IPV6_TUNNEL=m
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -319,18 +342,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -382,7 +396,6 @@ CONFIG_NETDEVICES=y
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -400,6 +413,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -575,6 +589,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -690,6 +708,8 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_HIGHMEM is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE=""
 # CONFIG_DEBUG_STACK_USAGE is not set
index 35c6c22610c514c71811ab2ac22e765986ea5914..9510b9ae64534ed47281f694d4a2767718758790 100644 (file)
@@ -55,7 +55,7 @@ void lcd44780_data(unsigned char c)
 
 void lcd44780_puts(const char* s)
 {
-       int i,j;
+       int j;
        int pos = 0;
 
        lcd44780_command(LCD44780_CLEAR);
@@ -76,8 +76,12 @@ void lcd44780_puts(const char* s)
                }
        }
 #ifdef LCD44780_PUTS_PAUSE
-       for(i = 1; i < 2000; i++)
-               lcd44780_wait();
+       {
+               int i;
+
+               for(i = 1; i < 2000; i++)
+                       lcd44780_wait();
+       }
 #endif
 }
 
index 4b585e642c2a05766d44cda0c5baa6d45e50781a..e9086da02e48cd694a150ce5662cb623d4658d2a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc2
-# Thu Oct 20 22:25:09 2005
+# Linux kernel version: 2.6.14
+# Thu Nov 10 12:13:58 2005
 #
 CONFIG_MIPS=y
 
@@ -57,6 +57,24 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Machine selection
 #
@@ -187,6 +205,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
@@ -292,6 +311,10 @@ CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -345,6 +368,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_TARGET_NFQUEUE=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -393,6 +417,7 @@ CONFIG_IP6_NF_MATCH_EUI64=m
 CONFIG_IP6_NF_FILTER=m
 CONFIG_IP6_NF_TARGET_LOG=m
 CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_NFQUEUE=m
 CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_TARGET_HL=m
@@ -424,10 +449,18 @@ CONFIG_SCTP_HMAC_MD5=y
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 # CONFIG_NET_SCH_CLK_JIFFIES is not set
 CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_HFSC=m
@@ -440,8 +473,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 CONFIG_NET_SCH_NETEM=m
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 CONFIG_NET_CLS_BASIC=m
 CONFIG_NET_CLS_TCINDEX=m
@@ -450,13 +485,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-# CONFIG_NET_CLS_IND is not set
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -509,18 +545,9 @@ CONFIG_CONNECTOR=m
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
-# CONFIG_LBD is not set
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -564,6 +591,7 @@ CONFIG_SCSI_SAS_ATTRS=m
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 CONFIG_SGIWD93_SCSI=y
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -599,7 +627,6 @@ CONFIG_TUN=m
 # PHY device support
 #
 CONFIG_PHYLIB=m
-CONFIG_PHYCONTROL=y
 
 #
 # MII PHY device drivers
@@ -752,6 +779,7 @@ CONFIG_MAX_RAW_DEVS=256
 #
 # TPM devices
 #
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -820,6 +848,10 @@ CONFIG_LOGO_SGI_CLUT224=y
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -856,7 +888,7 @@ CONFIG_FS_MBCACHE=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_QUOTA=m
+CONFIG_XFS_QUOTA=y
 CONFIG_XFS_SECURITY=y
 # CONFIG_XFS_POSIX_ACL is not set
 # CONFIG_XFS_RT is not set
index 8b407d7dc460c2a7d905c5bc43e76532734636ef..9a8bff153d80020d0fb8c6b3734e09e89709cb10 100644 (file)
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/rtc.h>
+#include <linux/ds1742rtc.h>
 
 #include <asm/time.h>
 #include <asm/addrspace.h>
 
-#include <asm/jmr3927/ds1742rtc.h>
 #include <asm/debug.h>
 
 #define        EPOCH           2000
index 3e2fbdc6609798d40a7bbd4fe28c0233712d742a..55ad0a578794a510d7a158b470b832b88e6c315e 100644 (file)
@@ -357,7 +357,7 @@ static void __init jmr3927_board_init(void)
                       jmr3927_io_dipsw());
 }
 
-void __init plat_setup(void)
+void __init tx3927_setup(void)
 {
        int i;
 
index e1dd7e0097508d4c92bbeb430b7c4c8453ad39ed..90fda0d9915f6464718c296df52d2111588b2c2c 100644 (file)
 
 extern asmlinkage void mipsIRQ(void);
 
-asmlinkage void sead_hw0_irqdispatch(struct pt_regs *regs)
-{
-       do_IRQ(SEADINT_UART0, regs);
-}
-
-asmlinkage void sead_hw1_irqdispatch(struct pt_regs *regs)
-{
-       do_IRQ(SEADINT_UART1, regs);
-}
-
 void __init arch_init_irq(void)
 {
-       mips_cpu_irq_init(0);
+       mips_cpu_irq_init(MIPSCPU_INT_BASE);
 
        /* Now safe to set the exception vector. */
        set_except_vector(0, mipsIRQ);
index de90bec5505ed035e0f5f107736b00e7c9f2ff90..f966bc161dfaa06a6b08037e799f0ab8f5c05856 100644 (file)
@@ -45,7 +45,7 @@ const char *get_system_type(void)
        return "MIPS SEAD";
 }
 
-static void __init sead_setup(void)
+void __init plat_setup(void)
 {
        ioport_resource.end = 0x7fffffff;
 
@@ -69,7 +69,7 @@ static void __init serial_init(void)
 #else
        s.iobase = SEAD_UART0_REGS_BASE+3;
 #endif
-       s.irq = SEADINT_UART0;
+       s.irq = MIPSCPU_INT_BASE + MIPSCPU_INT_UART0;
        s.uartclk = SEAD_BASE_BAUD * 16;
        s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
        s.iotype = 0;
index d0b5c9dd0ea42b269dcc3850b9d0f73eff08de32..e5eceed1beff3cd2ff7a7502b87103ca1d344523 100644 (file)
@@ -178,7 +178,7 @@ void gt64240_time_init(void)
        timer.name = "timer";
        timer.dev_id = NULL;
        timer.next = NULL;
-       timer.mask = 0;
+       timer.mask = CPU_MASK_NONE;
        irq_desc[6].action = &timer;
 
        enable_irq(6);
index 7b7468304022dc494b6a94ec8c744b62ef871565..741e67c9195ade12e0e94e581fd42985a3ef91e3 100644 (file)
@@ -15,7 +15,7 @@ obj-$(CONFIG_MIPS_GT96100)    += ops-gt96100.o
 obj-$(CONFIG_PCI_MARVELL)      += ops-marvell.o
 obj-$(CONFIG_MIPS_MSC)         += ops-msc.o
 obj-$(CONFIG_MIPS_NILE4)       += ops-nile4.o
-obj-$(CONFIG_MIPS_TX3927)      += ops-jmr3927.o
+obj-$(CONFIG_MIPS_TX3927)      += ops-tx3927.o
 obj-$(CONFIG_PCI_VR41XX)       += ops-vr41xx.o pci-vr41xx.o
 obj-$(CONFIG_NEC_CMBVR4133)    += fixup-vr4133.o
 
index 0e0daadc303d547d2fc9241a322f26db6717d8f6..42530a0b84b325626ae844ed97f1275c69022102 100644 (file)
@@ -72,13 +72,9 @@ static inline int check_abort(void)
 static int jmr3927_pci_read_config(struct pci_bus *bus, unsigned int devfn,
        int where, int size, u32 * val)
 {
-       int ret, busno;
+       int ret;
 
-       /* check if the bus is top-level */
-       if (bus->parent != NULL)
-               busno = bus->number;
-
-       ret = mkaddr(busno, devfn, where);
+       ret = mkaddr(bus->number, devfn, where);
        if (ret)
                return ret;
 
@@ -102,15 +98,9 @@ static int jmr3927_pci_read_config(struct pci_bus *bus, unsigned int devfn,
 static int jmr3927_pci_write_config(struct pci_bus *bus, unsigned int devfn,
        int where, int size, u32 val)
 {
-       int ret, busno;
-
-       /* check if the bus is top-level */
-       if (bus->parent != NULL)
-               bus = bus->number;
-       else
-               bus = 0;
+       int ret;
 
-       ret = mkaddr(busno, devfn, where);
+       ret = mkaddr(bus->number, devfn, where);
        if (ret)
                return ret;
 
@@ -120,7 +110,7 @@ static int jmr3927_pci_write_config(struct pci_bus *bus, unsigned int devfn,
                break;
 
        case 2:
-               *(volatile u16 *) (unsigned longulong) & tx3927_pcicptr->icd | (where & 2)) =
+               *(volatile u16 *) ((unsigned long) & tx3927_pcicptr->icd | (where & 2)) =
            cpu_to_le16(val);
                break;
 
@@ -137,8 +127,8 @@ static int jmr3927_pci_write_config(struct pci_bus *bus, unsigned int devfn,
 }
 
 struct pci_ops jmr3927_pci_ops = {
-       jmr3927_pcibios_read_config,
-       jmr3927_pcibios_write_config,
+       jmr3927_pci_read_config,
+       jmr3927_pci_write_config,
 };
 
 
@@ -159,15 +149,14 @@ unsigned long tc_readl(volatile __u32 * addr)
 {
        unsigned long val;
 
-       addr = PHYSADDR(addr);
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
-           (unsigned long) addr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
+           (unsigned long) CPHYSADDR(addr);
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_MEMREAD << PCI_IPCIBE_ICMD_SHIFT) |
            PCI_IPCIBE_IBE_LONG;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        val =
-           le32_to_cpu(*(volatile u32 *) (ulong) & tx3927_pcicptr->
+           le32_to_cpu(*(volatile u32 *) (unsigned long) & tx3927_pcicptr->
                        ipcidata);
        /* clear by setting */
        tx3927_pcicptr->istat |= PCI_ISTAT_IDICC;
@@ -176,12 +165,11 @@ unsigned long tc_readl(volatile __u32 * addr)
 
 void tc_writel(unsigned long data, volatile __u32 * addr)
 {
-       addr = PHYSADDR(addr);
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcidata =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcidata =
            cpu_to_le32(data);
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
-           (unsigned long) addr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
+           (unsigned long) CPHYSADDR(addr);
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_MEMWRITE << PCI_IPCIBE_ICMD_SHIFT) |
            PCI_IPCIBE_IBE_LONG;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
@@ -198,21 +186,15 @@ unsigned char tx_ioinb(unsigned char *addr)
 
        ioaddr = (unsigned long) addr;
        offset = ioaddr & 0x3;
-       if (offset == 0)
-               byte = 0x7;
-       else if (offset == 1)
-               byte = 0xb;
-       else if (offset == 2)
-               byte = 0xd;
-       else if (offset == 3)
-               byte = 0xe;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       byte = 0xf & ~(8 >> offset);
+
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOREAD << PCI_IPCIBE_ICMD_SHIFT) | byte;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        val =
-           le32_to_cpu(*(volatile u32 *) (ulong) & tx3927_pcicptr->
+           le32_to_cpu(*(volatile u32 *) (unsigned long) & tx3927_pcicptr->
                        ipcidata);
        val = val & 0xff;
        /* clear by setting */
@@ -229,18 +211,12 @@ void tx_iooutb(unsigned long data, unsigned char *addr)
        data = data | (data << 8) | (data << 16) | (data << 24);
        ioaddr = (unsigned long) addr;
        offset = ioaddr & 0x3;
-       if (offset == 0)
-               byte = 0x7;
-       else if (offset == 1)
-               byte = 0xb;
-       else if (offset == 2)
-               byte = 0xd;
-       else if (offset == 3)
-               byte = 0xe;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcidata = data;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       byte = 0xf & ~(8 >> offset);
+
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcidata = data;
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOWRITE << PCI_IPCIBE_ICMD_SHIFT) | byte;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        /* clear by setting */
@@ -255,18 +231,16 @@ unsigned short tx_ioinw(unsigned short *addr)
        int byte;
 
        ioaddr = (unsigned long) addr;
-       offset = ioaddr & 0x3;
-       if (offset == 0)
-               byte = 0x3;
-       else if (offset == 2)
-               byte = 0xc;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       offset = ioaddr & 0x2;
+       byte = 3 << offset;
+
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOREAD << PCI_IPCIBE_ICMD_SHIFT) | byte;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        val =
-           le32_to_cpu(*(volatile u32 *) (ulong) & tx3927_pcicptr->
+           le32_to_cpu(*(volatile u32 *) (unsigned long) & tx3927_pcicptr->
                        ipcidata);
        val = val & 0xffff;
        /* clear by setting */
@@ -283,15 +257,13 @@ void tx_iooutw(unsigned long data, unsigned short *addr)
 
        data = data | (data << 16);
        ioaddr = (unsigned long) addr;
-       offset = ioaddr & 0x3;
-       if (offset == 0)
-               byte = 0x3;
-       else if (offset == 2)
-               byte = 0xc;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcidata = data;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       offset = ioaddr & 0x2;
+       byte = 3 << offset;
+
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcidata = data;
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOWRITE << PCI_IPCIBE_ICMD_SHIFT) | byte;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        /* clear by setting */
@@ -304,14 +276,14 @@ unsigned long tx_ioinl(unsigned int *addr)
        __u32 ioaddr;
 
        ioaddr = (unsigned long) addr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOREAD << PCI_IPCIBE_ICMD_SHIFT) |
            PCI_IPCIBE_IBE_LONG;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
        val =
-           le32_to_cpu(*(volatile u32 *) (ulong) & tx3927_pcicptr->
+           le32_to_cpu(*(volatile u32 *) (unsigned long) & tx3927_pcicptr->
                        ipcidata);
        /* clear by setting */
        tx3927_pcicptr->istat |= PCI_ISTAT_IDICC;
@@ -323,11 +295,11 @@ void tx_iooutl(unsigned long data, unsigned int *addr)
        __u32 ioaddr;
 
        ioaddr = (unsigned long) addr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcidata =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcidata =
            cpu_to_le32(data);
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipciaddr =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipciaddr =
            (unsigned long) ioaddr;
-       *(volatile u32 *) (ulong) & tx3927_pcicptr->ipcibe =
+       *(volatile u32 *) (unsigned long) & tx3927_pcicptr->ipcibe =
            (PCI_IPCIBE_ICMD_IOWRITE << PCI_IPCIBE_ICMD_SHIFT) |
            PCI_IPCIBE_IBE_LONG;
        while (!(tx3927_pcicptr->istat & PCI_ISTAT_IDICC));
index 95a028769e561ddeef6920097cb905a8db2b238b..f02ef6e36b02cf19e0dee3a66241835f2cf362ca 100644 (file)
@@ -54,5 +54,5 @@ struct pci_controller jmr3927_controller = {
        .pci_ops        = &jmr3927_pci_ops,
        .io_resource    = &pci_io_resource,
        .mem_resource   = &pci_mem_resource,
-       .mem_offset     = JMR3927_PCIMEM;
+       .mem_offset     = JMR3927_PCIMEM
 };
index eb3a16a04fee2c75beec145a62d725f478cd3412..41b5eca1148c20bdbf1047686ffcd85238b61253 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
+#include <linux/module.h>
 #include <asm/bootinfo.h>
 #include <asm/io.h>
 #include <asm/mipsregs.h>
 #include <asm/ip32/crime.h>
 #include <asm/ip32/mace.h>
 
-struct sgi_crime *crime;
-struct sgi_mace *mace;
+struct sgi_crime __iomem *crime;
+struct sgi_mace __iomem *mace;
+
+EXPORT_SYMBOL_GPL(mace);
 
 void __init crime_init(void)
 {
index 988844a169e615a764fe7e43460738c8b628f89b..d016d672ec2b2515ff5c9af789a5e457f860ca06 100644 (file)
@@ -499,8 +499,12 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
 
        dev = create_parisc_device(mod_path);
        if (dev->id.hw_type != HPHW_FAULTY) {
-               printk("Two devices have hardware path %s.  Please file a bug with HP.\n"
-                       "In the meantime, you could try rearranging your cards.\n", parisc_pathname(dev));
+               printk(KERN_ERR "Two devices have hardware path [%s].  "
+                               "IODC data for second device: "
+                               "%02x%02x%02x%02x%02x%02x\n"
+                               "Rearranging GSC cards sometimes helps\n",
+                       parisc_pathname(dev), iodc_data[0], iodc_data[1],
+                       iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]);
                return NULL;
        }
 
index c7e66ee5b083729ff4a7305ef066d0c7d9c91a65..9af4b22a6d77e793a2600eec96529fd2e2183641 100644 (file)
@@ -1846,6 +1846,7 @@ sys_clone_wrapper:
        ldo     -16(%r30),%r29          /* Reference param save area */
 #endif
 
+       /* WARNING - Clobbers r19 and r21, userspace must save these! */
        STREG   %r2,PT_GR19(%r1)        /* save for child */
        STREG   %r30,PT_GR21(%r1)
        BL      sys_clone,%r2
index 1a1c66422736e331710780ff929c00c29ec09ff7..8f563871e83c599e068872215b1b0d4fc0a80bdf 100644 (file)
@@ -188,7 +188,7 @@ pat_query_module(ulong pcell_loc, ulong mod_index)
        temp = pa_pdc_cell.cba;
        dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path);
        if (!dev) {
-               return PDC_NE_MOD;
+               return PDC_OK;
        }
 
        /* alloc_pa_dev sets dev->hpa */
index 0a331104ad5675a0c8f9440e44d8bb63977996ad..4eada1bb27f0f47afd27602d130ccfaa074e4982 100644 (file)
 #define CODE
 #include "compat_ioctl.c"
 
-/* Use this to get at 32-bit user passed pointers. 
-   See sys_sparc32.c for description about these. */
-#define A(__x) ((unsigned long)(__x))
-/* The same for use with copy_from_user() and copy_to_user(). */
-#define B(__x) ((void *)(unsigned long)(__x))
-
-#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
-/* This really belongs in include/linux/drm.h -DaveM */
-#include "../../../drivers/char/drm/drm.h"
-
-typedef struct drm32_version {
-       int    version_major;     /* Major version                          */
-       int    version_minor;     /* Minor version                          */
-       int    version_patchlevel;/* Patch level                            */
-       int    name_len;          /* Length of name buffer                  */
-       u32    name;              /* Name of driver                         */
-       int    date_len;          /* Length of date buffer                  */
-       u32    date;              /* User-space buffer to hold date         */
-       int    desc_len;          /* Length of desc buffer                  */
-       u32    desc;              /* User-space buffer to hold desc         */
-} drm32_version_t;
-#define DRM32_IOCTL_VERSION    DRM_IOWR(0x00, drm32_version_t)
-
-static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_version_t *uversion = (drm32_version_t *)arg;
-       char *name_ptr, *date_ptr, *desc_ptr;
-       u32 tmp1, tmp2, tmp3;
-       drm_version_t kversion;
-       mm_segment_t old_fs;
-       int ret;
-
-       memset(&kversion, 0, sizeof(kversion));
-       if (get_user(kversion.name_len, &uversion->name_len) ||
-           get_user(kversion.date_len, &uversion->date_len) ||
-           get_user(kversion.desc_len, &uversion->desc_len) ||
-           get_user(tmp1, &uversion->name) ||
-           get_user(tmp2, &uversion->date) ||
-           get_user(tmp3, &uversion->desc))
-               return -EFAULT;
-
-       name_ptr = (char *) A(tmp1);
-       date_ptr = (char *) A(tmp2);
-       desc_ptr = (char *) A(tmp3);
-
-       ret = -ENOMEM;
-       if (kversion.name_len && name_ptr) {
-               kversion.name = kmalloc(kversion.name_len, GFP_KERNEL);
-               if (!kversion.name)
-                       goto out;
-       }
-       if (kversion.date_len && date_ptr) {
-               kversion.date = kmalloc(kversion.date_len, GFP_KERNEL);
-               if (!kversion.date)
-                       goto out;
-       }
-       if (kversion.desc_len && desc_ptr) {
-               kversion.desc = kmalloc(kversion.desc_len, GFP_KERNEL);
-               if (!kversion.desc)
-                       goto out;
-       }
-
-        old_fs = get_fs();
-       set_fs(KERNEL_DS);
-        ret = sys_ioctl (fd, DRM_IOCTL_VERSION, (unsigned long)&kversion);
-        set_fs(old_fs);
-
-       if (!ret) {
-               if ((kversion.name &&
-                    copy_to_user(name_ptr, kversion.name, kversion.name_len)) ||
-                   (kversion.date &&
-                    copy_to_user(date_ptr, kversion.date, kversion.date_len)) ||
-                   (kversion.desc &&
-                    copy_to_user(desc_ptr, kversion.desc, kversion.desc_len)))
-                       ret = -EFAULT;
-               if (put_user(kversion.version_major, &uversion->version_major) ||
-                   put_user(kversion.version_minor, &uversion->version_minor) ||
-                   put_user(kversion.version_patchlevel, &uversion->version_patchlevel) ||
-                   put_user(kversion.name_len, &uversion->name_len) ||
-                   put_user(kversion.date_len, &uversion->date_len) ||
-                   put_user(kversion.desc_len, &uversion->desc_len))
-                       ret = -EFAULT;
-       }
-
-out:
-       kfree(kversion.name);
-       kfree(kversion.date);
-       kfree(kversion.desc);
-       return ret;
-}
-
-typedef struct drm32_unique {
-       int     unique_len;       /* Length of unique                       */
-       u32     unique;           /* Unique name for driver instantiation   */
-} drm32_unique_t;
-#define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t)
-#define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t)
-
-static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_unique_t *uarg = (drm32_unique_t *)arg;
-       drm_unique_t karg;
-       mm_segment_t old_fs;
-       char *uptr;
-       u32 tmp;
-       int ret;
-
-       if (get_user(karg.unique_len, &uarg->unique_len))
-               return -EFAULT;
-       karg.unique = NULL;
-
-       if (get_user(tmp, &uarg->unique))
-               return -EFAULT;
-
-       uptr = (char *) A(tmp);
-
-       if (uptr) {
-               karg.unique = kmalloc(karg.unique_len, GFP_KERNEL);
-               if (!karg.unique)
-                       return -ENOMEM;
-               if (cmd == DRM32_IOCTL_SET_UNIQUE &&
-                   copy_from_user(karg.unique, uptr, karg.unique_len)) {
-                       kfree(karg.unique);
-                       return -EFAULT;
-               }
-       }
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       if (cmd == DRM32_IOCTL_GET_UNIQUE)
-               ret = sys_ioctl (fd, DRM_IOCTL_GET_UNIQUE, (unsigned long)&karg);
-       else
-               ret = sys_ioctl (fd, DRM_IOCTL_SET_UNIQUE, (unsigned long)&karg);
-        set_fs(old_fs);
-
-       if (!ret) {
-               if (cmd == DRM32_IOCTL_GET_UNIQUE &&
-                   uptr != NULL &&
-                   copy_to_user(uptr, karg.unique, karg.unique_len))
-                       ret = -EFAULT;
-               if (put_user(karg.unique_len, &uarg->unique_len))
-                       ret = -EFAULT;
-       }
-
-       kfree(karg.unique);
-       return ret;
-}
-
-typedef struct drm32_map {
-       u32             offset;  /* Requested physical address (0 for SAREA)*/
-       u32             size;    /* Requested physical size (bytes)         */
-       drm_map_type_t  type;    /* Type of memory to map                   */
-       drm_map_flags_t flags;   /* Flags                                   */
-       u32             handle;  /* User-space: "Handle" to pass to mmap    */
-                                /* Kernel-space: kernel-virtual address    */
-       int             mtrr;    /* MTRR slot used                          */
-                                /* Private data                            */
-} drm32_map_t;
-#define DRM32_IOCTL_ADD_MAP    DRM_IOWR(0x15, drm32_map_t)
-
-static int drm32_addmap(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_map_t *uarg = (drm32_map_t *) arg;
-       drm_map_t karg;
-       mm_segment_t old_fs;
-       u32 tmp;
-       int ret;
-
-       ret  = get_user(karg.offset, &uarg->offset);
-       ret |= get_user(karg.size, &uarg->size);
-       ret |= get_user(karg.type, &uarg->type);
-       ret |= get_user(karg.flags, &uarg->flags);
-       ret |= get_user(tmp, &uarg->handle);
-       ret |= get_user(karg.mtrr, &uarg->mtrr);
-       if (ret)
-               return -EFAULT;
-
-       karg.handle = (void *) A(tmp);
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_ADD_MAP, (unsigned long) &karg);
-       set_fs(old_fs);
-
-       if (!ret) {
-               ret  = put_user(karg.offset, &uarg->offset);
-               ret |= put_user(karg.size, &uarg->size);
-               ret |= put_user(karg.type, &uarg->type);
-               ret |= put_user(karg.flags, &uarg->flags);
-               tmp = (u32) (long)karg.handle;
-               ret |= put_user(tmp, &uarg->handle);
-               ret |= put_user(karg.mtrr, &uarg->mtrr);
-               if (ret)
-                       ret = -EFAULT;
-       }
-
-       return ret;
-}
-
-typedef struct drm32_buf_info {
-       int            count;   /* Entries in list                           */
-       u32            list;    /* (drm_buf_desc_t *) */ 
-} drm32_buf_info_t;
-#define DRM32_IOCTL_INFO_BUFS  DRM_IOWR(0x18, drm32_buf_info_t)
-
-static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg;
-       drm_buf_desc_t *ulist;
-       drm_buf_info_t karg;
-       mm_segment_t old_fs;
-       int orig_count, ret;
-       u32 tmp;
-
-       if (get_user(karg.count, &uarg->count) ||
-           get_user(tmp, &uarg->list))
-               return -EFAULT;
-
-       ulist = (drm_buf_desc_t *) A(tmp);
-
-       orig_count = karg.count;
-
-       karg.list = kmalloc(karg.count * sizeof(drm_buf_desc_t), GFP_KERNEL);
-       if (!karg.list)
-               return -EFAULT;
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_INFO_BUFS, (unsigned long) &karg);
-       set_fs(old_fs);
-
-       if (!ret) {
-               if (karg.count <= orig_count &&
-                   (copy_to_user(ulist, karg.list,
-                                 karg.count * sizeof(drm_buf_desc_t))))
-                       ret = -EFAULT;
-               if (put_user(karg.count, &uarg->count))
-                       ret = -EFAULT;
-       }
-
-       kfree(karg.list);
-       return ret;
-}
-
-typedef struct drm32_buf_free {
-       int            count;
-       u32            list;    /* (int *) */
-} drm32_buf_free_t;
-#define DRM32_IOCTL_FREE_BUFS  DRM_IOW( 0x1a, drm32_buf_free_t)
-
-static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg;
-       drm_buf_free_t karg;
-       mm_segment_t old_fs;
-       int *ulist;
-       int ret;
-       u32 tmp;
-
-       if (get_user(karg.count, &uarg->count) ||
-           get_user(tmp, &uarg->list))
-               return -EFAULT;
-
-       ulist = (int *) A(tmp);
-
-       karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL);
-       if (!karg.list)
-               return -ENOMEM;
-
-       ret = -EFAULT;
-       if (copy_from_user(karg.list, ulist, (karg.count * sizeof(int))))
-               goto out;
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_FREE_BUFS, (unsigned long) &karg);
-       set_fs(old_fs);
-
-out:
-       kfree(karg.list);
-       return ret;
-}
-
-typedef struct drm32_buf_pub {
-       int               idx;         /* Index into master buflist          */
-       int               total;       /* Buffer size                        */
-       int               used;        /* Amount of buffer in use (for DMA)  */
-       u32               address;     /* Address of buffer (void *)         */
-} drm32_buf_pub_t;
-
-typedef struct drm32_buf_map {
-       int           count;    /* Length of buflist                        */
-       u32           virtual;  /* Mmaped area in user-virtual (void *)     */
-       u32           list;     /* Buffer information (drm_buf_pub_t *)     */
-} drm32_buf_map_t;
-#define DRM32_IOCTL_MAP_BUFS   DRM_IOWR(0x19, drm32_buf_map_t)
-
-static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg;
-       drm32_buf_pub_t *ulist;
-       drm_buf_map_t karg;
-       mm_segment_t old_fs;
-       int orig_count, ret, i;
-       u32 tmp1, tmp2;
-
-       if (get_user(karg.count, &uarg->count) ||
-           get_user(tmp1, &uarg->virtual) ||
-           get_user(tmp2, &uarg->list))
-               return -EFAULT;
-
-       karg.virtual = (void *) A(tmp1);
-       ulist = (drm32_buf_pub_t *) A(tmp2);
-
-       orig_count = karg.count;
-
-       karg.list = kmalloc(karg.count * sizeof(drm_buf_pub_t), GFP_KERNEL);
-       if (!karg.list)
-               return -ENOMEM;
-
-       ret = -EFAULT;
-       for (i = 0; i < karg.count; i++) {
-               if (get_user(karg.list[i].idx, &ulist[i].idx) ||
-                   get_user(karg.list[i].total, &ulist[i].total) ||
-                   get_user(karg.list[i].used, &ulist[i].used) ||
-                   get_user(tmp1, &ulist[i].address))
-                       goto out;
-
-               karg.list[i].address = (void *) A(tmp1);
-       }
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_MAP_BUFS, (unsigned long) &karg);
-       set_fs(old_fs);
-
-       if (!ret) {
-               for (i = 0; i < orig_count; i++) {
-                       tmp1 = (u32) (long) karg.list[i].address;
-                       if (put_user(karg.list[i].idx, &ulist[i].idx) ||
-                           put_user(karg.list[i].total, &ulist[i].total) ||
-                           put_user(karg.list[i].used, &ulist[i].used) ||
-                           put_user(tmp1, &ulist[i].address)) {
-                               ret = -EFAULT;
-                               goto out;
-                       }
-               }
-               if (put_user(karg.count, &uarg->count))
-                       ret = -EFAULT;
-       }
-
-out:
-       kfree(karg.list);
-       return ret;
-}
-
-typedef struct drm32_dma {
-                               /* Indices here refer to the offset into
-                                  buflist in drm_buf_get_t.  */
-       int             context;          /* Context handle                 */
-       int             send_count;       /* Number of buffers to send      */
-       u32             send_indices;     /* List of handles to buffers (int *) */
-       u32             send_sizes;       /* Lengths of data to send (int *) */
-       drm_dma_flags_t flags;            /* Flags                          */
-       int             request_count;    /* Number of buffers requested    */
-       int             request_size;     /* Desired size for buffers       */
-       u32             request_indices;  /* Buffer information (int *)     */
-       u32             request_sizes;    /* (int *) */
-       int             granted_count;    /* Number of buffers granted      */
-} drm32_dma_t;
-#define DRM32_IOCTL_DMA             DRM_IOWR(0x29, drm32_dma_t)
-
-/* RED PEN     The DRM layer blindly dereferences the send/request
- *             indice/size arrays even though they are userland
- *             pointers.  -DaveM
- */
-static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_dma_t *uarg = (drm32_dma_t *) arg;
-       int *u_si, *u_ss, *u_ri, *u_rs;
-       drm_dma_t karg;
-       mm_segment_t old_fs;
-       int ret;
-       u32 tmp1, tmp2, tmp3, tmp4;
-
-       karg.send_indices = karg.send_sizes = NULL;
-       karg.request_indices = karg.request_sizes = NULL;
-
-       if (get_user(karg.context, &uarg->context) ||
-           get_user(karg.send_count, &uarg->send_count) ||
-           get_user(tmp1, &uarg->send_indices) ||
-           get_user(tmp2, &uarg->send_sizes) ||
-           get_user(karg.flags, &uarg->flags) ||
-           get_user(karg.request_count, &uarg->request_count) ||
-           get_user(karg.request_size, &uarg->request_size) ||
-           get_user(tmp3, &uarg->request_indices) ||
-           get_user(tmp4, &uarg->request_sizes) ||
-           get_user(karg.granted_count, &uarg->granted_count))
-               return -EFAULT;
-
-       u_si = (int *) A(tmp1);
-       u_ss = (int *) A(tmp2);
-       u_ri = (int *) A(tmp3);
-       u_rs = (int *) A(tmp4);
-
-       if (karg.send_count) {
-               karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);
-               karg.send_sizes = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);
-
-               ret = -ENOMEM;
-               if (!karg.send_indices || !karg.send_sizes)
-                       goto out;
-
-               ret = -EFAULT;
-               if (copy_from_user(karg.send_indices, u_si,
-                                  (karg.send_count * sizeof(int))) ||
-                   copy_from_user(karg.send_sizes, u_ss,
-                                  (karg.send_count * sizeof(int))))
-                       goto out;
-       }
-
-       if (karg.request_count) {
-               karg.request_indices = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);
-               karg.request_sizes = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);
-
-               ret = -ENOMEM;
-               if (!karg.request_indices || !karg.request_sizes)
-                       goto out;
-
-               ret = -EFAULT;
-               if (copy_from_user(karg.request_indices, u_ri,
-                                  (karg.request_count * sizeof(int))) ||
-                   copy_from_user(karg.request_sizes, u_rs,
-                                  (karg.request_count * sizeof(int))))
-                       goto out;
-       }
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_DMA, (unsigned long) &karg);
-       set_fs(old_fs);
-
-       if (!ret) {
-               if (put_user(karg.context, &uarg->context) ||
-                   put_user(karg.send_count, &uarg->send_count) ||
-                   put_user(karg.flags, &uarg->flags) ||
-                   put_user(karg.request_count, &uarg->request_count) ||
-                   put_user(karg.request_size, &uarg->request_size) ||
-                   put_user(karg.granted_count, &uarg->granted_count))
-                       ret = -EFAULT;
-
-               if (karg.send_count) {
-                       if (copy_to_user(u_si, karg.send_indices,
-                                        (karg.send_count * sizeof(int))) ||
-                           copy_to_user(u_ss, karg.send_sizes,
-                                        (karg.send_count * sizeof(int))))
-                               ret = -EFAULT;
-               }
-               if (karg.request_count) {
-                       if (copy_to_user(u_ri, karg.request_indices,
-                                        (karg.request_count * sizeof(int))) ||
-                           copy_to_user(u_rs, karg.request_sizes,
-                                        (karg.request_count * sizeof(int))))
-                               ret = -EFAULT;
-               }
-       }
-
-out:
-       kfree(karg.send_indices);
-       kfree(karg.send_sizes);
-       kfree(karg.request_indices);
-       kfree(karg.request_sizes);
-       return ret;
-}
-
-typedef struct drm32_ctx_res {
-       int             count;
-       u32             contexts; /* (drm_ctx_t *) */
-} drm32_ctx_res_t;
-#define DRM32_IOCTL_RES_CTX    DRM_IOWR(0x26, drm32_ctx_res_t)
-
-static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg;
-       drm_ctx_t *ulist;
-       drm_ctx_res_t karg;
-       mm_segment_t old_fs;
-       int orig_count, ret;
-       u32 tmp;
-
-       karg.contexts = NULL;
-       if (get_user(karg.count, &uarg->count) ||
-           get_user(tmp, &uarg->contexts))
-               return -EFAULT;
-
-       ulist = (drm_ctx_t *) A(tmp);
-
-       orig_count = karg.count;
-       if (karg.count && ulist) {
-               karg.contexts = kmalloc((karg.count * sizeof(drm_ctx_t)), GFP_KERNEL);
-               if (!karg.contexts)
-                       return -ENOMEM;
-               if (copy_from_user(karg.contexts, ulist,
-                                  (karg.count * sizeof(drm_ctx_t)))) {
-                       kfree(karg.contexts);
-                       return -EFAULT;
-               }
-       }
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, DRM_IOCTL_RES_CTX, (unsigned long) &karg);
-       set_fs(old_fs);
-
-       if (!ret) {
-               if (orig_count) {
-                       if (copy_to_user(ulist, karg.contexts,
-                                        (orig_count * sizeof(drm_ctx_t))))
-                               ret = -EFAULT;
-               }
-               if (put_user(karg.count, &uarg->count))
-                       ret = -EFAULT;
-       }
-
-       kfree(karg.contexts);
-       return ret;
-}
-
-#endif
-
 #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL },
 #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) 
 
@@ -561,11 +31,6 @@ IOCTL_TABLE_START
 #define DECLARES
 #include "compat_ioctl.c"
 
-/* PA-specific ioctls */
-COMPATIBLE_IOCTL(PA_PERF_ON)
-COMPATIBLE_IOCTL(PA_PERF_OFF)
-COMPATIBLE_IOCTL(PA_PERF_VERSION)
-
 /* And these ioctls need translation */
 HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
 HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
@@ -590,17 +55,6 @@ HANDLE_IOCTL(RTC_EPOCH_READ, w_long)
 COMPATIBLE_IOCTL(RTC_EPOCH_SET)
 #endif
 
-#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
-HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version);
-HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique);
-HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique);
-HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap);
-HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs);
-HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs);
-HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs);
-HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma);
-HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx);
-#endif /* DRM */
 IOCTL_TABLE_END
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);
index 006385dbee6600a147c9ebeb3c827a23e0777118..197936d9359a4065332a2c9a67ad8bd69ad04f33 100644 (file)
@@ -30,6 +30,9 @@
 #include <linux/seq_file.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
+#include <asm/io.h>
+
+#include <asm/smp.h>
 
 #undef PARISC_IRQ_CR16_COUNTS
 
@@ -43,26 +46,34 @@ extern irqreturn_t ipi_interrupt(int, void *, struct pt_regs *);
 */
 static volatile unsigned long cpu_eiem = 0;
 
-static void cpu_set_eiem(void *info)
-{
-       set_eiem((unsigned long) info);
-}
-
-static inline void cpu_disable_irq(unsigned int irq)
+static void cpu_disable_irq(unsigned int irq)
 {
        unsigned long eirr_bit = EIEM_MASK(irq);
 
        cpu_eiem &= ~eirr_bit;
-        on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1);
+       /* Do nothing on the other CPUs.  If they get this interrupt,
+        * The & cpu_eiem in the do_cpu_irq_mask() ensures they won't
+        * handle it, and the set_eiem() at the bottom will ensure it
+        * then gets disabled */
 }
 
 static void cpu_enable_irq(unsigned int irq)
 {
        unsigned long eirr_bit = EIEM_MASK(irq);
 
-       mtctl(eirr_bit, 23);    /* clear EIRR bit before unmasking */
        cpu_eiem |= eirr_bit;
-        on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1);
+
+       /* FIXME: while our interrupts aren't nested, we cannot reset
+        * the eiem mask if we're already in an interrupt.  Once we
+        * implement nested interrupts, this can go away
+        */
+       if (!in_interrupt())
+               set_eiem(cpu_eiem);
+
+       /* This is just a simple NOP IPI.  But what it does is cause
+        * all the other CPUs to do a set_eiem(cpu_eiem) at the end
+        * of the interrupt handler */
+       smp_send_all_nop();
 }
 
 static unsigned int cpu_startup_irq(unsigned int irq)
@@ -74,6 +85,35 @@ static unsigned int cpu_startup_irq(unsigned int irq)
 void no_ack_irq(unsigned int irq) { }
 void no_end_irq(unsigned int irq) { }
 
+#ifdef CONFIG_SMP
+int cpu_check_affinity(unsigned int irq, cpumask_t *dest)
+{
+       int cpu_dest;
+
+       /* timer and ipi have to always be received on all CPUs */
+       if (irq == TIMER_IRQ || irq == IPI_IRQ) {
+               /* Bad linux design decision.  The mask has already
+                * been set; we must reset it */
+               irq_affinity[irq] = CPU_MASK_ALL;
+               return -EINVAL;
+       }
+
+       /* whatever mask they set, we just allow one CPU */
+       cpu_dest = first_cpu(*dest);
+       *dest = cpumask_of_cpu(cpu_dest);
+
+       return 0;
+}
+
+static void cpu_set_affinity_irq(unsigned int irq, cpumask_t dest)
+{
+       if (cpu_check_affinity(irq, &dest))
+               return;
+
+       irq_affinity[irq] = dest;
+}
+#endif
+
 static struct hw_interrupt_type cpu_interrupt_type = {
        .typename       = "CPU",
        .startup        = cpu_startup_irq,
@@ -82,7 +122,9 @@ static struct hw_interrupt_type cpu_interrupt_type = {
        .disable        = cpu_disable_irq,
        .ack            = no_ack_irq,
        .end            = no_end_irq,
-//     .set_affinity   = cpu_set_affinity_irq,
+#ifdef CONFIG_SMP
+       .set_affinity   = cpu_set_affinity_irq,
+#endif
 };
 
 int show_interrupts(struct seq_file *p, void *v)
@@ -219,6 +261,17 @@ int txn_alloc_irq(unsigned int bits_wide)
        return -1;
 }
 
+
+unsigned long txn_affinity_addr(unsigned int irq, int cpu)
+{
+#ifdef CONFIG_SMP
+       irq_affinity[irq] = cpumask_of_cpu(cpu);
+#endif
+
+       return cpu_data[cpu].txn_addr;
+}
+
+
 unsigned long txn_alloc_addr(unsigned int virt_irq)
 {
        static int next_cpu = -1;
@@ -233,7 +286,7 @@ unsigned long txn_alloc_addr(unsigned int virt_irq)
        if (next_cpu >= NR_CPUS) 
                next_cpu = 0;   /* nothing else, assign monarch */
 
-       return cpu_data[next_cpu].txn_addr;
+       return txn_affinity_addr(virt_irq, next_cpu);
 }
 
 
@@ -250,10 +303,11 @@ void do_cpu_irq_mask(struct pt_regs *regs)
        irq_enter();
 
        /*
-        * Only allow interrupt processing to be interrupted by the
-        * timer tick
+        * Don't allow TIMER or IPI nested interrupts.
+        * Allowing any single interrupt to nest can lead to that CPU
+        * handling interrupts with all enabled interrupts unmasked.
         */
-       set_eiem(EIEM_MASK(TIMER_IRQ));
+       set_eiem(0UL);
 
        /* 1) only process IRQs that are enabled/unmasked (cpu_eiem)
         * 2) We loop here on EIRR contents in order to avoid
@@ -267,23 +321,41 @@ void do_cpu_irq_mask(struct pt_regs *regs)
                if (!eirr_val)
                        break;
 
-               if (eirr_val & EIEM_MASK(TIMER_IRQ))
-                       set_eiem(0);
-
                mtctl(eirr_val, 23); /* reset bits we are going to process */
 
                /* Work our way from MSb to LSb...same order we alloc EIRs */
                for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) {
+#ifdef CONFIG_SMP
+                       cpumask_t dest = irq_affinity[irq];
+#endif
                        if (!(bit & eirr_val))
                                continue;
 
                        /* clear bit in mask - can exit loop sooner */
                        eirr_val &= ~bit;
 
+#ifdef CONFIG_SMP
+                       /* FIXME: because generic set affinity mucks
+                        * with the affinity before sending it to us
+                        * we can get the situation where the affinity is
+                        * wrong for our CPU type interrupts */
+                       if (irq != TIMER_IRQ && irq != IPI_IRQ &&
+                           !cpu_isset(smp_processor_id(), dest)) {
+                               int cpu = first_cpu(dest);
+
+                               printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n",
+                                      irq, smp_processor_id(), cpu);
+                               gsc_writel(irq + CPU_IRQ_BASE,
+                                          cpu_data[cpu].hpa);
+                               continue;
+                       }
+#endif
+
                        __do_IRQ(irq, regs);
                }
        }
-       set_eiem(cpu_eiem);
+
+       set_eiem(cpu_eiem);     /* restore original mask */
        irq_exit();
 }
 
@@ -291,12 +363,14 @@ void do_cpu_irq_mask(struct pt_regs *regs)
 static struct irqaction timer_action = {
        .handler = timer_interrupt,
        .name = "timer",
+       .flags = SA_INTERRUPT,
 };
 
 #ifdef CONFIG_SMP
 static struct irqaction ipi_action = {
        .handler = ipi_interrupt,
        .name = "IPI",
+       .flags = SA_INTERRUPT,
 };
 #endif
 
index 44670d6e06f4dfb9ab8de1afb16f458524a7e463..f6fec62b6a2feb79365695cea0e01f4faf496ad9 100644 (file)
@@ -196,8 +196,7 @@ static int perf_open(struct inode *inode, struct file *file);
 static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
 static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 
        loff_t *ppos);
-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg);
+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
 static void perf_start_counters(void);
 static int perf_stop_counters(uint32_t *raddr);
 static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num);
@@ -438,48 +437,56 @@ static void perf_patch_images(void)
  * must be running on the processor that you wish to change.
  */
 
-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg)
+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long error_start;
-       uint32_t raddr[4];      
+       uint32_t raddr[4];
+       int error = 0;
 
+       lock_kernel();
        switch (cmd) {
 
            case PA_PERF_ON:
                        /* Start the counters */
                        perf_start_counters();
-                       return 0;
+                       break;
 
            case PA_PERF_OFF:
                        error_start = perf_stop_counters(raddr);
                        if (error_start != 0) {
                                printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start);
-                               return -EFAULT; 
+                               error = -EFAULT;
+                               break;
                        }
 
                        /* copy out the Counters */
                        if (copy_to_user((void __user *)arg, raddr, 
                                        sizeof (raddr)) != 0) {
-                               return -EFAULT;
+                               error =  -EFAULT;
+                               break;
                        }
-                       return 0;
+                       break;
 
            case PA_PERF_VERSION:
                        /* Return the version # */
-                       return put_user(PERF_VERSION, (int *)arg);
+                       error = put_user(PERF_VERSION, (int *)arg);
+                       break;
 
            default:
-                       break;
+                       error = -ENOTTY;
        }
-       return -ENOTTY;
+
+       unlock_kernel();
+
+       return error;
 }
 
 static struct file_operations perf_fops = {
        .llseek = no_llseek,
        .read = perf_read,
        .write = perf_write,
-       .ioctl = perf_ioctl,
+       .unlocked_ioctl = perf_ioctl,
+       .compat_ioctl = perf_ioctl,
        .open = perf_open,
        .release = perf_release
 };
index b6fe202a620d5b4b013029a71e4e8cf75edd1ad4..27160e8bf15ba3f31010ab0fa978961043df2140 100644 (file)
@@ -264,6 +264,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                 * sigkill.  perhaps it should be put in the status
                 * that it wants to exit.
                 */
+               ret = 0;
                DBG("sys_ptrace(KILL)\n");
                if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
                        goto out_tsk;
@@ -344,11 +345,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 
        case PTRACE_GETEVENTMSG:
                 ret = put_user(child->ptrace_message, (unsigned int __user *) data);
-               goto out;
+               goto out_tsk;
 
        default:
                ret = ptrace_request(child, request, addr, data);
-               goto out;
+               goto out_tsk;
        }
 
 out_wake_notrap:
index 82c24e62ab631f7bd57bb187f946238e235cae20..3a25a7bd673ece4e11eccfba23a1a63ffb644df1 100644 (file)
@@ -296,7 +296,6 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        struct rt_sigframe __user *frame;
        unsigned long rp, usp;
        unsigned long haddr, sigframe_size;
-       struct siginfo si;
        int err = 0;
 #ifdef __LP64__
        compat_int_t compat_val;
index a9ecf6465784eb0272518d648e39c2814d31dc02..ce89da0f654dac0bb43284264179b36eb0d65511 100644 (file)
@@ -181,12 +181,19 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                while (ops) {
                        unsigned long which = ffz(~ops);
 
+                       ops &= ~(1 << which);
+
                        switch (which) {
+                       case IPI_NOP:
+#if (kDEBUG>=100)
+                               printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu);
+#endif /* kDEBUG */
+                               break;
+                               
                        case IPI_RESCHEDULE:
 #if (kDEBUG>=100)
                                printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu);
 #endif /* kDEBUG */
-                               ops &= ~(1 << IPI_RESCHEDULE);
                                /*
                                 * Reschedule callback.  Everything to be
                                 * done is done by the interrupt return path.
@@ -197,7 +204,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 #if (kDEBUG>=100)
                                printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu);
 #endif /* kDEBUG */
-                               ops &= ~(1 << IPI_CALL_FUNC);
                                {
                                        volatile struct smp_call_struct *data;
                                        void (*func)(void *info);
@@ -231,7 +237,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 #if (kDEBUG>=100)
                                printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu);
 #endif /* kDEBUG */
-                               ops &= ~(1 << IPI_CPU_START);
 #ifdef ENTRY_SYS_CPUS
                                p->state = STATE_RUNNING;
 #endif
@@ -241,7 +246,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 #if (kDEBUG>=100)
                                printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu);
 #endif /* kDEBUG */
-                               ops &= ~(1 << IPI_CPU_STOP);
 #ifdef ENTRY_SYS_CPUS
 #else
                                halt_processor();
@@ -252,13 +256,11 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 #if (kDEBUG>=100)
                                printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu);
 #endif /* kDEBUG */
-                               ops &= ~(1 << IPI_CPU_TEST);
                                break;
 
                        default:
                                printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n",
                                        this_cpu, which);
-                               ops &= ~(1 << which);
                                return IRQ_NONE;
                        } /* Switch */
                } /* while (ops) */
@@ -312,6 +314,12 @@ smp_send_start(void)       { send_IPI_allbutself(IPI_CPU_START); }
 void 
 smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); }
 
+void
+smp_send_all_nop(void)
+{
+       send_IPI_allbutself(IPI_NOP);
+}
+
 
 /**
  * Run a function on all other CPUs.
@@ -338,6 +346,10 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
 
        /* Can deadlock when called with interrupts disabled */
        WARN_ON(irqs_disabled());
+
+       /* can also deadlock if IPIs are disabled */
+       WARN_ON((get_eiem() & (1UL<<(CPU_IRQ_MAX - IPI_IRQ))) == 0);
+
        
        data.func = func;
        data.info = info;
index b29b76b42bb70cd4f4df3892016665afc744874d..d66163492890203d86a51523f8cab035873d2d13 100644 (file)
@@ -164,7 +164,7 @@ linux_gateway_entry:
 #endif
        STREG   %r2,  TASK_PT_GR30(%r1)         /* ... and save it */
        
-       STREG   %r20, TASK_PT_GR20(%r1)
+       STREG   %r20, TASK_PT_GR20(%r1)         /* Syscall number */
        STREG   %r21, TASK_PT_GR21(%r1)
        STREG   %r22, TASK_PT_GR22(%r1)
        STREG   %r23, TASK_PT_GR23(%r1)         /* 4th argument */
@@ -527,6 +527,7 @@ lws_compare_and_swap:
                We *must* giveup this call and fail.
        */
        ldw     4(%sr2,%r20), %r28                      /* Load thread register */
+       /* WARNING: If cr27 cycles to the same value we have problems */
        mfctl   %cr27, %r21                             /* Get current thread register */
        cmpb,<>,n       %r21, %r28, cas_lock            /* Called recursive? */
        b       lws_exit                                /* Return error! */
index ed31062029f7231e7434d436e628d3eed68fc774..bb2efdd566a9d590d64184b10b097e4b7ed17e95 100644 (file)
@@ -261,7 +261,7 @@ config PPC_ISERIES
 
 config EMBEDDED6xx
        bool "Embedded 6xx/7xx/7xxx-based board"
-       depends on PPC32
+       depends on PPC32 && BROKEN
 
 config APUS
        bool "Amiga-APUS"
@@ -305,7 +305,7 @@ config PPC_PMAC64
 
 config PPC_PREP
        bool "  PowerPC Reference Platform (PReP) based machines"
-       depends on PPC_MULTIPLATFORM && PPC32
+       depends on PPC_MULTIPLATFORM && PPC32 && BROKEN
        select PPC_I8259
        select PPC_INDIRECT_PCI
        default y
@@ -581,17 +581,12 @@ config ARCH_FLATMEM_ENABLE
        def_bool y
        depends on PPC64 && !NUMA
 
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on SMP && PPC_PSERIES
-
-config ARCH_DISCONTIGMEM_DEFAULT
+config ARCH_SPARSEMEM_ENABLE
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
 
-config ARCH_SPARSEMEM_ENABLE
+config ARCH_SPARSEMEM_DEFAULT
        def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
+       depends on SMP && PPC_PSERIES
 
 source "mm/Kconfig"
 
@@ -603,19 +598,6 @@ config ARCH_MEMORY_PROBE
        def_bool y
        depends on MEMORY_HOTPLUG
 
-# Some NUMA nodes have memory ranges that span
-# other nodes.  Even though a pfn is valid and
-# between a node's start and end pfns, it may not
-# reside on that node.
-#
-# This is a relatively temporary hack that should
-# be able to go away when sparsemem is fully in
-# place
-
-config NODES_SPAN_OTHER_NODES
-       def_bool y
-       depends on NEED_MULTIPLE_NODES
-
 config PPC_64K_PAGES
        bool "64k page size"
        depends on PPC64
@@ -937,6 +919,7 @@ source "arch/powerpc/oprofile/Kconfig"
 
 config KPROBES
        bool "Kprobes (EXPERIMENTAL)"
+       depends on PPC64
        help
          Kprobes allows you to trap at almost any kernel address and
          execute a callback function.  register_kprobe() establishes
index 5bc11bd36c1f8eba426466ba7e4b136ca51bb2aa..98f67c78d1bd9ad191b6fe9a97849e0f0bf68b70 100644 (file)
 
 HAS_BIARCH     := $(call cc-option-yn, -m32)
 
-ifeq ($(CONFIG_PPC64),y)
-OLDARCH        := ppc64
-SZ     := 64
-
 # Set default 32 bits cross compilers for vdso and boot wrapper
 CROSS32_COMPILE ?=
 
@@ -37,6 +33,12 @@ endif
 
 export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
 
+KBUILD_DEFCONFIG := $(shell uname -m)_defconfig
+
+ifeq ($(CONFIG_PPC64),y)
+OLDARCH        := ppc64
+SZ     := 64
+
 new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi)
 
 ifeq ($(new_nm),y)
@@ -111,9 +113,6 @@ cpu-as-$(CONFIG_E200)               += -Wa,-me200
 AFLAGS += $(cpu-as-y)
 CFLAGS += $(cpu-as-y)
 
-# Default to the common case.
-KBUILD_DEFCONFIG := common_defconfig
-
 head-y                         := arch/powerpc/kernel/head_32.o
 head-$(CONFIG_PPC64)           := arch/powerpc/kernel/head_64.o
 head-$(CONFIG_8xx)             := arch/powerpc/kernel/head_8xx.o
@@ -125,11 +124,11 @@ head-$(CONFIG_PPC64)              += arch/powerpc/kernel/entry_64.o
 head-$(CONFIG_PPC_FPU)         += arch/powerpc/kernel/fpu.o
 
 core-y                         += arch/powerpc/kernel/ \
-                                  arch/$(OLDARCH)/kernel/ \
                                   arch/powerpc/mm/ \
                                   arch/powerpc/lib/ \
                                   arch/powerpc/sysdev/ \
                                   arch/powerpc/platforms/
+core-$(CONFIG_PPC32)           += arch/ppc/kernel/
 core-$(CONFIG_MATH_EMULATION)  += arch/ppc/math-emu/
 core-$(CONFIG_XMON)            += arch/powerpc/xmon/
 core-$(CONFIG_APUS)            += arch/ppc/amiga/
@@ -139,7 +138,7 @@ drivers-$(CONFIG_CPM2)              += arch/ppc/8260_io/
 
 drivers-$(CONFIG_OPROFILE)     += arch/powerpc/oprofile/
 
-defaultimage-$(CONFIG_PPC32)   := uImage zImage
+defaultimage-$(CONFIG_PPC32)   := zImage
 defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
 defaultimage-$(CONFIG_PPC_PSERIES) := zImage
 KBUILD_IMAGE := $(defaultimage-y)
@@ -154,40 +153,29 @@ BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm
 
 .PHONY: $(BOOT_TARGETS)
 
-boot := arch/$(OLDARCH)/boot
+boot := arch/$(ARCH)/boot
 
-# urk
-ifeq ($(CONFIG_PPC64),y)
 $(BOOT_TARGETS): vmlinux
        $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-else
-$(BOOT_TARGETS): vmlinux
-       $(Q)$(MAKE) ARCH=ppc $(build)=$(boot) $@
-endif
-
-uImage: vmlinux
-       $(Q)$(MAKE) ARCH=$(OLDARCH) $(build)=$(boot)/images $(boot)/images/$@
 
 define archhelp
-  @echo '* zImage          - Compressed kernel image (arch/$(ARCH)/boot/images/zImage.*)'
-  @echo '  uImage          - Create a bootable image for U-Boot / PPCBoot'
+  @echo '* zImage          - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
   @echo '  install         - Install kernel using'
   @echo '                    (your) ~/bin/installkernel or'
   @echo '                    (distribution) /sbin/installkernel or'
   @echo '                    install to $$(INSTALL_PATH) and run lilo'
-  @echo '  *_defconfig     - Select default config from arch/$(ARCH)/ppc/configs'
+  @echo '  *_defconfig     - Select default config from arch/$(ARCH)/configs'
 endef
 
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
-       # Temporary hack until we have migrated to asm-powerpc
        $(Q)rm -rf arch/$(ARCH)/include
 
 archprepare: checkbin
 
 # Temporary hack until we have migrated to asm-powerpc
 include/asm: arch/$(ARCH)/include/asm
-arch/$(ARCH)/include/asm:
+arch/$(ARCH)/include/asm: FORCE
        $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
        $(Q)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm
 
similarity index 96%
rename from arch/ppc64/boot/Makefile
rename to arch/powerpc/boot/Makefile
index 301bc1536c4954d9796e43c673fb9ddbcc9151b4..9770f587af73a73fe2db976c67d7d75ab18d54bf 100644 (file)
@@ -22,7 +22,8 @@
 
 
 HOSTCC         := gcc
-BOOTCFLAGS     := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem $(shell $(CROSS32CC) -print-file-name=include) -fPIC
+BOOTCFLAGS     := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \
+                  $(shell $(CROSS32CC) -print-file-name=include) -fPIC
 BOOTAFLAGS     := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
 BOOTLFLAGS     := -T $(srctree)/$(src)/zImage.lds
 OBJCOPYFLAGS    := contents,alloc,load,readonly,data
@@ -98,7 +99,7 @@ quiet_cmd_ramdisk = RAMDISK $@
       cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@
 
 quiet_cmd_stripvm = STRIP   $@
-      cmd_stripvm = $(STRIP) -s $< -o $@
+      cmd_stripvm = $(STRIP) -s -R .comment $< -o $@
 
 vmlinux.strip: vmlinux
        $(call if_changed,stripvm)
similarity index 80%
rename from arch/ppc64/boot/crt0.S
rename to arch/powerpc/boot/crt0.S
index 9cc442263939750c94b8d55c96cea067668fa9c5..d2f2ace56cd34df5e1203a85ce5248e763e3133a 100644 (file)
        .text
        .globl  _zimage_start
 _zimage_start:
-       bl      reloc_offset
+       bl      1f
 
-reloc_offset:
+1:
        mflr    r0
-       lis     r9,reloc_offset@ha
-       addi    r9,r9,reloc_offset@l
+       lis     r9,1b@ha
+       addi    r9,r9,1b@l
        subf.   r0,r9,r0
-       beq     clear_caches
+       beq     3f
 
-reloc_got2:
        lis     r9,__got2_start@ha
        addi    r9,r9,__got2_start@l
        lis     r8,__got2_end@ha
        addi    r8,r8,__got2_end@l
        subf.   r8,r9,r8
-       beq     clear_caches
+       beq     3f
        srwi.   r8,r8,2
        mtctr   r8
        add     r9,r0,r9
-reloc_got2_loop:
+2:
        lwz     r8,0(r9)
        add     r8,r8,r0
        stw     r8,0(r9)
        addi    r9,r9,4
-       bdnz    reloc_got2_loop
+       bdnz    2b
 
-clear_caches:
+3:
        lis     r9,_start@h
        add     r9,r0,r9
        lis     r8,_etext@ha
        addi    r8,r8,_etext@l
        add     r8,r0,r8
-1:     dcbf    r0,r9
+4:     dcbf    r0,r9
        icbi    r0,r9
        addi    r9,r9,0x20
        cmplwi  0,r9,8
-       blt     1b
+       blt     4b
        sync
        isync
 
similarity index 77%
rename from arch/ppc64/boot/main.c
rename to arch/powerpc/boot/main.c
index e0dde24a72cebda62a135314b8c819230b4fd09a..64ec93116fa6cfb2d1eb6eed1578b80b61965487 100644 (file)
@@ -42,6 +42,8 @@ static struct addr_range vmlinux;
 static struct addr_range vmlinuz;
 static struct addr_range initrd;
 
+static unsigned long elfoffset;
+
 static char scratch[46912];    /* scratch space for gunzip, from zlib_inflate_workspacesize() */
 static char elfheader[256];
 
@@ -131,13 +133,70 @@ static unsigned long try_claim(unsigned long size)
        return addr;
 }
 
+static int is_elf64(void *hdr)
+{
+       Elf64_Ehdr *elf64 = hdr;
+       Elf64_Phdr *elf64ph;
+       unsigned int i;
+
+       if (!(elf64->e_ident[EI_MAG0]  == ELFMAG0       &&
+             elf64->e_ident[EI_MAG1]  == ELFMAG1       &&
+             elf64->e_ident[EI_MAG2]  == ELFMAG2       &&
+             elf64->e_ident[EI_MAG3]  == ELFMAG3       &&
+             elf64->e_ident[EI_CLASS] == ELFCLASS64    &&
+             elf64->e_ident[EI_DATA]  == ELFDATA2MSB   &&
+             elf64->e_type            == ET_EXEC       &&
+             elf64->e_machine         == EM_PPC64))
+               return 0;
+
+       elf64ph = (Elf64_Phdr *)((unsigned long)elf64 +
+                                (unsigned long)elf64->e_phoff);
+       for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++)
+               if (elf64ph->p_type == PT_LOAD && elf64ph->p_offset != 0)
+                       break;
+       if (i >= (unsigned int)elf64->e_phnum)
+               return 0;
+
+       elfoffset = (unsigned long)elf64ph->p_offset;
+       vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset;
+       vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset;
+       return 1;
+}
+
+static int is_elf32(void *hdr)
+{
+       Elf32_Ehdr *elf32 = hdr;
+       Elf32_Phdr *elf32ph;
+       unsigned int i;
+
+       if (!(elf32->e_ident[EI_MAG0]  == ELFMAG0       &&
+             elf32->e_ident[EI_MAG1]  == ELFMAG1       &&
+             elf32->e_ident[EI_MAG2]  == ELFMAG2       &&
+             elf32->e_ident[EI_MAG3]  == ELFMAG3       &&
+             elf32->e_ident[EI_CLASS] == ELFCLASS32    &&
+             elf32->e_ident[EI_DATA]  == ELFDATA2MSB   &&
+             elf32->e_type            == ET_EXEC       &&
+             elf32->e_machine         == EM_PPC))
+               return 0;
+
+       elf32 = (Elf32_Ehdr *)elfheader;
+       elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff);
+       for (i = 0; i < elf32->e_phnum; i++, elf32ph++)
+               if (elf32ph->p_type == PT_LOAD && elf32ph->p_offset != 0)
+                       break;
+       if (i >= elf32->e_phnum)
+               return 0;
+
+       elfoffset = elf32ph->p_offset;
+       vmlinux.size = elf32ph->p_filesz + elf32ph->p_offset;
+       vmlinux.memsize = elf32ph->p_memsz + elf32ph->p_offset;
+       return 1;
+}
+
 void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
 {
-       unsigned long i;
        int len;
        kernel_entry_t kernel_entry;
-       Elf64_Ehdr *elf64;
-       Elf64_Phdr *elf64ph;
 
        memset(__bss_start, 0, _end - __bss_start);
 
@@ -153,6 +212,22 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
 
        printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp);
 
+       vmlinuz.addr = (unsigned long)_vmlinux_start;
+       vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
+
+       /* gunzip the ELF header of the kernel */
+       if (*(unsigned short *)vmlinuz.addr == 0x1f8b) {
+               len = vmlinuz.size;
+               gunzip(elfheader, sizeof(elfheader),
+                               (unsigned char *)vmlinuz.addr, &len);
+       } else
+               memcpy(elfheader, (const void *)vmlinuz.addr, sizeof(elfheader));
+
+       if (!is_elf64(elfheader) && !is_elf32(elfheader)) {
+               printf("Error: not a valid PPC32 or PPC64 ELF file!\n\r");
+               exit();
+       }
+
        /*
         * The first available claim_base must be above the end of the
         * the loaded kernel wrapper file (_start to _end includes the
@@ -172,46 +247,11 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
                claim_base = PROG_START;
 #endif
 
-       vmlinuz.addr = (unsigned long)_vmlinux_start;
-       vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
-
-       /* gunzip the ELF header of the kernel */
-       if (*(unsigned short *)vmlinuz.addr == 0x1f8b) {
-               len = vmlinuz.size;
-               gunzip(elfheader, sizeof(elfheader),
-                               (unsigned char *)vmlinuz.addr, &len);
-       } else
-               memcpy(elfheader, (const void *)vmlinuz.addr, sizeof(elfheader));
-
-       elf64 = (Elf64_Ehdr *)elfheader;
-       if ( elf64->e_ident[EI_MAG0]  != ELFMAG0        ||
-            elf64->e_ident[EI_MAG1]  != ELFMAG1        ||
-            elf64->e_ident[EI_MAG2]  != ELFMAG2        ||
-            elf64->e_ident[EI_MAG3]  != ELFMAG3        ||
-            elf64->e_ident[EI_CLASS] != ELFCLASS64     ||
-            elf64->e_ident[EI_DATA]  != ELFDATA2MSB    ||
-            elf64->e_type            != ET_EXEC        ||
-            elf64->e_machine         != EM_PPC64 )
-       {
-               printf("Error: not a valid PPC64 ELF file!\n\r");
-               exit();
-       }
-
-       elf64ph = (Elf64_Phdr *)((unsigned long)elf64 +
-                               (unsigned long)elf64->e_phoff);
-       for(i=0; i < (unsigned int)elf64->e_phnum ;i++,elf64ph++) {
-               if (elf64ph->p_type == PT_LOAD && elf64ph->p_offset != 0)
-                       break;
-       }
-       vmlinux.size = (unsigned long)elf64ph->p_filesz +
-               (unsigned long)elf64ph->p_offset;
        /* We need to claim the memsize plus the file offset since gzip
         * will expand the header (file offset), then the kernel, then
         * possible rubbish we don't care about. But the kernel bss must
         * be claimed (it will be zero'd by the kernel itself)
         */
-       vmlinux.memsize = (unsigned long)elf64ph->p_memsz +
-               (unsigned long)elf64ph->p_offset;
        printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize);
        vmlinux.addr = try_claim(vmlinux.memsize);
        if (vmlinux.addr == 0) {
@@ -254,9 +294,9 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
        /* Skip over the ELF header */
 #ifdef DEBUG
        printf("... skipping 0x%lx bytes of ELF header\n\r",
-                       (unsigned long)elf64ph->p_offset);
+                       elfoffset);
 #endif
-       vmlinux.addr += (unsigned long)elf64ph->p_offset;
+       vmlinux.addr += elfoffset;
 
        flush_cache((void *)vmlinux.addr, vmlinux.size);
 
@@ -272,7 +312,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
                (unsigned long)prom, NULL);
 #endif
 
-       kernel_entry( a1, a2, prom, NULL );
+       kernel_entry(a1, a2, prom, NULL);
 
        printf("Error: Linux kernel returned to zImage bootloader!\n\r");
 
index 67ffecbc05cb5cff6268eeed331bf2f150bfb863..4b433411b9e3e435f6a1a9e00b7db8aaa3a44d04 100644 (file)
@@ -1,18 +1,33 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:29:10 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 14:36:20 2005
 #
+CONFIG_PPC64=y
 CONFIG_64BIT=y
+CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
+
+#
+# Processor support
+#
+# CONFIG_POWER4_ONLY is not set
+CONFIG_POWER3=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=4
 
 #
 # Code maturity level options
@@ -66,31 +81,69 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 # CONFIG_KMOD is not set
 CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
 
 #
 # Platform support
 #
-# CONFIG_PPC_ISERIES is not set
 CONFIG_PPC_MULTIPLATFORM=y
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
 # CONFIG_PPC_PSERIES is not set
-CONFIG_PPC_BPA=y
 # CONFIG_PPC_PMAC is not set
 # CONFIG_PPC_MAPLE is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
+CONFIG_PPC_CELL=y
 CONFIG_PPC_OF=y
-CONFIG_BPA_IIC=y
-CONFIG_ALTIVEC=y
-CONFIG_KEXEC=y
 # CONFIG_U3_DART is not set
-# CONFIG_BOOTX_TEXT is not set
-# CONFIG_POWER4_ONLY is not set
+CONFIG_PPC_RTAS=y
+# CONFIG_RTAS_ERROR_LOGGING is not set
+CONFIG_RTAS_PROC=y
+CONFIG_RTAS_FLASH=y
+CONFIG_MMIO_NVRAM=y
+CONFIG_CELL_IIC=y
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Kernel options
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_PREEMPT_BKL=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_FORCE_MAX_ZONEORDER=13
 # CONFIG_IOMMU_VMERGE is not set
-CONFIG_SMP=y
-CONFIG_NR_CPUS=4
+CONFIG_KEXEC=y
+CONFIG_IRQ_ALL_CPUS=y
+# CONFIG_NUMA is not set
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -98,30 +151,21 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PPC_64K_PAGES is not set
 CONFIG_SCHED_SMT=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_PPC_RTAS=y
-CONFIG_RTAS_PROC=y
-CONFIG_RTAS_FLASH=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
 #
-# Bus Options
+# Bus options
 #
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_INDIRECT_PCI is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCI_LEGACY_PROC=y
@@ -136,6 +180,7 @@ CONFIG_PCI_LEGACY_PROC=y
 # PCI Hotplug Support
 #
 # CONFIG_HOTPLUG_PCI is not set
+CONFIG_KERNEL_START=0xc000000000000000
 
 #
 # Networking
@@ -183,6 +228,10 @@ CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -284,6 +333,10 @@ CONFIG_IP_NF_ARP_MANGLE=m
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 CONFIG_NET_CLS_ROUTE=y
 
@@ -345,14 +398,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=131072
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -442,6 +487,7 @@ CONFIG_IDEDMA_AUTO=y
 #
 # Macintosh device drivers
 #
+# CONFIG_WINDFARM is not set
 
 #
 # Network device support
@@ -495,7 +541,6 @@ CONFIG_SKGE=m
 # CONFIG_SK98LIN is not set
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
-# CONFIG_SPIDER_NET is not set
 # CONFIG_MV643XX_ETH is not set
 
 #
@@ -625,7 +670,7 @@ CONFIG_WATCHDOG=y
 # Watchdog Device Drivers
 #
 # CONFIG_SOFT_WATCHDOG is not set
-CONFIG_WATCHDOG_RTAS=y
+# CONFIG_WATCHDOG_RTAS is not set
 
 #
 # PCI-based Watchdog Cards
@@ -633,6 +678,8 @@ CONFIG_WATCHDOG_RTAS=y
 # CONFIG_PCIPCWATCHDOG is not set
 # CONFIG_WDTPCI is not set
 # CONFIG_RTC is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -649,6 +696,7 @@ CONFIG_WATCHDOG_RTAS=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -699,6 +747,7 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -756,6 +805,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -943,9 +996,24 @@ CONFIG_NLS_ISO8859_15=m
 # CONFIG_NLS_UTF8 is not set
 
 #
-# Profiling support
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+
+#
+# Instrumentation Support
 #
 # CONFIG_PROFILING is not set
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -962,13 +1030,14 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_KPROBES is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
 CONFIG_DEBUGGER=y
 # CONFIG_XMON is not set
-# CONFIG_PPCDBG is not set
 CONFIG_IRQSTACKS=y
+# CONFIG_BOOTX_TEXT is not set
 
 #
 # Security options
@@ -1008,17 +1077,3 @@ CONFIG_CRYPTO_DEFLATE=m
 #
 # Hardware crypto devices
 #
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
index e76854f8c121c0ae49acbdea06a1d11284271643..e7c23e3902b8b0ea0545bb55e09f5bf37c57f9be 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 13:37:59 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 14:39:20 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -82,6 +82,23 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Platform support
 #
@@ -137,6 +154,7 @@ CONFIG_IRQ_ALL_CPUS=y
 # CONFIG_NUMA is not set
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -144,7 +162,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
@@ -215,6 +233,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -382,19 +404,6 @@ CONFIG_BLK_DEV_INITRD=y
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -656,7 +665,6 @@ CONFIG_SUNGEM=y
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
 # CONFIG_NET_PCI is not set
-# CONFIG_FEC_8XX is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -710,6 +718,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -804,6 +813,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -917,7 +928,6 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
@@ -932,6 +942,7 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_S1D13XXX is not set
 CONFIG_FB_NVIDIA=y
 CONFIG_FB_NVIDIA_I2C=y
 # CONFIG_FB_RIVA is not set
@@ -950,7 +961,6 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -959,6 +969,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -1474,10 +1485,11 @@ CONFIG_TEXTSEARCH_BM=m
 CONFIG_TEXTSEARCH_FSM=m
 
 #
-# Profiling support
+# Instrumentation Support
 #
 CONFIG_PROFILING=y
 CONFIG_OPROFILE=y
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1497,7 +1509,6 @@ CONFIG_DEBUG_FS=y
 # CONFIG_DEBUG_VM is not set
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_KPROBES is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
 # CONFIG_DEBUGGER is not set
 CONFIG_IRQSTACKS=y
index 62e92c7e9e27aa7fbc9e8f4ea59ce4a5fac64cf7..5d0866707a75190a26014de2b242b078bc1310b9 100644 (file)
@@ -1,18 +1,33 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:30:56 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 14:38:09 2005
 #
+CONFIG_PPC64=y
 CONFIG_64BIT=y
+CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
+
+#
+# Processor support
+#
+# CONFIG_POWER4_ONLY is not set
+CONFIG_POWER3=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+# CONFIG_ALTIVEC is not set
+CONFIG_PPC_STD_MMU=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=32
 
 #
 # Code maturity level options
@@ -68,22 +83,60 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
 
 #
 # Platform support
 #
-CONFIG_PPC_ISERIES=y
 # CONFIG_PPC_MULTIPLATFORM is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
+CONFIG_PPC_ISERIES=y
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
 CONFIG_IBMVIO=y
-# CONFIG_POWER4_ONLY is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Kernel options
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_BKL is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=32
+CONFIG_IRQ_ALL_CPUS=y
+CONFIG_LPARCFG=y
+# CONFIG_NUMA is not set
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -91,26 +144,20 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_LPARCFG=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_PM is not set
 CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
 CONFIG_ISA_DMA_API=y
 
 #
-# Bus Options
+# Bus options
 #
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_INDIRECT_PCI is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCI_LEGACY_PROC=y
@@ -125,6 +172,7 @@ CONFIG_PCI_LEGACY_PROC=y
 # PCI Hotplug Support
 #
 # CONFIG_HOTPLUG_PCI is not set
+CONFIG_KERNEL_START=0xc000000000000000
 
 #
 # Networking
@@ -166,6 +214,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -265,6 +317,10 @@ CONFIG_LLC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 CONFIG_NET_CLS_ROUTE=y
 
@@ -326,14 +382,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=65536
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -377,6 +425,7 @@ CONFIG_SCSI_FC_ATTRS=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -454,6 +503,7 @@ CONFIG_DM_ZERO=m
 #
 # Macintosh device drivers
 #
+# CONFIG_WINDFARM is not set
 
 #
 # Network device support
@@ -561,6 +611,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -643,6 +694,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -660,6 +713,7 @@ CONFIG_MAX_RAW_DEVS=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -712,6 +766,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -917,10 +975,25 @@ CONFIG_VIOTAPE=m
 CONFIG_VIOPATH=y
 
 #
-# Profiling support
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+
+#
+# Instrumentation Support
 #
 CONFIG_PROFILING=y
 CONFIG_OPROFILE=y
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -937,11 +1010,11 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
 CONFIG_DEBUG_STACK_USAGE=y
 # CONFIG_DEBUGGER is not set
-# CONFIG_PPCDBG is not set
 CONFIG_IRQSTACKS=y
 
 #
@@ -982,17 +1055,3 @@ CONFIG_CRYPTO_TEST=m
 #
 # Hardware crypto devices
 #
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
index 7b480f3d140630689540701d35492786d94ac13f..92e42613ef0683cff8368b51faca83a5128aa562 100644 (file)
@@ -1,18 +1,32 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:31:24 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 14:38:58 2005
 #
+CONFIG_PPC64=y
 CONFIG_64BIT=y
+CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
+
+#
+# Processor support
+#
+CONFIG_POWER4_ONLY=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+# CONFIG_ALTIVEC is not set
+CONFIG_PPC_STD_MMU=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=2
 
 #
 # Code maturity level options
@@ -67,32 +81,67 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
 
 #
 # Platform support
 #
-# CONFIG_PPC_ISERIES is not set
 CONFIG_PPC_MULTIPLATFORM=y
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
 # CONFIG_PPC_PSERIES is not set
-# CONFIG_PPC_BPA is not set
 # CONFIG_PPC_PMAC is not set
 CONFIG_PPC_MAPLE=y
-CONFIG_PPC=y
-CONFIG_PPC64=y
+# CONFIG_PPC_CELL is not set
 CONFIG_PPC_OF=y
-CONFIG_MPIC=y
-# CONFIG_ALTIVEC is not set
-CONFIG_KEXEC=y
 CONFIG_U3_DART=y
+CONFIG_MPIC=y
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
 CONFIG_MPIC_BROKEN_U3=y
-CONFIG_BOOTX_TEXT=y
-CONFIG_POWER4_ONLY=y
+# CONFIG_PPC_MPC106 is not set
+CONFIG_GENERIC_TBSYNC=y
+# CONFIG_CPU_FREQ is not set
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Kernel options
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_BKL is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=2
+CONFIG_KEXEC=y
+CONFIG_IRQ_ALL_CPUS=y
+# CONFIG_NUMA is not set
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -100,27 +149,21 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
 #
-# Bus Options
+# Bus options
 #
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_INDIRECT_PCI is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCI_LEGACY_PROC=y
@@ -135,6 +178,7 @@ CONFIG_PCI_LEGACY_PROC=y
 # PCI Hotplug Support
 #
 # CONFIG_HOTPLUG_PCI is not set
+CONFIG_KERNEL_START=0xc000000000000000
 
 #
 # Networking
@@ -193,6 +237,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 # CONFIG_NET_CLS_ROUTE is not set
 
@@ -254,14 +302,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 # CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -351,6 +391,7 @@ CONFIG_IDEDMA_AUTO=y
 #
 # Macintosh device drivers
 #
+# CONFIG_WINDFARM is not set
 
 #
 # Network device support
@@ -533,6 +574,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -549,6 +592,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -599,6 +643,7 @@ CONFIG_I2C_AMD8111=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -681,12 +726,15 @@ CONFIG_USB_UHCI_HCD=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
@@ -776,6 +824,7 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 # CONFIG_USB_SERIAL_KLSI is not set
 # CONFIG_USB_SERIAL_KOBIL_SCT is not set
 # CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 # CONFIG_USB_SERIAL_PL2303 is not set
 # CONFIG_USB_SERIAL_HP4X is not set
 # CONFIG_USB_SERIAL_SAFE is not set
@@ -985,9 +1034,19 @@ CONFIG_NLS_DEFAULT="utf-8"
 CONFIG_NLS_UTF8=y
 
 #
-# Profiling support
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+
+#
+# Instrumentation Support
 #
 # CONFIG_PROFILING is not set
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1004,14 +1063,15 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
 CONFIG_DEBUG_STACK_USAGE=y
 CONFIG_DEBUGGER=y
 CONFIG_XMON=y
 CONFIG_XMON_DEFAULT=y
-# CONFIG_PPCDBG is not set
 # CONFIG_IRQSTACKS is not set
+CONFIG_BOOTX_TEXT=y
 
 #
 # Security options
@@ -1051,12 +1111,3 @@ CONFIG_CRYPTO_DES=y
 #
 # Hardware crypto devices
 #
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=y
similarity index 86%
rename from arch/ppc64/defconfig
rename to arch/powerpc/configs/ppc64_defconfig
index e79fd60bc122647abb89741bfd3ce6900eb66418..b5ba3bbd96fbd30fc6b4268265ac0a677e5b314e 100644 (file)
@@ -1,18 +1,33 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:28:33 2005
+# Linux kernel version: 2.6.15-rc1
+# Fri Nov 18 16:23:24 2005
 #
+CONFIG_PPC64=y
 CONFIG_64BIT=y
+CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
+
+#
+# Processor support
+#
+# CONFIG_POWER4_ONLY is not set
+CONFIG_POWER3=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=32
 
 #
 # Code maturity level options
@@ -41,7 +56,7 @@ CONFIG_CPUSETS=y
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_ALL=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
 CONFIG_PRINTK=y
 CONFIG_BUG=y
@@ -67,78 +82,115 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
 
 #
 # Platform support
 #
-# CONFIG_PPC_ISERIES is not set
 CONFIG_PPC_MULTIPLATFORM=y
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
 CONFIG_PPC_PSERIES=y
-CONFIG_PPC_BPA=y
 CONFIG_PPC_PMAC=y
+CONFIG_PPC_PMAC64=y
 CONFIG_PPC_MAPLE=y
-CONFIG_PPC=y
-CONFIG_PPC64=y
+# CONFIG_PPC_CELL is not set
 CONFIG_PPC_OF=y
 CONFIG_XICS=y
-CONFIG_MPIC=y
-CONFIG_BPA_IIC=y
-CONFIG_ALTIVEC=y
-CONFIG_PPC_SPLPAR=y
-CONFIG_KEXEC=y
-CONFIG_IBMVIO=y
 CONFIG_U3_DART=y
+CONFIG_MPIC=y
+CONFIG_PPC_RTAS=y
+CONFIG_RTAS_ERROR_LOGGING=y
+CONFIG_RTAS_PROC=y
+CONFIG_RTAS_FLASH=m
+# CONFIG_MMIO_NVRAM is not set
 CONFIG_MPIC_BROKEN_U3=y
-CONFIG_PPC_PMAC64=y
-CONFIG_BOOTX_TEXT=y
-# CONFIG_POWER4_ONLY is not set
+CONFIG_IBMVIO=y
+# CONFIG_PPC_MPC106 is not set
+CONFIG_GENERIC_TBSYNC=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_FREQ_DEBUG is not set
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_PMAC64=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Kernel options
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_BKL is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=32
+CONFIG_HOTPLUG_CPU=y
+CONFIG_KEXEC=y
+CONFIG_IRQ_ALL_CPUS=y
+CONFIG_PPC_SPLPAR=y
+CONFIG_EEH=y
+CONFIG_SCANLOG=m
+CONFIG_LPARCFG=y
+# CONFIG_NUMA is not set
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
 CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
 CONFIG_SELECT_MEMORY_MODEL=y
 # CONFIG_FLATMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM_MANUAL=y
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_NEED_MULTIPLE_NODES=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_HAVE_MEMORY_PRESENT=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_NODES_SPAN_OTHER_NODES=y
-# CONFIG_NUMA is not set
+CONFIG_SPARSEMEM_EXTREME=y
+# CONFIG_MEMORY_HOTPLUG is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_EEH=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_PPC_RTAS=y
-CONFIG_RTAS_PROC=y
-CONFIG_RTAS_FLASH=m
-CONFIG_SCANLOG=m
-CONFIG_LPARCFG=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=m
-CONFIG_HOTPLUG_CPU=y
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
 #
-# Bus Options
+# Bus options
 #
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC_I8259=y
+# CONFIG_PPC_INDIRECT_PCI is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 # CONFIG_PCI_LEGACY_PROC is not set
@@ -158,6 +210,7 @@ CONFIG_HOTPLUG_PCI=m
 # CONFIG_HOTPLUG_PCI_SHPC is not set
 CONFIG_HOTPLUG_PCI_RPA=m
 CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
+CONFIG_KERNEL_START=0xc000000000000000
 
 #
 # Networking
@@ -199,6 +252,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=y
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -301,6 +358,10 @@ CONFIG_LLC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 CONFIG_NET_CLS_ROUTE=y
 
@@ -338,13 +399,7 @@ CONFIG_FW_LOADER=y
 #
 # Parallel port support
 #
-CONFIG_PARPORT=m
-CONFIG_PARPORT_PC=m
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_1284 is not set
+# CONFIG_PARPORT is not set
 
 #
 # Plug and Play support
@@ -354,7 +409,6 @@ CONFIG_PARPORT_PC=m
 # Block devices
 #
 CONFIG_BLK_DEV_FD=y
-# CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
@@ -370,14 +424,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=65536
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -407,7 +453,7 @@ CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 CONFIG_BLK_DEV_GENERIC=y
 # CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_SL82C105=y
+# CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDEDMA_PCI=y
 # CONFIG_BLK_DEV_IDEDMA_FORCED is not set
 CONFIG_IDEDMA_PCI_AUTO=y
@@ -479,6 +525,7 @@ CONFIG_SCSI_ISCSI_ATTRS=m
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -495,10 +542,12 @@ CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_ATA_PIIX is not set
 # CONFIG_SCSI_SATA_MV is not set
 # CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
+# CONFIG_SCSI_PDC_ADMA is not set
 # CONFIG_SCSI_SATA_QSTOR is not set
+# CONFIG_SCSI_SATA_PROMISE is not set
 # CONFIG_SCSI_SATA_SX4 is not set
 # CONFIG_SCSI_SATA_SIL is not set
+# CONFIG_SCSI_SATA_SIL24 is not set
 # CONFIG_SCSI_SATA_SIS is not set
 # CONFIG_SCSI_SATA_ULI is not set
 # CONFIG_SCSI_SATA_VIA is not set
@@ -512,8 +561,6 @@ CONFIG_SCSI_SATA_SVW=y
 CONFIG_SCSI_IBMVSCSI=y
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_PPA is not set
-# CONFIG_SCSI_IMM is not set
 CONFIG_SCSI_SYM53C8XX_2=y
 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
@@ -608,6 +655,9 @@ CONFIG_IEEE1394_AMDTP=m
 CONFIG_ADB_PMU=y
 CONFIG_PMAC_SMU=y
 CONFIG_THERM_PM72=y
+CONFIG_WINDFARM=y
+CONFIG_WINDFARM_PM81=y
+CONFIG_WINDFARM_PM91=y
 
 #
 # Network device support
@@ -664,7 +714,6 @@ CONFIG_E100=y
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
 # CONFIG_VIA_RHINE is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -684,7 +733,6 @@ CONFIG_E1000=y
 # CONFIG_VIA_VELOCITY is not set
 CONFIG_TIGON3=y
 # CONFIG_BNX2 is not set
-# CONFIG_SPIDER_NET is not set
 # CONFIG_MV643XX_ETH is not set
 
 #
@@ -714,7 +762,6 @@ CONFIG_IBMOL=y
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_PLIP is not set
 CONFIG_PPP=m
 # CONFIG_PPP_MULTILINK is not set
 # CONFIG_PPP_FILTER is not set
@@ -722,6 +769,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -784,7 +832,6 @@ CONFIG_INPUT_PCSPKR=m
 CONFIG_SERIO=y
 CONFIG_SERIO_I8042=y
 # CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PARKBD is not set
 # CONFIG_SERIO_PCIPS2 is not set
 CONFIG_SERIO_LIBPS2=y
 # CONFIG_SERIO_RAW is not set
@@ -817,10 +864,6 @@ CONFIG_SERIAL_JSM=m
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
-CONFIG_PRINTER=m
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
 CONFIG_HVC_CONSOLE=y
 CONFIG_HVCS=m
 
@@ -834,6 +877,7 @@ CONFIG_HVCS=m
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -851,6 +895,7 @@ CONFIG_MAX_RAW_DEVS=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -879,7 +924,6 @@ CONFIG_I2C_AMD8111=y
 CONFIG_I2C_KEYWEST=y
 CONFIG_I2C_PMAC_SMU=y
 # CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_PARPORT is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
 # CONFIG_I2C_PROSAVAGE is not set
 # CONFIG_I2C_SAVAGE4 is not set
@@ -904,6 +948,7 @@ CONFIG_I2C_PMAC_SMU=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -945,7 +990,6 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
@@ -960,6 +1004,7 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 CONFIG_FB_MATROX=y
@@ -983,7 +1028,6 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -992,6 +1036,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -1012,7 +1057,94 @@ CONFIG_LCD_DEVICE=y
 #
 # Sound
 #
-# CONFIG_SOUND is not set
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_GENERIC_DRIVER=y
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_HDA_INTEL is not set
+
+#
+# ALSA PowerMac devices
+#
+CONFIG_SND_POWERMAC=m
+CONFIG_SND_POWERMAC_AUTO_DRC=y
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_USX2Y is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
 
 #
 # USB support
@@ -1046,12 +1178,16 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1106,7 +1242,7 @@ CONFIG_USB_HIDDEV=y
 #
 # CONFIG_USB_CATC is not set
 # CONFIG_USB_KAWETH is not set
-CONFIG_USB_PEGASUS=y
+# CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
 # CONFIG_USB_MON is not set
@@ -1114,7 +1250,6 @@ CONFIG_USB_PEGASUS=y
 #
 # USB port drivers
 #
-# CONFIG_USB_USS720 is not set
 
 #
 # USB Serial Converter support
@@ -1163,6 +1298,7 @@ CONFIG_INFINIBAND_MTHCA=m
 # CONFIG_INFINIBAND_MTHCA_DEBUG is not set
 CONFIG_INFINIBAND_IPOIB=m
 # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
+# CONFIG_INFINIBAND_SRP is not set
 
 #
 # SN Devices
@@ -1358,10 +1494,25 @@ CONFIG_NLS_KOI8_U=m
 CONFIG_NLS_UTF8=m
 
 #
-# Profiling support
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+
+#
+# Instrumentation Support
 #
 CONFIG_PROFILING=y
 CONFIG_OPROFILE=y
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1378,14 +1529,15 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
 CONFIG_DEBUG_STACK_USAGE=y
 CONFIG_DEBUGGER=y
 CONFIG_XMON=y
 # CONFIG_XMON_DEFAULT is not set
-# CONFIG_PPCDBG is not set
 CONFIG_IRQSTACKS=y
+CONFIG_BOOTX_TEXT=y
 
 #
 # Security options
@@ -1425,17 +1577,3 @@ CONFIG_CRYPTO_TEST=m
 #
 # Hardware crypto devices
 #
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
index 9f09dff9e11a5c5c2f0fc130985103d00cb5e4a1..b589b196eb3f2824a6840d68ef1afa710a24f0f9 100644 (file)
@@ -1,18 +1,33 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:32:17 2005
+# Linux kernel version: 2.6.15-rc1
+# Tue Nov 15 14:36:55 2005
 #
+CONFIG_PPC64=y
 CONFIG_64BIT=y
+CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
+
+#
+# Processor support
+#
+# CONFIG_POWER4_ONLY is not set
+CONFIG_POWER3=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=128
 
 #
 # Code maturity level options
@@ -68,75 +83,102 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
 
 #
 # Platform support
 #
-# CONFIG_PPC_ISERIES is not set
 CONFIG_PPC_MULTIPLATFORM=y
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
 CONFIG_PPC_PSERIES=y
-# CONFIG_PPC_BPA is not set
 # CONFIG_PPC_PMAC is not set
 # CONFIG_PPC_MAPLE is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
+# CONFIG_PPC_CELL is not set
 CONFIG_PPC_OF=y
 CONFIG_XICS=y
+# CONFIG_U3_DART is not set
 CONFIG_MPIC=y
-CONFIG_ALTIVEC=y
-CONFIG_PPC_SPLPAR=y
-CONFIG_KEXEC=y
+CONFIG_PPC_RTAS=y
+CONFIG_RTAS_ERROR_LOGGING=y
+CONFIG_RTAS_PROC=y
+CONFIG_RTAS_FLASH=m
+# CONFIG_MMIO_NVRAM is not set
 CONFIG_IBMVIO=y
-# CONFIG_U3_DART is not set
-# CONFIG_BOOTX_TEXT is not set
-# CONFIG_POWER4_ONLY is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Kernel options
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_BKL is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=128
+CONFIG_HOTPLUG_CPU=y
+CONFIG_KEXEC=y
+CONFIG_IRQ_ALL_CPUS=y
+CONFIG_PPC_SPLPAR=y
+CONFIG_EEH=y
+CONFIG_SCANLOG=m
+CONFIG_LPARCFG=y
+CONFIG_NUMA=y
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
 CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
 CONFIG_SELECT_MEMORY_MODEL=y
 # CONFIG_FLATMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM_MANUAL=y
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
 CONFIG_NEED_MULTIPLE_NODES=y
+CONFIG_HAVE_MEMORY_PRESENT=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_EXTREME=y
+# CONFIG_MEMORY_HOTPLUG is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_NODES_SPAN_OTHER_NODES=y
-CONFIG_NUMA=y
+# CONFIG_PPC_64K_PAGES is not set
 CONFIG_SCHED_SMT=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_EEH=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_PPC_RTAS=y
-CONFIG_RTAS_PROC=y
-CONFIG_RTAS_FLASH=m
-CONFIG_SCANLOG=m
-CONFIG_LPARCFG=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_HOTPLUG_CPU=y
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
 #
-# Bus Options
+# Bus options
 #
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC_I8259=y
+# CONFIG_PPC_INDIRECT_PCI is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCI_LEGACY_PROC=y
@@ -156,6 +198,7 @@ CONFIG_HOTPLUG_PCI=m
 # CONFIG_HOTPLUG_PCI_SHPC is not set
 CONFIG_HOTPLUG_PCI_RPA=m
 CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
+CONFIG_KERNEL_START=0xc000000000000000
 
 #
 # Networking
@@ -197,6 +240,10 @@ CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 CONFIG_NETFILTER_NETLINK=y
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
@@ -299,6 +346,10 @@ CONFIG_LLC=y
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
 CONFIG_NET_CLS_ROUTE=y
 
@@ -368,14 +419,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=65536
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -473,6 +516,7 @@ CONFIG_SCSI_ISCSI_ATTRS=m
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -559,6 +603,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 #
 # Macintosh device drivers
 #
+# CONFIG_WINDFARM is not set
 
 #
 # Network device support
@@ -645,7 +690,6 @@ CONFIG_IXGB=m
 # CONFIG_IXGB_NAPI is not set
 CONFIG_S2IO=m
 # CONFIG_S2IO_NAPI is not set
-# CONFIG_2BUFF_MODE is not set
 
 #
 # Token Ring devices
@@ -674,6 +718,7 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 CONFIG_PPPOE=m
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
@@ -784,6 +829,8 @@ CONFIG_HVCS=m
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_RTC is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -801,6 +848,7 @@ CONFIG_MAX_RAW_DEVS=1024
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -852,6 +900,7 @@ CONFIG_I2C_ALGOBIT=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -893,7 +942,6 @@ CONFIG_FB=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
 CONFIG_FB_MACMODES=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
@@ -905,6 +953,7 @@ CONFIG_FB_OF=y
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 CONFIG_FB_MATROX=y
@@ -927,7 +976,6 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_CYBLA is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -936,6 +984,7 @@ CONFIG_FB_RADEON_I2C=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -990,12 +1039,15 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1106,6 +1158,7 @@ CONFIG_INFINIBAND_MTHCA=m
 # CONFIG_INFINIBAND_MTHCA_DEBUG is not set
 CONFIG_INFINIBAND_IPOIB=m
 # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
+# CONFIG_INFINIBAND_SRP is not set
 
 #
 # SN Devices
@@ -1288,10 +1341,25 @@ CONFIG_NLS_ISO8859_1=y
 # CONFIG_NLS_UTF8 is not set
 
 #
-# Profiling support
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+
+#
+# Instrumentation Support
 #
 CONFIG_PROFILING=y
 CONFIG_OPROFILE=y
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1308,14 +1376,15 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
 CONFIG_DEBUG_STACK_USAGE=y
 CONFIG_DEBUGGER=y
 CONFIG_XMON=y
 CONFIG_XMON_DEFAULT=y
-# CONFIG_PPCDBG is not set
 CONFIG_IRQSTACKS=y
+# CONFIG_BOOTX_TEXT is not set
 
 #
 # Security options
@@ -1355,17 +1424,3 @@ CONFIG_CRYPTO_TEST=m
 #
 # Hardware crypto devices
 #
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
index c04bbd320594e6c032ecf75a814a5325908e05f5..9ed551b6c17223258785920f1d37ce2d62868ae8 100644 (file)
@@ -12,23 +12,30 @@ CFLAGS_btext.o              += -fPIC
 endif
 
 obj-y                          := semaphore.o cputable.o ptrace.o syscalls.o \
-                                  irq.o signal_32.o pmc.o
+                                  irq.o align.o signal_32.o pmc.o vdso.o
+obj-y                          += vdso32/
 obj-$(CONFIG_PPC64)            += setup_64.o binfmt_elf32.o sys_ppc32.o \
                                   signal_64.o ptrace32.o systbl.o \
                                   paca.o ioctl32.o cpu_setup_power4.o \
-                                  firmware.o sysfs.o
+                                  firmware.o sysfs.o udbg.o idle_64.o
+obj-$(CONFIG_PPC64)            += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o vector.o
 obj-$(CONFIG_POWER4)           += idle_power4.o
 obj-$(CONFIG_PPC_OF)           += of_device.o
 procfs-$(CONFIG_PPC64)         := proc_ppc64.o
 obj-$(CONFIG_PROC_FS)          += $(procfs-y)
 rtaspci-$(CONFIG_PPC64)                := rtas_pci.o
-obj-$(CONFIG_PPC_RTAS)         += rtas.o $(rtaspci-y)
+obj-$(CONFIG_PPC_RTAS)         += rtas.o rtas-rtc.o $(rtaspci-y)
 obj-$(CONFIG_RTAS_FLASH)       += rtas_flash.o
 obj-$(CONFIG_RTAS_PROC)                += rtas-proc.o
 obj-$(CONFIG_LPARCFG)          += lparcfg.o
 obj-$(CONFIG_IBMVIO)           += vio.o
 obj-$(CONFIG_GENERIC_TBSYNC)   += smp-tbsync.o
+obj-$(CONFIG_PPC_PSERIES)      += udbg_16550.o
+obj-$(CONFIG_PPC_MAPLE)                += udbg_16550.o
+udbgscc-$(CONFIG_PPC64)                := udbg_scc.o
+obj-$(CONFIG_PPC_PMAC)         += $(udbgscc-y)
+obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
@@ -43,12 +50,23 @@ extra-y                             += vmlinux.lds
 obj-y                          += process.o init_task.o time.o \
                                   prom.o traps.o setup-common.o
 obj-$(CONFIG_PPC32)            += entry_32.o setup_32.o misc_32.o systbl.o
-obj-$(CONFIG_PPC64)            += misc_64.o
+obj-$(CONFIG_PPC64)            += misc_64.o dma_64.o iommu.o
 obj-$(CONFIG_PPC_OF)           += prom_init.o
 obj-$(CONFIG_MODULES)          += ppc_ksyms.o
 obj-$(CONFIG_BOOTX_TEXT)       += btext.o
 obj-$(CONFIG_6xx)              += idle_6xx.o
 obj-$(CONFIG_SMP)              += smp.o
+obj-$(CONFIG_KPROBES)          += kprobes.o
+
+module-$(CONFIG_PPC64)         += module_64.o
+obj-$(CONFIG_MODULES)          += $(module-y)
+
+pci64-$(CONFIG_PPC64)          += pci_64.o pci_dn.o pci_iommu.o \
+                                  pci_direct_iommu.o iomap.o
+obj-$(CONFIG_PCI)              += $(pci64-y)
+
+kexec64-$(CONFIG_PPC64)                += machine_kexec_64.o
+obj-$(CONFIG_KEXEC)            += $(kexec64-y)
 
 ifeq ($(CONFIG_PPC_ISERIES),y)
 $(obj)/head_64.o: $(obj)/lparmap.s
@@ -56,13 +74,12 @@ AFLAGS_head_64.o += -I$(obj)
 endif
 
 else
-# stuff used from here for ARCH=ppc or ARCH=ppc64
+# stuff used from here for ARCH=ppc
 smpobj-$(CONFIG_SMP)           += smp.o
-obj-$(CONFIG_PPC64)            += traps.o process.o init_task.o time.o \
-                                  setup-common.o $(smpobj-y)
-
 
 endif
 
+obj-$(CONFIG_PPC64)            += $(obj64-y)
+
 extra-$(CONFIG_PPC_FPU)                += fpu.o
 extra-$(CONFIG_PPC64)          += entry_64.o
similarity index 51%
rename from arch/ppc64/kernel/align.c
rename to arch/powerpc/kernel/align.c
index 256d5b592aa1e477e33390bb49c210fe18846fa1..faaec9c6f78f1aaf5f7f572e5cbd8035c4c063e9 100644 (file)
@@ -7,6 +7,9 @@
  *   PowerPC 403GCX/405GP modifications.
  * Copyright (c) 2001-2002 PPC64 team, IBM Corp
  *   64-bit and Power4 support
+ * Copyright (c) 2005 Benjamin Herrenschmidt, IBM Corp
+ *                    <benh@kernel.crashing.org>
+ *   Merge ppc32 and ppc64 implementations
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -38,10 +41,15 @@ struct aligninfo {
 #define F      8       /* to/from fp regs */
 #define U      0x10    /* update index register */
 #define M      0x20    /* multiple load/store */
-#define SW     0x40    /* byte swap */
+#define SW     0x40    /* byte swap int or ... */
+#define S      0x40    /* ... single-precision fp */
+#define SX     0x40    /* byte count in XER */
+#define HARD   0x80    /* string, stwcx. */
 
 #define DCBZ   0x5f    /* 8xx/82xx dcbz faults when cache not enabled */
 
+#define SWAP(a, b)     (t = (a), (a) = (b), (b) = t)
+
 /*
  * The PowerPC stores certain bits of the instruction that caused the
  * alignment exception in the DSISR register.  This array maps those
@@ -57,14 +65,14 @@ static struct aligninfo aligninfo[128] = {
        { 2, LD+SE },           /* 00 0 0101: lha */
        { 2, ST },              /* 00 0 0110: sth */
        { 4, LD+M },            /* 00 0 0111: lmw */
-       { 4, LD+F },            /* 00 0 1000: lfs */
+       { 4, LD+F+S },          /* 00 0 1000: lfs */
        { 8, LD+F },            /* 00 0 1001: lfd */
-       { 4, ST+F },            /* 00 0 1010: stfs */
+       { 4, ST+F+S },          /* 00 0 1010: stfs */
        { 8, ST+F },            /* 00 0 1011: stfd */
        INVALID,                /* 00 0 1100 */
-       { 8, LD },              /* 00 0 1101: ld */
+       { 8, LD },              /* 00 0 1101: ld/ldu/lwa */
        INVALID,                /* 00 0 1110 */
-       { 8, ST },              /* 00 0 1111: std */
+       { 8, ST },              /* 00 0 1111: std/stdu */
        { 4, LD+U },            /* 00 1 0000: lwzu */
        INVALID,                /* 00 1 0001 */
        { 4, ST+U },            /* 00 1 0010: stwu */
@@ -73,9 +81,9 @@ static struct aligninfo aligninfo[128] = {
        { 2, LD+SE+U },         /* 00 1 0101: lhau */
        { 2, ST+U },            /* 00 1 0110: sthu */
        { 4, ST+M },            /* 00 1 0111: stmw */
-       { 4, LD+F+U },          /* 00 1 1000: lfsu */
+       { 4, LD+F+S+U },        /* 00 1 1000: lfsu */
        { 8, LD+F+U },          /* 00 1 1001: lfdu */
-       { 4, ST+F+U },          /* 00 1 1010: stfsu */
+       { 4, ST+F+S+U },        /* 00 1 1010: stfsu */
        { 8, ST+F+U },          /* 00 1 1011: stfdu */
        INVALID,                /* 00 1 1100 */
        INVALID,                /* 00 1 1101 */
@@ -89,10 +97,10 @@ static struct aligninfo aligninfo[128] = {
        { 4, LD+SE },           /* 01 0 0101: lwax */
        INVALID,                /* 01 0 0110 */
        INVALID,                /* 01 0 0111 */
-       { 0, LD },              /* 01 0 1000: lswx */
-       { 0, LD },              /* 01 0 1001: lswi */
-       { 0, ST },              /* 01 0 1010: stswx */
-       { 0, ST },              /* 01 0 1011: stswi */
+       { 4, LD+M+HARD+SX },    /* 01 0 1000: lswx */
+       { 4, LD+M+HARD },       /* 01 0 1001: lswi */
+       { 4, ST+M+HARD+SX },    /* 01 0 1010: stswx */
+       { 4, ST+M+HARD },       /* 01 0 1011: stswi */
        INVALID,                /* 01 0 1100 */
        { 8, LD+U },            /* 01 0 1101: ldu */
        INVALID,                /* 01 0 1110 */
@@ -115,7 +123,7 @@ static struct aligninfo aligninfo[128] = {
        INVALID,                /* 01 1 1111 */
        INVALID,                /* 10 0 0000 */
        INVALID,                /* 10 0 0001 */
-       { 0, ST },              /* 10 0 0010: stwcx. */
+       INVALID,                /* 10 0 0010: stwcx. */
        INVALID,                /* 10 0 0011 */
        INVALID,                /* 10 0 0100 */
        INVALID,                /* 10 0 0101 */
@@ -144,7 +152,7 @@ static struct aligninfo aligninfo[128] = {
        INVALID,                /* 10 1 1100 */
        INVALID,                /* 10 1 1101 */
        INVALID,                /* 10 1 1110 */
-       { L1_CACHE_BYTES, ST }, /* 10 1 1111: dcbz */
+       { 0, ST+HARD },         /* 10 1 1111: dcbz */
        { 4, LD },              /* 11 0 0000: lwzx */
        INVALID,                /* 11 0 0001 */
        { 4, ST },              /* 11 0 0010: stwx */
@@ -153,9 +161,9 @@ static struct aligninfo aligninfo[128] = {
        { 2, LD+SE },           /* 11 0 0101: lhax */
        { 2, ST },              /* 11 0 0110: sthx */
        INVALID,                /* 11 0 0111 */
-       { 4, LD+F },            /* 11 0 1000: lfsx */
+       { 4, LD+F+S },          /* 11 0 1000: lfsx */
        { 8, LD+F },            /* 11 0 1001: lfdx */
-       { 4, ST+F },            /* 11 0 1010: stfsx */
+       { 4, ST+F+S },          /* 11 0 1010: stfsx */
        { 8, ST+F },            /* 11 0 1011: stfdx */
        INVALID,                /* 11 0 1100 */
        { 8, LD+M },            /* 11 0 1101: lmd */
@@ -169,9 +177,9 @@ static struct aligninfo aligninfo[128] = {
        { 2, LD+SE+U },         /* 11 1 0101: lhaux */
        { 2, ST+U },            /* 11 1 0110: sthux */
        INVALID,                /* 11 1 0111 */
-       { 4, LD+F+U },          /* 11 1 1000: lfsux */
+       { 4, LD+F+S+U },        /* 11 1 1000: lfsux */
        { 8, LD+F+U },          /* 11 1 1001: lfdux */
-       { 4, ST+F+U },          /* 11 1 1010: stfsux */
+       { 4, ST+F+S+U },        /* 11 1 1010: stfsux */
        { 8, ST+F+U },          /* 11 1 1011: stfdux */
        INVALID,                /* 11 1 1100 */
        INVALID,                /* 11 1 1101 */
@@ -179,45 +187,175 @@ static struct aligninfo aligninfo[128] = {
        INVALID,                /* 11 1 1111 */
 };
 
-#define SWAP(a, b)     (t = (a), (a) = (b), (b) = t)
-
+/*
+ * Create a DSISR value from the instruction
+ */
 static inline unsigned make_dsisr(unsigned instr)
 {
        unsigned dsisr;
-       
-       /* create a DSISR value from the instruction */
-       dsisr = (instr & 0x03ff0000) >> 16;                     /* bits  6:15 --> 22:31 */
-       
-       if ( IS_XFORM(instr) ) {
-               dsisr |= (instr & 0x00000006) << 14;            /* bits 29:30 --> 15:16 */
-               dsisr |= (instr & 0x00000040) << 8;             /* bit     25 -->    17 */
-               dsisr |= (instr & 0x00000780) << 3;             /* bits 21:24 --> 18:21 */
+
+
+       /* bits  6:15 --> 22:31 */
+       dsisr = (instr & 0x03ff0000) >> 16;
+
+       if (IS_XFORM(instr)) {
+               /* bits 29:30 --> 15:16 */
+               dsisr |= (instr & 0x00000006) << 14;
+               /* bit     25 -->    17 */
+               dsisr |= (instr & 0x00000040) << 8;
+               /* bits 21:24 --> 18:21 */
+               dsisr |= (instr & 0x00000780) << 3;
+       } else {
+               /* bit      5 -->    17 */
+               dsisr |= (instr & 0x04000000) >> 12;
+               /* bits  1: 4 --> 18:21 */
+               dsisr |= (instr & 0x78000000) >> 17;
+               /* bits 30:31 --> 12:13 */
+               if (IS_DSFORM(instr))
+                       dsisr |= (instr & 0x00000003) << 18;
        }
-       else {
-               dsisr |= (instr & 0x04000000) >> 12;            /* bit      5 -->    17 */
-               dsisr |= (instr & 0x78000000) >> 17;            /* bits  1: 4 --> 18:21 */
-               if ( IS_DSFORM(instr) ) {
-                       dsisr |= (instr & 0x00000003) << 18;    /* bits 30:31 --> 12:13 */
+
+       return dsisr;
+}
+
+/*
+ * The dcbz (data cache block zero) instruction
+ * gives an alignment fault if used on non-cacheable
+ * memory.  We handle the fault mainly for the
+ * case when we are running with the cache disabled
+ * for debugging.
+ */
+static int emulate_dcbz(struct pt_regs *regs, unsigned char __user *addr)
+{
+       long __user *p;
+       int i, size;
+
+#ifdef __powerpc64__
+       size = ppc64_caches.dline_size;
+#else
+       size = L1_CACHE_BYTES;
+#endif
+       p = (long __user *) (regs->dar & -size);
+       if (user_mode(regs) && !access_ok(VERIFY_WRITE, p, size))
+               return -EFAULT;
+       for (i = 0; i < size / sizeof(long); ++i)
+               if (__put_user(0, p+i))
+                       return -EFAULT;
+       return 1;
+}
+
+/*
+ * Emulate load & store multiple instructions
+ * On 64-bit machines, these instructions only affect/use the
+ * bottom 4 bytes of each register, and the loads clear the
+ * top 4 bytes of the affected register.
+ */
+#ifdef CONFIG_PPC64
+#define REG_BYTE(rp, i)                *((u8 *)((rp) + ((i) >> 2)) + ((i) & 3) + 4)
+#else
+#define REG_BYTE(rp, i)                *((u8 *)(rp) + (i))
+#endif
+
+static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
+                           unsigned int reg, unsigned int nb,
+                           unsigned int flags, unsigned int instr)
+{
+       unsigned long *rptr;
+       unsigned int nb0, i;
+
+       /*
+        * We do not try to emulate 8 bytes multiple as they aren't really
+        * available in our operating environments and we don't try to
+        * emulate multiples operations in kernel land as they should never
+        * be used/generated there at least not on unaligned boundaries
+        */
+       if (unlikely((nb > 4) || !user_mode(regs)))
+               return 0;
+
+       /* lmw, stmw, lswi/x, stswi/x */
+       nb0 = 0;
+       if (flags & HARD) {
+               if (flags & SX) {
+                       nb = regs->xer & 127;
+                       if (nb == 0)
+                               return 1;
+               } else {
+                       if (__get_user(instr,
+                                      (unsigned int __user *)regs->nip))
+                               return -EFAULT;
+                       nb = (instr >> 11) & 0x1f;
+                       if (nb == 0)
+                               nb = 32;
                }
+               if (nb + reg * 4 > 128) {
+                       nb0 = nb + reg * 4 - 128;
+                       nb = 128 - reg * 4;
+               }
+       } else {
+               /* lwm, stmw */
+               nb = (32 - reg) * 4;
        }
-       
-       return dsisr;
+
+       if (!access_ok((flags & ST ? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
+               return -EFAULT; /* bad address */
+
+       rptr = &regs->gpr[reg];
+       if (flags & LD) {
+               /*
+                * This zeroes the top 4 bytes of the affected registers
+                * in 64-bit mode, and also zeroes out any remaining
+                * bytes of the last register for lsw*.
+                */
+               memset(rptr, 0, ((nb + 3) / 4) * sizeof(unsigned long));
+               if (nb0 > 0)
+                       memset(&regs->gpr[0], 0,
+                              ((nb0 + 3) / 4) * sizeof(unsigned long));
+
+               for (i = 0; i < nb; ++i)
+                       if (__get_user(REG_BYTE(rptr, i), addr + i))
+                               return -EFAULT;
+               if (nb0 > 0) {
+                       rptr = &regs->gpr[0];
+                       addr += nb;
+                       for (i = 0; i < nb0; ++i)
+                               if (__get_user(REG_BYTE(rptr, i), addr + i))
+                                       return -EFAULT;
+               }
+
+       } else {
+               for (i = 0; i < nb; ++i)
+                       if (__put_user(REG_BYTE(rptr, i), addr + i))
+                               return -EFAULT;
+               if (nb0 > 0) {
+                       rptr = &regs->gpr[0];
+                       addr += nb;
+                       for (i = 0; i < nb0; ++i)
+                               if (__put_user(REG_BYTE(rptr, i), addr + i))
+                                       return -EFAULT;
+               }
+       }
+       return 1;
 }
 
-int
-fix_alignment(struct pt_regs *regs)
+
+/*
+ * Called on alignment exception. Attempts to fixup
+ *
+ * Return 1 on success
+ * Return 0 if unable to handle the interrupt
+ * Return -EFAULT if data address is bad
+ */
+
+int fix_alignment(struct pt_regs *regs)
 {
        unsigned int instr, nb, flags;
-       int t;
-       unsigned long reg, areg;
-       unsigned long i;
-       int ret;
-       unsigned dsisr;
+       unsigned int reg, areg;
+       unsigned int dsisr;
        unsigned char __user *addr;
        unsigned char __user *p;
-       unsigned long __user *lp;
+       int ret, t;
        union {
-               long ll;
+               u64 ll;
                double dd;
                unsigned char v[8];
                struct {
@@ -231,18 +369,22 @@ fix_alignment(struct pt_regs *regs)
        } data;
 
        /*
-        * Return 1 on success
-        * Return 0 if unable to handle the interrupt
-        * Return -EFAULT if data address is bad
+        * We require a complete register set, if not, then our assembly
+        * is broken
         */
+       CHECK_FULL_REGS(regs);
 
        dsisr = regs->dsisr;
 
+       /* Some processors don't provide us with a DSISR we can use here,
+        * let's make one up from the instruction
+        */
        if (cpu_has_feature(CPU_FTR_NODSISRALIGN)) {
-           unsigned int real_instr;
-           if (__get_user(real_instr, (unsigned int __user *)regs->nip))
-               return 0;
-           dsisr = make_dsisr(real_instr);
+               unsigned int real_instr;
+               if (unlikely(__get_user(real_instr,
+                                       (unsigned int __user *)regs->nip)))
+                       return -EFAULT;
+               dsisr = make_dsisr(real_instr);
        }
 
        /* extract the operation and registers from the dsisr */
@@ -258,33 +400,37 @@ fix_alignment(struct pt_regs *regs)
        /* DAR has the operand effective address */
        addr = (unsigned char __user *)regs->dar;
 
-       /* A size of 0 indicates an instruction we don't support */
-       /* we also don't support the multiples (lmw, stmw, lmd, stmd) */
-       if ((nb == 0) || (flags & M))
-               return 0;               /* too hard or invalid instruction */
-
-       /*
-        * Special handling for dcbz
-        * dcbz may give an alignment exception for accesses to caching inhibited
-        * storage
+       /* A size of 0 indicates an instruction we don't support, with
+        * the exception of DCBZ which is handled as a special case here
         */
        if (instr == DCBZ)
-               addr = (unsigned char __user *) ((unsigned long)addr & -L1_CACHE_BYTES);
+               return emulate_dcbz(regs, addr);
+       if (unlikely(nb == 0))
+               return 0;
+
+       /* Load/Store Multiple instructions are handled in their own
+        * function
+        */
+       if (flags & M)
+               return emulate_multiple(regs, addr, reg, nb, flags, instr);
 
        /* Verify the address of the operand */
-       if (user_mode(regs)) {
-               if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb))
-                       return -EFAULT; /* bad address */
-       }
+       if (unlikely(user_mode(regs) &&
+                    !access_ok((flags & ST ? VERIFY_WRITE : VERIFY_READ),
+                               addr, nb)))
+               return -EFAULT;
 
        /* Force the fprs into the save area so we can reference them */
        if (flags & F) {
-               if (!user_mode(regs))
+               /* userland only */
+               if (unlikely(!user_mode(regs)))
                        return 0;
                flush_fp_to_thread(current);
        }
-       
-       /* If we are loading, get the data from user space */
+
+       /* If we are loading, get the data from user space, else
+        * get it from register values
+        */
        if (flags & LD) {
                data.ll = 0;
                ret = 0;
@@ -301,75 +447,62 @@ fix_alignment(struct pt_regs *regs)
                case 2:
                        ret |= __get_user(data.v[6], p++);
                        ret |= __get_user(data.v[7], p++);
-                       if (ret)
+                       if (unlikely(ret))
                                return -EFAULT;
                }
-       }
-       
-       /* If we are storing, get the data from the saved gpr or fpr */
-       if (flags & ST) {
-               if (flags & F) {
-                       if (nb == 4) {
-                               /* Doing stfs, have to convert to single */
-                               preempt_disable();
-                               enable_kernel_fp();
-                               cvt_df(&current->thread.fpr[reg], (float *)&data.v[4], &current->thread);
-                               disable_kernel_fp();
-                               preempt_enable();
-                       }
-                       else
-                               data.dd = current->thread.fpr[reg];
-               }
-               else 
-                       data.ll = regs->gpr[reg];
-       }
-       
-       /* Swap bytes as needed */
-       if (flags & SW) {
-               if (nb == 2)
-                       SWAP(data.v[6], data.v[7]);
-               else {  /* nb must be 4 */
-                       SWAP(data.v[4], data.v[7]);
-                       SWAP(data.v[5], data.v[6]);
-               }
-       }
-       
-       /* Sign extend as needed */
-       if (flags & SE) {
+       } else if (flags & F)
+               data.dd = current->thread.fpr[reg];
+       else
+               data.ll = regs->gpr[reg];
+
+       /* Perform other misc operations like sign extension, byteswap,
+        * or floating point single precision conversion
+        */
+       switch (flags & ~U) {
+       case LD+SE:     /* sign extend */
                if ( nb == 2 )
                        data.ll = data.x16.low16;
                else    /* nb must be 4 */
                        data.ll = data.x32.low32;
-       }
-       
-       /* If we are loading, move the data to the gpr or fpr */
-       if (flags & LD) {
-               if (flags & F) {
-                       if (nb == 4) {
-                               /* Doing lfs, have to convert to double */
-                               preempt_disable();
-                               enable_kernel_fp();
-                               cvt_fd((float *)&data.v[4], &current->thread.fpr[reg], &current->thread);
-                               disable_kernel_fp();
-                               preempt_enable();
-                       }
-                       else
-                               current->thread.fpr[reg] = data.dd;
+               break;
+       case LD+S:      /* byte-swap */
+       case ST+S:
+               if (nb == 2) {
+                       SWAP(data.v[6], data.v[7]);
+               } else {
+                       SWAP(data.v[4], data.v[7]);
+                       SWAP(data.v[5], data.v[6]);
                }
-               else
-                       regs->gpr[reg] = data.ll;
+               break;
+
+       /* Single-precision FP load and store require conversions... */
+       case LD+F+S:
+#ifdef CONFIG_PPC_FPU
+               preempt_disable();
+               enable_kernel_fp();
+               cvt_fd((float *)&data.v[4], &data.dd, &current->thread);
+               preempt_enable();
+#else
+               return 0;
+#endif
+               break;
+       case ST+F+S:
+#ifdef CONFIG_PPC_FPU
+               preempt_disable();
+               enable_kernel_fp();
+               cvt_df(&data.dd, (float *)&data.v[4], &current->thread);
+               preempt_enable();
+#else
+               return 0;
+#endif
+               break;
        }
-       
-       /* If we are storing, copy the data to the user */
+
+       /* Store result to memory or update registers */
        if (flags & ST) {
                ret = 0;
                p = addr;
                switch (nb) {
-               case 128:       /* Special case - must be dcbz */
-                       lp = (unsigned long __user *)p;
-                       for (i = 0; i < L1_CACHE_BYTES / sizeof(long); ++i)
-                               ret |= __put_user(0, lp++);
-                       break;
                case 8:
                        ret |= __put_user(data.v[0], p++);
                        ret |= __put_user(data.v[1], p++);
@@ -382,15 +515,16 @@ fix_alignment(struct pt_regs *regs)
                        ret |= __put_user(data.v[6], p++);
                        ret |= __put_user(data.v[7], p++);
                }
-               if (ret)
+               if (unlikely(ret))
                        return -EFAULT;
-       }
-       
+       } else if (flags & F)
+               current->thread.fpr[reg] = data.dd;
+       else
+               regs->gpr[reg] = data.ll;
+
        /* Update RA as needed */
-       if (flags & U) {
+       if (flags & U)
                regs->gpr[areg] = regs->dar;
-       }
 
        return 1;
 }
-
index 8793102711a8faa7f24ac5ad2c31468e6d46e5de..91538d2445bfa2e29e60237439acd985c4f583a3 100644 (file)
 #include <asm/cputable.h>
 #include <asm/thread_info.h>
 #include <asm/rtas.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #include <asm/lppaca.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/cache.h>
-#include <asm/systemcfg.h>
 #include <asm/compat.h>
 #endif
 
@@ -251,25 +251,44 @@ int main(void)
 
        DEFINE(TASK_SIZE, TASK_SIZE);
        DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
-#else /* CONFIG_PPC64 */
-       /* systemcfg offsets for use by vdso */
-       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct systemcfg, tb_orig_stamp));
-       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct systemcfg, tb_ticks_per_sec));
-       DEFINE(CFG_TB_TO_XS, offsetof(struct systemcfg, tb_to_xs));
-       DEFINE(CFG_STAMP_XSEC, offsetof(struct systemcfg, stamp_xsec));
-       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct systemcfg, tb_update_count));
-       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct systemcfg, tz_minuteswest));
-       DEFINE(CFG_TZ_DSTTIME, offsetof(struct systemcfg, tz_dsttime));
-       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct systemcfg, syscall_map_32));
-       DEFINE(CFG_SYSCALL_MAP64, offsetof(struct systemcfg, syscall_map_64));
+#endif /* ! CONFIG_PPC64 */
 
-       /* timeval/timezone offsets for use by vdso */
+       /* datapage offsets for use by vdso */
+       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
+       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
+       DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
+       DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
+       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
+       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
+       DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
+       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
+       DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
+       DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
+#ifdef CONFIG_PPC64
+       DEFINE(CFG_SYSCALL_MAP64, offsetof(struct vdso_data, syscall_map_64));
        DEFINE(TVAL64_TV_SEC, offsetof(struct timeval, tv_sec));
        DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
        DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
        DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec));
+       DEFINE(TSPC64_TV_SEC, offsetof(struct timespec, tv_sec));
+       DEFINE(TSPC64_TV_NSEC, offsetof(struct timespec, tv_nsec));
+       DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec));
+       DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec));
+#else
+       DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
+       DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
+       DEFINE(TSPC32_TV_SEC, offsetof(struct timespec, tv_sec));
+       DEFINE(TSPC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
+#endif
+       /* timeval/timezone offsets for use by vdso */
        DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
        DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
-#endif /* CONFIG_PPC64 */
+
+       /* Other bits used by the vdso */
+       DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
+       DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
+       DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
+       DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
+
        return 0;
 }
index b102e3a2415e1fe339324745e4c3a6df75530a8d..ccdf94731e300c8d5f3160f5dd74d6eb9a7d3471 100644 (file)
@@ -1100,6 +1100,7 @@ start_here:
        mr      r3,r31
        mr      r4,r30
        bl      machine_init
+       bl      __save_cpu_setup
        bl      MMU_init
 
 #ifdef CONFIG_APUS
index 5063c603fad441e56a92ee9ff3de3a165c11ab4f..8d60fa99fc4b992a402ec73dfa516b139f049d08 100644 (file)
@@ -24,7 +24,7 @@
  *    Copyright 2002-2004 MontaVista Software, Inc.
  *      PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
  *    Copyright 2004 Freescale Semiconductor, Inc
- *      PowerPC e500 modifications, Kumar Gala <kumar.gala@freescale.com>
+ *      PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
  *
  * 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
index 3fa6a93adbd00664ebf554f649437554b01155d7..0fa3d27fef013f5ce5c3311e01d29f7e78b5ad17 100644 (file)
@@ -40,10 +40,6 @@ IOCTL_TABLE_START
 #define DECLARES
 #include "compat_ioctl.c"
 
-/* Little p (/dev/rtc, /dev/envctrl, etc.) */
-COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
-COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
-
 IOCTL_TABLE_END
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);
index 4b7940693f3d121c98c28eeebb7c68710c78929e..5a71ed9612fec6e90ff3f81bad91e2b501e16ecf 100644 (file)
 #include <asm/paca.h>
 #endif
 
+int __irq_offset_value;
+#ifdef CONFIG_PPC32
+EXPORT_SYMBOL(__irq_offset_value);
+#endif
+
 static int ppc_spurious_interrupts;
 
 #if defined(CONFIG_PPC_ISERIES) && defined(CONFIG_SMP)
@@ -98,7 +103,6 @@ extern atomic_t ipi_sent;
 EXPORT_SYMBOL(irq_desc);
 
 int distribute_irqs = 1;
-int __irq_offset_value;
 u64 ppc64_interrupt_controller;
 #endif /* CONFIG_PPC64 */
 
@@ -311,7 +315,6 @@ void __init init_IRQ(void)
 }
 
 #ifdef CONFIG_PPC64
-#ifndef CONFIG_PPC_ISERIES
 /*
  * Virtual IRQ mapping code, used on systems with XICS interrupt controllers.
  */
@@ -420,8 +423,6 @@ unsigned int real_irq_to_virt_slowpath(unsigned int real_irq)
 
 }
 
-#endif /* CONFIG_PPC_ISERIES */
-
 #ifdef CONFIG_IRQSTACKS
 struct thread_info *softirq_ctx[NR_CPUS];
 struct thread_info *hardirq_ctx[NR_CPUS];
index 5e954fae031f9d9a0e62a83cf399408ff43e4da1..9dda16ccde78600f0444f0db8a9579fed4397e41 100644 (file)
 #include <asm/time.h>
 #include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/prom.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 
 #define MODULE_VERS "1.6"
 #define MODULE_NAME "lparcfg"
 
 /* #define LPARCFG_DEBUG */
 
-/* find a better place for this function... */
-void log_plpar_hcall_return(unsigned long rc, char *tag)
-{
-       if (rc == 0)            /* success, return */
-               return;
-/* check for null tag ? */
-       if (rc == H_Hardware)
-               printk(KERN_INFO
-                      "plpar-hcall (%s) failed with hardware fault\n", tag);
-       else if (rc == H_Function)
-               printk(KERN_INFO
-                      "plpar-hcall (%s) failed; function not allowed\n", tag);
-       else if (rc == H_Authority)
-               printk(KERN_INFO
-                      "plpar-hcall (%s) failed; not authorized to this function\n",
-                      tag);
-       else if (rc == H_Parameter)
-               printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n",
-                      tag);
-       else
-               printk(KERN_INFO
-                      "plpar-hcall (%s) failed with unexpected rc(0x%lx)\n",
-                      tag, rc);
-
-}
-
 static struct proc_dir_entry *proc_ppc64_lparcfg;
 #define LPARCFG_BUFF_SIZE 4096
 
@@ -172,6 +146,31 @@ static int lparcfg_data(struct seq_file *m, void *v)
 /*
  * Methods used to fetch LPAR data when running on a pSeries platform.
  */
+/* find a better place for this function... */
+static void log_plpar_hcall_return(unsigned long rc, char *tag)
+{
+       if (rc == 0)            /* success, return */
+               return;
+/* check for null tag ? */
+       if (rc == H_Hardware)
+               printk(KERN_INFO
+                      "plpar-hcall (%s) failed with hardware fault\n", tag);
+       else if (rc == H_Function)
+               printk(KERN_INFO
+                      "plpar-hcall (%s) failed; function not allowed\n", tag);
+       else if (rc == H_Authority)
+               printk(KERN_INFO
+                      "plpar-hcall (%s) failed; not authorized to this function\n",
+                      tag);
+       else if (rc == H_Parameter)
+               printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n",
+                      tag);
+       else
+               printk(KERN_INFO
+                      "plpar-hcall (%s) failed with unexpected rc(0x%lx)\n",
+                      tag, rc);
+
+}
 
 /*
  * H_GET_PPP hcall returns info in 4 parms.
@@ -213,11 +212,10 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
        unsigned long dummy;
        rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy);
 
-       log_plpar_hcall_return(rc, "H_PIC");
+       if (rc != H_Authority)
+               log_plpar_hcall_return(rc, "H_PIC");
 }
 
-static unsigned long get_purr(void);
-
 /* Track sum of all purrs across all processors. This is used to further */
 /* calculate usage values by different applications                       */
 
@@ -319,8 +317,6 @@ static void parse_system_parameter_string(struct seq_file *m)
        kfree(local_buffer);
 }
 
-static int lparcfg_count_active_processors(void);
-
 /* Return the number of processors in the system.
  * This function reads through the device tree and counts
  * the virtual processors, this does not include threads.
@@ -372,7 +368,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
        lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity", NULL);
 
        if (lrdrp == NULL) {
-               partition_potential_processors = _systemcfg->processorCount;
+               partition_potential_processors = vdso_data->processorCount;
        } else {
                partition_potential_processors = *(lrdrp + 4);
        }
@@ -548,7 +544,7 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
                retval = -EIO;
        }
 
-      out:
+out:
        kfree(kbuf);
        return retval;
 }
@@ -561,10 +557,10 @@ static int lparcfg_open(struct inode *inode, struct file *file)
 }
 
 struct file_operations lparcfg_fops = {
-      .owner   = THIS_MODULE,
-      .read    = seq_read,
-      .open    = lparcfg_open,
-      .release = single_release,
+       .owner          = THIS_MODULE,
+       .read           = seq_read,
+       .open           = lparcfg_open,
+       .release        = single_release,
 };
 
 int __init lparcfg_init(void)
similarity index 85%
rename from arch/ppc64/kernel/machine_kexec.c
rename to arch/powerpc/kernel/machine_kexec_64.c
index 07ea03598c004774cfed9fde43bf0c587592eec8..97c51e452be74c16fb8cfca957c8ca5b7bf00f75 100644 (file)
@@ -185,8 +185,8 @@ void kexec_copy_flush(struct kimage *image)
  */
 void kexec_smp_down(void *arg)
 {
-       if (ppc_md.cpu_irq_down)
-               ppc_md.cpu_irq_down(1);
+       if (ppc_md.kexec_cpu_down)
+               ppc_md.kexec_cpu_down(0, 1);
 
        local_irq_disable();
        kexec_smp_wait();
@@ -233,8 +233,8 @@ static void kexec_prepare_cpus(void)
        }
 
        /* after we tell the others to go down */
-       if (ppc_md.cpu_irq_down)
-               ppc_md.cpu_irq_down(0);
+       if (ppc_md.kexec_cpu_down)
+               ppc_md.kexec_cpu_down(0, 0);
 
        put_cpu();
 
@@ -255,8 +255,8 @@ static void kexec_prepare_cpus(void)
         * UP to an SMP kernel.
         */
        smp_release_cpus();
-       if (ppc_md.cpu_irq_down)
-               ppc_md.cpu_irq_down(0);
+       if (ppc_md.kexec_cpu_down)
+               ppc_md.kexec_cpu_down(0, 0);
        local_irq_disable();
 }
 
@@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image)
                        ppc_md.hpte_clear_all);
        /* NOTREACHED */
 }
+
+/* Values we need to export to the second kernel via the device tree. */
+static unsigned long htab_base, htab_size, kernel_end;
+
+static struct property htab_base_prop = {
+       .name = "linux,htab-base",
+       .length = sizeof(unsigned long),
+       .value = (unsigned char *)&htab_base,
+};
+
+static struct property htab_size_prop = {
+       .name = "linux,htab-size",
+       .length = sizeof(unsigned long),
+       .value = (unsigned char *)&htab_size,
+};
+
+static struct property kernel_end_prop = {
+       .name = "linux,kernel-end",
+       .length = sizeof(unsigned long),
+       .value = (unsigned char *)&kernel_end,
+};
+
+static void __init export_htab_values(void)
+{
+       struct device_node *node;
+
+       node = of_find_node_by_path("/chosen");
+       if (!node)
+               return;
+
+       kernel_end = __pa(_end);
+       prom_add_property(node, &kernel_end_prop);
+
+       /* On machines with no htab htab_address is NULL */
+       if (NULL == htab_address)
+               goto out;
+
+       htab_base = __pa(htab_address);
+       prom_add_property(node, &htab_base_prop);
+
+       htab_size = 1UL << ppc64_pft_size;
+       prom_add_property(node, &htab_size_prop);
+
+ out:
+       of_node_put(node);
+}
+
+void __init kexec_setup(void)
+{
+       export_htab_values();
+}
index f6d84a75ed266bbc2042da47f0c887f59796604b..624a983a9676776fc6e7b7a05cd8c50297efee2b 100644 (file)
 
        .text
 
-       .align  5
-_GLOBAL(__delay)
-       cmpwi   0,r3,0
-       mtctr   r3
-       beqlr
-1:     bdnz    1b
-       blr
-
 /*
  * This returns the high 64 bits of the product of two 64-bit numbers.
  */
index 3cf2517c5f91171a46fff1ea4586064f64614c4f..a7b68f911eb130b0dcadf2fce7840ef9a12aa0bd 100644 (file)
 #include <asm/processor.h>
 #include <asm/ptrace.h>
 #include <asm/page.h>
-#include <asm/systemcfg.h>
 #include <asm/lppaca.h>
 #include <asm/iseries/it_lp_queue.h>
 #include <asm/paca.h>
 
-static union {
-       struct systemcfg        data;
-       u8                      page[PAGE_SIZE];
-} systemcfg_store __attribute__((__section__(".data.page.aligned")));
-struct systemcfg *_systemcfg = &systemcfg_store.data;
-
 
 /* This symbol is provided by the linker - let it fill in the paca
  * field correctly */
similarity index 95%
rename from arch/ppc64/kernel/pci.c
rename to arch/powerpc/kernel/pci_64.c
index 3cef1b8f57f01a4d70ff2f376a4cda1289bea7fa..5a5b246850817984436aa8ee4e957fecaf017f3f 100644 (file)
 #include <asm/byteorder.h>
 #include <asm/irq.h>
 #include <asm/machdep.h>
-#include <asm/udbg.h>
 #include <asm/ppc-pci.h>
 
 #ifdef DEBUG
+#include <asm/udbg.h>
 #define DBG(fmt...) udbg_printf(fmt)
 #else
 #define DBG(fmt...)
@@ -187,7 +187,7 @@ static DEFINE_SPINLOCK(hose_spinlock);
 /*
  * pci_controller(phb) initialized common variables.
  */
-void __devinit pci_setup_pci_controller(struct pci_controller *hose)
+static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
 {
        memset(hose, 0, sizeof(struct pci_controller));
 
@@ -197,6 +197,65 @@ void __devinit pci_setup_pci_controller(struct pci_controller *hose)
        spin_unlock(&hose_spinlock);
 }
 
+static void add_linux_pci_domain(struct device_node *dev,
+                                struct pci_controller *phb)
+{
+       struct property *of_prop;
+       unsigned int size;
+
+       of_prop = (struct property *)
+               get_property(dev, "linux,pci-domain", &size);
+       if (of_prop != NULL)
+               return;
+       WARN_ON(of_prop && size < sizeof(int));
+       if (of_prop && size < sizeof(int))
+               of_prop = NULL;
+       size = sizeof(struct property) + sizeof(int);
+       if (of_prop == NULL) {
+               if (mem_init_done)
+                       of_prop = kmalloc(size, GFP_KERNEL);
+               else
+                       of_prop = alloc_bootmem(size);
+       }
+       memset(of_prop, 0, sizeof(struct property));
+       of_prop->name = "linux,pci-domain";
+       of_prop->length = sizeof(int);
+       of_prop->value = (unsigned char *)&of_prop[1];
+       *((int *)of_prop->value) = phb->global_number;
+       prom_add_property(dev, of_prop);
+}
+
+struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
+{
+       struct pci_controller *phb;
+
+       if (mem_init_done)
+               phb = kmalloc(sizeof(struct pci_controller), GFP_KERNEL);
+       else
+               phb = alloc_bootmem(sizeof (struct pci_controller));
+       if (phb == NULL)
+               return NULL;
+       pci_setup_pci_controller(phb);
+       phb->arch_data = dev;
+       phb->is_dynamic = mem_init_done;
+       if (dev)
+               add_linux_pci_domain(dev, phb);
+       return phb;
+}
+
+void pcibios_free_controller(struct pci_controller *phb)
+{
+       if (phb->arch_data) {
+               struct device_node *np = phb->arch_data;
+               int *domain = (int *)get_property(np,
+                                                 "linux,pci-domain", NULL);
+               if (domain)
+                       *domain = -1;
+       }
+       if (phb->is_dynamic)
+               kfree(phb);
+}
+
 static void __init pcibios_claim_one_bus(struct pci_bus *b)
 {
        struct pci_dev *dev;
@@ -907,9 +966,10 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
         *                      (size depending on dev->n_addr_cells)
         *   cells 4+5 or 5+6:  the size of the range
         */
-       rlen = 0;
-       hose->io_base_phys = 0;
        ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
+       if (ranges == NULL)
+               return;
+       hose->io_base_phys = 0;
        while ((rlen -= np * sizeof(unsigned int)) >= 0) {
                res = NULL;
                pci_space = ranges[0];
@@ -1107,6 +1167,8 @@ int remap_bus_range(struct pci_bus *bus)
        
        if (get_bus_io_range(bus, &start_phys, &start_virt, &size))
                return 1;
+       if (start_phys == 0)
+               return 1;
        printk("mapping IO %lx -> %lx, size: %lx\n", start_phys, start_virt, size);
        if (__ioremap_explicit(start_phys, start_virt, size,
                               _PAGE_NO_CACHE | _PAGE_GUARDED))
index 5dcf4ba05ee8aa25922e444f070b264fc861e422..59846b40d5216ebe16489e3074a36755083671e6 100644 (file)
@@ -105,6 +105,13 @@ EXPORT_SYMBOL(__clear_user);
 EXPORT_SYMBOL(__strncpy_from_user);
 EXPORT_SYMBOL(__strnlen_user);
 
+#ifndef  __powerpc64__
+EXPORT_SYMBOL(__ide_mm_insl);
+EXPORT_SYMBOL(__ide_mm_outsw);
+EXPORT_SYMBOL(__ide_mm_insw);
+EXPORT_SYMBOL(__ide_mm_outsl);
+#endif
+
 EXPORT_SYMBOL(_insb);
 EXPORT_SYMBOL(_outsb);
 EXPORT_SYMBOL(_insw);
index a1c19502fe8bb9f96e35261a97d87e95add7c919..7ba42a405f41fd8fc32429f3d720fb94bcd22944 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/slab.h>
 #include <linux/kernel.h>
 
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #include <asm/rtas.h>
 #include <asm/uaccess.h>
 #include <asm/prom.h>
@@ -72,7 +72,7 @@ static int __init proc_ppc64_init(void)
        if (!pde)
                return 1;
        pde->nlink = 1;
-       pde->data = _systemcfg;
+       pde->data = vdso_data;
        pde->size = PAGE_SIZE;
        pde->proc_fops = &page_map_fops;
 
index 6a5b468edb4d2e8021d6fc07807e3a4a6cb8fbb6..3bf968e740950bf041d65dff2b01c0795e94a153 100644 (file)
@@ -1368,6 +1368,7 @@ prom_n_addr_cells(struct device_node* np)
        /* No #address-cells property for the root node, default to 1 */
        return 1;
 }
+EXPORT_SYMBOL(prom_n_addr_cells);
 
 int
 prom_n_size_cells(struct device_node* np)
@@ -1383,6 +1384,7 @@ prom_n_size_cells(struct device_node* np)
        /* No #size-cells property for the root node, default to 1 */
        return 1;
 }
+EXPORT_SYMBOL(prom_n_size_cells);
 
 /**
  * Work out the sense (active-low level / active-high edge)
index ae1a36449ccdd0b9e8039b1d8b73b8f92695988f..7a95b8a283548cfca73e75f76ad74c1a77744ca4 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/rtas.h>
 #include <asm/machdep.h> /* for ppc_md */
 #include <asm/time.h>
-#include <asm/systemcfg.h>
 
 /* Token for Sensors */
 #define KEY_SWITCH             0x0001
diff --git a/arch/powerpc/kernel/rtas-rtc.c b/arch/powerpc/kernel/rtas-rtc.c
new file mode 100644 (file)
index 0000000..635d3b9
--- /dev/null
@@ -0,0 +1,105 @@
+#include <linux/kernel.h>
+#include <linux/time.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/rtc.h>
+#include <linux/delay.h>
+#include <asm/prom.h>
+#include <asm/rtas.h>
+#include <asm/time.h>
+
+
+#define MAX_RTC_WAIT 5000      /* 5 sec */
+#define RTAS_CLOCK_BUSY (-2)
+unsigned long __init rtas_get_boot_time(void)
+{
+       int ret[8];
+       int error, wait_time;
+       u64 max_wait_tb;
+
+       max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
+       do {
+               error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
+               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
+                       wait_time = rtas_extended_busy_delay_time(error);
+                       /* This is boot time so we spin. */
+                       udelay(wait_time*1000);
+                       error = RTAS_CLOCK_BUSY;
+               }
+       } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
+
+       if (error != 0 && printk_ratelimit()) {
+               printk(KERN_WARNING "error: reading the clock failed (%d)\n",
+                       error);
+               return 0;
+       }
+
+       return mktime(ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]);
+}
+
+/* NOTE: get_rtc_time will get an error if executed in interrupt context
+ * and if a delay is needed to read the clock.  In this case we just
+ * silently return without updating rtc_tm.
+ */
+void rtas_get_rtc_time(struct rtc_time *rtc_tm)
+{
+        int ret[8];
+       int error, wait_time;
+       u64 max_wait_tb;
+
+       max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
+       do {
+               error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
+               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
+                       if (in_interrupt() && printk_ratelimit()) {
+                               memset(&rtc_tm, 0, sizeof(struct rtc_time));
+                               printk(KERN_WARNING "error: reading clock"
+                                      " would delay interrupt\n");
+                               return; /* delay not allowed */
+                       }
+                       wait_time = rtas_extended_busy_delay_time(error);
+                       msleep(wait_time);
+                       error = RTAS_CLOCK_BUSY;
+               }
+       } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
+
+        if (error != 0 && printk_ratelimit()) {
+                printk(KERN_WARNING "error: reading the clock failed (%d)\n",
+                      error);
+               return;
+        }
+
+       rtc_tm->tm_sec = ret[5];
+       rtc_tm->tm_min = ret[4];
+       rtc_tm->tm_hour = ret[3];
+       rtc_tm->tm_mday = ret[2];
+       rtc_tm->tm_mon = ret[1] - 1;
+       rtc_tm->tm_year = ret[0] - 1900;
+}
+
+int rtas_set_rtc_time(struct rtc_time *tm)
+{
+       int error, wait_time;
+       u64 max_wait_tb;
+
+       max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
+       do {
+               error = rtas_call(rtas_token("set-time-of-day"), 7, 1, NULL,
+                                 tm->tm_year + 1900, tm->tm_mon + 1,
+                                 tm->tm_mday, tm->tm_hour, tm->tm_min,
+                                 tm->tm_sec, 0);
+               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
+                       if (in_interrupt())
+                               return 1;       /* probably decrementer */
+                       wait_time = rtas_extended_busy_delay_time(error);
+                       msleep(wait_time);
+                       error = RTAS_CLOCK_BUSY;
+               }
+       } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb));
+
+        if (error != 0 && printk_ratelimit())
+                printk(KERN_WARNING "error: setting the clock failed (%d)\n",
+                      error);
+
+        return 0;
+}
index 0e5a8e116653e8a111bfde579a2f30b33b86936b..60dec2401c26dc7225c0a3b7bfefefdca3f42e46 100644 (file)
@@ -304,75 +304,18 @@ static int __devinit setup_phb(struct device_node *dev,
                               struct pci_controller *phb,
                               unsigned int addr_size_words)
 {
-       pci_setup_pci_controller(phb);
-
        if (is_python(dev))
                python_countermeasures(dev, addr_size_words);
 
        if (phb_set_bus_ranges(dev, phb))
                return 1;
 
-       phb->arch_data = dev;
        phb->ops = &rtas_pci_ops;
        phb->buid = get_phb_buid(dev);
 
        return 0;
 }
 
-static void __devinit add_linux_pci_domain(struct device_node *dev,
-                                          struct pci_controller *phb,
-                                          struct property *of_prop)
-{
-       memset(of_prop, 0, sizeof(struct property));
-       of_prop->name = "linux,pci-domain";
-       of_prop->length = sizeof(phb->global_number);
-       of_prop->value = (unsigned char *)&of_prop[1];
-       memcpy(of_prop->value, &phb->global_number, sizeof(phb->global_number));
-       prom_add_property(dev, of_prop);
-}
-
-static struct pci_controller * __init alloc_phb(struct device_node *dev,
-                                               unsigned int addr_size_words)
-{
-       struct pci_controller *phb;
-       struct property *of_prop;
-
-       phb = alloc_bootmem(sizeof(struct pci_controller));
-       if (phb == NULL)
-               return NULL;
-
-       of_prop = alloc_bootmem(sizeof(struct property) +
-                               sizeof(phb->global_number));
-       if (!of_prop)
-               return NULL;
-
-       if (setup_phb(dev, phb, addr_size_words))
-               return NULL;
-
-       add_linux_pci_domain(dev, phb, of_prop);
-
-       return phb;
-}
-
-static struct pci_controller * __devinit alloc_phb_dynamic(struct device_node *dev, unsigned int addr_size_words)
-{
-       struct pci_controller *phb;
-
-       phb = (struct pci_controller *)kmalloc(sizeof(struct pci_controller),
-                                              GFP_KERNEL);
-       if (phb == NULL)
-               return NULL;
-
-       if (setup_phb(dev, phb, addr_size_words))
-               return NULL;
-
-       phb->is_dynamic = 1;
-
-       /* TODO: linux,pci-domain? */
-
-       return phb;
-}
-
 unsigned long __init find_and_init_phbs(void)
 {
        struct device_node *node;
@@ -397,10 +340,10 @@ unsigned long __init find_and_init_phbs(void)
                if (node->type == NULL || strcmp(node->type, "pci") != 0)
                        continue;
 
-               phb = alloc_phb(node, root_size_cells);
+               phb = pcibios_alloc_controller(node);
                if (!phb)
                        continue;
-
+               setup_phb(node, phb, root_size_cells);
                pci_process_bridge_OF_ranges(phb, node, 0);
                pci_setup_phb_io(phb, index == 0);
 #ifdef CONFIG_PPC_PSERIES
@@ -446,10 +389,10 @@ struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
        root_size_cells = prom_n_size_cells(root);
 
        primary = list_empty(&hose_list);
-       phb = alloc_phb_dynamic(dn, root_size_cells);
+       phb = pcibios_alloc_controller(dn);
        if (!phb)
                return NULL;
-
+       setup_phb(dn, phb, root_size_cells);
        pci_process_bridge_OF_ranges(phb, dn, primary);
 
        pci_setup_phb_io_dynamic(phb, primary);
@@ -505,8 +448,7 @@ int pcibios_remove_root_bus(struct pci_controller *phb)
        }
 
        list_del(&phb->list_node);
-       if (phb->is_dynamic)
-               kfree(phb);
+       pcibios_free_controller(phb);
 
        return 0;
 }
index bae4bff138f1ebe3e1fdb02924026713b0399b80..bd3eb4292b53e6ea06096be111989bbe7718a10f 100644 (file)
@@ -33,7 +33,7 @@
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/processor.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #include <asm/pgtable.h>
 #include <asm/smp.h>
 #include <asm/elf.h>
@@ -59,6 +59,7 @@
 #undef DEBUG
 
 #ifdef DEBUG
+#include <asm/udbg.h>
 #define DBG(fmt...) udbg_printf(fmt)
 #else
 #define DBG(fmt...)
@@ -444,10 +445,8 @@ void __init check_for_initrd(void)
        if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
            initrd_end > initrd_start)
                ROOT_DEV = Root_RAM0;
-       else {
-               printk("Bogus initrd %08lx %08lx\n", initrd_start, initrd_end);
+       else
                initrd_start = initrd_end = 0;
-       }
 
        if (initrd_start)
                printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
@@ -566,7 +565,7 @@ void __init smp_setup_cpu_maps(void)
                        cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
        }
 
-       _systemcfg->processorCount = num_present_cpus();
+       vdso_data->processorCount = num_present_cpus();
 #endif /* CONFIG_PPC64 */
 }
 #endif /* CONFIG_SMP */
index c98cfcc9cd9a9183f5dbe9f3b7fe4c527642ace1..e5694335bf10ef63f1b0b7d4988b623c085b252a 100644 (file)
@@ -57,10 +57,6 @@ extern void power4_idle(void);
 boot_infos_t *boot_infos;
 struct ide_machdep_calls ppc_ide_md;
 
-/* XXX should go elsewhere */
-int __irq_offset_value;
-EXPORT_SYMBOL(__irq_offset_value);
-
 int boot_cpuid;
 EXPORT_SYMBOL_GPL(boot_cpuid);
 int boot_cpuid_phys;
index 6791668213e75997ba229544d7b421a5cfe1bc6f..608fee7c7e20621dcf829507e893cbaee4ea05da 100644 (file)
@@ -57,9 +57,9 @@
 #include <asm/lmb.h>
 #include <asm/iseries/it_lp_naca.h>
 #include <asm/firmware.h>
-#include <asm/systemcfg.h>
 #include <asm/xmon.h>
 #include <asm/udbg.h>
+#include <asm/kexec.h>
 
 #include "setup.h"
 
@@ -375,9 +375,8 @@ static void __init initialize_cache_info(void)
                                DBG("Argh, can't find dcache properties ! "
                                    "sizep: %p, lsizep: %p\n", sizep, lsizep);
 
-                       _systemcfg->dcache_size = ppc64_caches.dsize = size;
-                       _systemcfg->dcache_line_size =
-                               ppc64_caches.dline_size = lsize;
+                       ppc64_caches.dsize = size;
+                       ppc64_caches.dline_size = lsize;
                        ppc64_caches.log_dline_size = __ilog2(lsize);
                        ppc64_caches.dlines_per_page = PAGE_SIZE / lsize;
 
@@ -393,22 +392,13 @@ static void __init initialize_cache_info(void)
                                DBG("Argh, can't find icache properties ! "
                                    "sizep: %p, lsizep: %p\n", sizep, lsizep);
 
-                       _systemcfg->icache_size = ppc64_caches.isize = size;
-                       _systemcfg->icache_line_size =
-                               ppc64_caches.iline_size = lsize;
+                       ppc64_caches.isize = size;
+                       ppc64_caches.iline_size = lsize;
                        ppc64_caches.log_iline_size = __ilog2(lsize);
                        ppc64_caches.ilines_per_page = PAGE_SIZE / lsize;
                }
        }
 
-       /* Add an eye catcher and the systemcfg layout version number */
-       strcpy(_systemcfg->eye_catcher, "SYSTEMCFG:PPC64");
-       _systemcfg->version.major = SYSTEMCFG_MAJOR;
-       _systemcfg->version.minor = SYSTEMCFG_MINOR;
-       _systemcfg->processor = mfspr(SPRN_PVR);
-       _systemcfg->platform = _machine;
-       _systemcfg->physicalMemorySize = lmb_phys_mem_size();
-
        DBG(" <- initialize_cache_info()\n");
 }
 
@@ -426,6 +416,10 @@ void __init setup_system(void)
         */
        unflatten_device_tree();
 
+#ifdef CONFIG_KEXEC
+       kexec_setup();  /* requires unflattened device tree. */
+#endif
+
        /*
         * Fill the ppc64_caches & systemcfg structures with informations
         * retreived from the device-tree. Need to be called before
@@ -495,15 +489,14 @@ void __init setup_system(void)
 
        printk("-----------------------------------------------------\n");
        printk("ppc64_pft_size                = 0x%lx\n", ppc64_pft_size);
-       printk("ppc64_interrupt_controller    = 0x%ld\n", ppc64_interrupt_controller);
-       printk("systemcfg                     = 0x%p\n", _systemcfg);
-       printk("systemcfg->platform           = 0x%x\n", _systemcfg->platform);
-       printk("systemcfg->processorCount     = 0x%lx\n", _systemcfg->processorCount);
-       printk("systemcfg->physicalMemorySize = 0x%lx\n", _systemcfg->physicalMemorySize);
+       printk("ppc64_interrupt_controller    = 0x%ld\n",
+              ppc64_interrupt_controller);
+       printk("platform                      = 0x%x\n", _machine);
+       printk("physicalMemorySize            = 0x%lx\n", lmb_phys_mem_size());
        printk("ppc64_caches.dcache_line_size = 0x%x\n",
-                       ppc64_caches.dline_size);
+              ppc64_caches.dline_size);
        printk("ppc64_caches.icache_line_size = 0x%x\n",
-                       ppc64_caches.iline_size);
+              ppc64_caches.iline_size);
        printk("htab_address                  = 0x%p\n", htab_address);
        printk("htab_hash_mask                = 0x%lx\n", htab_hash_mask);
        printk("-----------------------------------------------------\n");
@@ -567,33 +560,6 @@ static void __init emergency_stack_init(void)
                __va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
 }
 
-/*
- * Called from setup_arch to initialize the bitmap of available
- * syscalls in the systemcfg page
- */
-void __init setup_syscall_map(void)
-{
-       unsigned int i, count64 = 0, count32 = 0;
-       extern unsigned long *sys_call_table;
-       extern unsigned long sys_ni_syscall;
-
-
-       for (i = 0; i < __NR_syscalls; i++) {
-               if (sys_call_table[i*2] != sys_ni_syscall) {
-                       count64++;
-                       _systemcfg->syscall_map_64[i >> 5] |=
-                               0x80000000UL >> (i & 0x1f);
-               }
-               if (sys_call_table[i*2+1] != sys_ni_syscall) {
-                       count32++;
-                       _systemcfg->syscall_map_32[i >> 5] |=
-                               0x80000000UL >> (i & 0x1f);
-               }
-       }
-       printk(KERN_INFO "Syscall map setup, %d 32-bit and %d 64-bit syscalls\n",
-              count32, count64);
-}
-
 /*
  * Called into from start_kernel, after lock_kernel has been called.
  * Initializes bootmem, which is unsed to manage page allocation until
@@ -635,9 +601,6 @@ void __init setup_arch(char **cmdline_p)
        do_init_bootmem();
        sparse_init();
 
-       /* initialize the syscall map in systemcfg */
-       setup_syscall_map();
-
 #ifdef CONFIG_DUMMY_CONSOLE
        conswitchp = &dummy_con;
 #endif
index a7c4515f320fc30b968e70118c6f6bb63db45b95..5a2eba60dd390c939f9532f9f3384469d8b40fa5 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/cacheflush.h>
 #include <asm/sigcontext.h>
+#include <asm/vdso.h>
 #ifdef CONFIG_PPC64
 #include "ppc32.h"
 #include <asm/unistd.h>
-#include <asm/vdso.h>
 #else
 #include <asm/ucontext.h>
 #include <asm/pgtable.h>
@@ -403,8 +403,6 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
                    ELF_NFPREG * sizeof(double)))
                return 1;
 
-       current->thread.fpscr.val = 0;  /* turn off all fp exceptions */
-
 #ifdef CONFIG_ALTIVEC
        /* save altivec registers */
        if (current->thread.used_vr) {
@@ -809,18 +807,18 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
 
        /* Save user registers on the stack */
        frame = &rt_sf->uc.uc_mcontext;
-#ifdef CONFIG_PPC64
        if (vdso32_rt_sigtramp && current->thread.vdso_base) {
                if (save_user_regs(regs, frame, 0))
                        goto badframe;
                regs->link = current->thread.vdso_base + vdso32_rt_sigtramp;
-       } else
-#endif
-       {
+       } else {
                if (save_user_regs(regs, frame, __NR_rt_sigreturn))
                        goto badframe;
                regs->link = (unsigned long) frame->tramp;
        }
+
+       current->thread.fpscr.val = 0;  /* turn off all fp exceptions */
+
        if (put_user(regs->gpr[1], (u32 __user *)newsp))
                goto badframe;
        regs->gpr[1] = newsp;
@@ -1090,19 +1088,18 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
            || __put_user(sig, &sc->signal))
                goto badframe;
 
-#ifdef CONFIG_PPC64
        if (vdso32_sigtramp && current->thread.vdso_base) {
                if (save_user_regs(regs, &frame->mctx, 0))
                        goto badframe;
                regs->link = current->thread.vdso_base + vdso32_sigtramp;
-       } else
-#endif
-       {
+       } else {
                if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
                        goto badframe;
                regs->link = (unsigned long) frame->mctx.tramp;
        }
 
+       current->thread.fpscr.val = 0;  /* turn off all fp exceptions */
+
        if (put_user(regs->gpr[1], (u32 __user *)newsp))
                goto badframe;
        regs->gpr[1] = newsp;
index 58194e150711992afe9315d12afcf990964e933f..1decf2785530e13397bd7196f680addc247bfff2 100644 (file)
@@ -131,9 +131,6 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
 
        flush_fp_to_thread(current);
 
-       /* Make sure signal doesn't get spurrious FP exceptions */
-       current->thread.fpscr.val = 0;
-
 #ifdef CONFIG_ALTIVEC
        err |= __put_user(v_regs, &sc->v_regs);
 
@@ -423,6 +420,9 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
        if (err)
                goto badframe;
 
+       /* Make sure signal handler doesn't get spurious FP exceptions */
+       current->thread.fpscr.val = 0;
+
        /* Set up to return from userspace. */
        if (vdso64_rt_sigtramp && current->thread.vdso_base) {
                regs->link = current->thread.vdso_base + vdso64_rt_sigtramp;
index e28a139c29d04322f34f19ecfd0e419890a236c3..30374d2f88e5c47eb34bed23bec01628ea387b42 100644 (file)
 #include <asm/cputable.h>
 #include <asm/system.h>
 #include <asm/mpic.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #endif
 
-int smp_hw_index[NR_CPUS];
-struct thread_info *secondary_ti;
-
 #ifdef DEBUG
+#include <asm/udbg.h>
 #define DBG(fmt...) udbg_printf(fmt)
 #else
 #define DBG(fmt...)
 #endif
 
+int smp_hw_index[NR_CPUS];
+struct thread_info *secondary_ti;
+
 cpumask_t cpu_possible_map = CPU_MASK_NONE;
 cpumask_t cpu_online_map = CPU_MASK_NONE;
 cpumask_t cpu_sibling_map[NR_CPUS] = { [0 ... NR_CPUS-1] = CPU_MASK_NONE };
@@ -371,7 +372,7 @@ int generic_cpu_disable(void)
 
        cpu_clear(cpu, cpu_online_map);
 #ifdef CONFIG_PPC64
-       _systemcfg->processorCount--;
+       vdso_data->processorCount--;
        fixup_irqs(cpu_online_map);
 #endif
        return 0;
index 850af198fb5f6eb2f5636da7e3f1344cc0d592c3..0f0c3a9ae2e5df8017d2018098206f0f344eb7a3 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/firmware.h>
 #include <asm/hvcall.h>
 #include <asm/prom.h>
-#include <asm/systemcfg.h>
 #include <asm/paca.h>
 #include <asm/lppaca.h>
 #include <asm/machdep.h>
index 260b6ecd26a9d61f72f7aa42a29455a11a3d6e61..de8479769bb729cf3068e42d7b1488b462c0ff68 100644 (file)
@@ -62,8 +62,8 @@
 #include <asm/irq.h>
 #include <asm/div64.h>
 #include <asm/smp.h>
+#include <asm/vdso_datapage.h>
 #ifdef CONFIG_PPC64
-#include <asm/systemcfg.h>
 #include <asm/firmware.h>
 #endif
 #ifdef CONFIG_PPC_ISERIES
@@ -130,6 +130,34 @@ unsigned long tb_last_stamp;
  */
 DEFINE_PER_CPU(unsigned long, last_jiffy);
 
+void __delay(unsigned long loops)
+{
+       unsigned long start;
+       int diff;
+
+       if (__USE_RTC()) {
+               start = get_rtcl();
+               do {
+                       /* the RTCL register wraps at 1000000000 */
+                       diff = get_rtcl() - start;
+                       if (diff < 0)
+                               diff += 1000000000;
+               } while (diff < loops);
+       } else {
+               start = get_tbl();
+               while (get_tbl() - start < loops)
+                       HMT_low();
+               HMT_medium();
+       }
+}
+EXPORT_SYMBOL(__delay);
+
+void udelay(unsigned long usecs)
+{
+       __delay(tb_ticks_per_usec * usecs);
+}
+EXPORT_SYMBOL(udelay);
+
 static __inline__ void timer_check_rtc(void)
 {
         /*
@@ -261,7 +289,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
        do_gtod.varp = temp_varp;
        do_gtod.var_idx = temp_idx;
 
-#ifdef CONFIG_PPC64
        /*
         * tb_update_count is used to allow the userspace gettimeofday code
         * to assure itself that it sees a consistent view of the tb_to_xs and
@@ -271,14 +298,15 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
         * tb_to_xs and stamp_xsec values are consistent.  If not, then it
         * loops back and reads them again until this criteria is met.
         */
-       ++(_systemcfg->tb_update_count);
+       ++(vdso_data->tb_update_count);
        smp_wmb();
-       _systemcfg->tb_orig_stamp = new_tb_stamp;
-       _systemcfg->stamp_xsec = new_stamp_xsec;
-       _systemcfg->tb_to_xs = new_tb_to_xs;
+       vdso_data->tb_orig_stamp = new_tb_stamp;
+       vdso_data->stamp_xsec = new_stamp_xsec;
+       vdso_data->tb_to_xs = new_tb_to_xs;
+       vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
+       vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
        smp_wmb();
-       ++(_systemcfg->tb_update_count);
-#endif
+       ++(vdso_data->tb_update_count);
 }
 
 /*
@@ -357,9 +385,8 @@ static void iSeries_tb_recal(void)
                                do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
                                tb_to_xs = divres.result_low;
                                do_gtod.varp->tb_to_xs = tb_to_xs;
-                               _systemcfg->tb_ticks_per_sec =
-                                       tb_ticks_per_sec;
-                               _systemcfg->tb_to_xs = tb_to_xs;
+                               vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
+                               vdso_data->tb_to_xs = tb_to_xs;
                        }
                        else {
                                printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
@@ -561,10 +588,8 @@ int do_settimeofday(struct timespec *tv)
        new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs;
        update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
 
-#ifdef CONFIG_PPC64
-       _systemcfg->tz_minuteswest = sys_tz.tz_minuteswest;
-       _systemcfg->tz_dsttime = sys_tz.tz_dsttime;
-#endif
+       vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
+       vdso_data->tz_dsttime = sys_tz.tz_dsttime;
 
        write_sequnlock_irqrestore(&xtime_lock, flags);
        clock_was_set();
@@ -713,13 +738,12 @@ void __init time_init(void)
        do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
        do_gtod.varp->tb_to_xs = tb_to_xs;
        do_gtod.tb_to_us = tb_to_us;
-#ifdef CONFIG_PPC64
-       _systemcfg->tb_orig_stamp = tb_last_jiffy;
-       _systemcfg->tb_update_count = 0;
-       _systemcfg->tb_ticks_per_sec = tb_ticks_per_sec;
-       _systemcfg->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
-       _systemcfg->tb_to_xs = tb_to_xs;
-#endif
+
+       vdso_data->tb_orig_stamp = tb_last_jiffy;
+       vdso_data->tb_update_count = 0;
+       vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
+       vdso_data->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
+       vdso_data->tb_to_xs = tb_to_xs;
 
        time_freq = 0;
 
index 2020bb7648fbc183f2f599ac6c834a2b4d7ed3f9..1511454c4690bafd1a9020afb4c3059180d068c2 100644 (file)
@@ -49,7 +49,6 @@
 #ifdef CONFIG_PPC64
 #include <asm/firmware.h>
 #include <asm/processor.h>
-#include <asm/systemcfg.h>
 #endif
 
 #ifdef CONFIG_PPC64    /* XXX */
similarity index 68%
rename from arch/ppc64/kernel/vdso.c
rename to arch/powerpc/kernel/vdso.c
index 1bbacac44988168e58ce2d06888f195055d2697e..0d4d8bec0df4b4bc94419954fc2471216b710dbb 100644 (file)
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/mmu_context.h>
+#include <asm/lmb.h>
 #include <asm/machdep.h>
 #include <asm/cputable.h>
 #include <asm/sections.h>
-#include <asm/systemcfg.h>
 #include <asm/vdso.h>
+#include <asm/vdso_datapage.h>
 
 #undef DEBUG
 
 #define DBG(fmt...)
 #endif
 
+/* Max supported size for symbol names */
+#define MAX_SYMNAME    64
 
-/*
- * The vDSOs themselves are here
- */
-extern char vdso64_start, vdso64_end;
 extern char vdso32_start, vdso32_end;
-
-static void *vdso64_kbase = &vdso64_start;
 static void *vdso32_kbase = &vdso32_start;
-
-unsigned int vdso64_pages;
 unsigned int vdso32_pages;
-
-/* Signal trampolines user addresses */
-
-unsigned long vdso64_rt_sigtramp;
 unsigned long vdso32_sigtramp;
 unsigned long vdso32_rt_sigtramp;
 
+#ifdef CONFIG_PPC64
+extern char vdso64_start, vdso64_end;
+static void *vdso64_kbase = &vdso64_start;
+unsigned int vdso64_pages;
+unsigned long vdso64_rt_sigtramp;
+#endif /* CONFIG_PPC64 */
+
+/*
+ * The vdso data page (aka. systemcfg for old ppc64 fans) is here.
+ * Once the early boot kernel code no longer needs to muck around
+ * with it, it will become dynamically allocated
+ */
+static union {
+       struct vdso_data        data;
+       u8                      page[PAGE_SIZE];
+} vdso_data_store __attribute__((__section__(".data.page_aligned")));
+struct vdso_data *vdso_data = &vdso_data_store.data;
+
 /* Format of the patch table */
 struct vdso_patch_def
 {
-       u32             pvr_mask, pvr_value;
+       unsigned long   ftr_mask, ftr_value;
        const char      *gen_name;
        const char      *fix_name;
 };
 
 /* Table of functions to patch based on the CPU type/revision
  *
- * TODO: Improve by adding whole lists for each entry
+ * Currently, we only change sync_dicache to do nothing on processors
+ * with a coherent icache
  */
 static struct vdso_patch_def vdso_patches[] = {
        {
-               0xffff0000, 0x003a0000,         /* POWER5 */
+               CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE,
                "__kernel_sync_dicache", "__kernel_sync_dicache_p5"
        },
        {
-               0xffff0000, 0x003b0000,         /* POWER5 */
-               "__kernel_sync_dicache", "__kernel_sync_dicache_p5"
+               CPU_FTR_USE_TB, 0,
+               "__kernel_gettimeofday", NULL
        },
 };
 
@@ -117,7 +127,8 @@ static void dump_one_vdso_page(struct page *pg, struct page *upg)
               page_count(pg),
               pg->flags);
        if (upg/* && pg != upg*/) {
-               printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg) << PAGE_SHIFT),
+               printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)
+                                                      << PAGE_SHIFT),
                       page_count(upg),
                       upg->flags);
        }
@@ -131,9 +142,11 @@ static void dump_vdso_pages(struct vm_area_struct * vma)
        if (!vma || test_thread_flag(TIF_32BIT)) {
                printk("vDSO32 @ %016lx:\n", (unsigned long)vdso32_kbase);
                for (i=0; i<vdso32_pages; i++) {
-                       struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
+                       struct page *pg = virt_to_page(vdso32_kbase +
+                                                      i*PAGE_SIZE);
                        struct page *upg = (vma && vma->vm_mm) ?
-                               follow_page(vma->vm_mm, vma->vm_start + i*PAGE_SIZE, 0)
+                               follow_page(vma->vm_mm, vma->vm_start +
+                                           i*PAGE_SIZE, 0)
                                : NULL;
                        dump_one_vdso_page(pg, upg);
                }
@@ -141,9 +154,11 @@ static void dump_vdso_pages(struct vm_area_struct * vma)
        if (!vma || !test_thread_flag(TIF_32BIT)) {
                printk("vDSO64 @ %016lx:\n", (unsigned long)vdso64_kbase);
                for (i=0; i<vdso64_pages; i++) {
-                       struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
+                       struct page *pg = virt_to_page(vdso64_kbase +
+                                                      i*PAGE_SIZE);
                        struct page *upg = (vma && vma->vm_mm) ?
-                               follow_page(vma->vm_mm, vma->vm_start + i*PAGE_SIZE, 0)
+                               follow_page(vma->vm_mm, vma->vm_start +
+                                           i*PAGE_SIZE, 0)
                                : NULL;
                        dump_one_vdso_page(pg, upg);
                }
@@ -168,7 +183,12 @@ static struct page * vdso_vma_nopage(struct vm_area_struct * vma,
 {
        unsigned long offset = address - vma->vm_start;
        struct page *pg;
-       void *vbase = test_thread_flag(TIF_32BIT) ? vdso32_kbase : vdso64_kbase;
+#ifdef CONFIG_PPC64
+       void *vbase = test_thread_flag(TIF_32BIT) ?
+               vdso32_kbase : vdso64_kbase;
+#else
+       void *vbase = vdso32_kbase;
+#endif
 
        DBG("vdso_vma_nopage(current: %s, address: %016lx, off: %lx)\n",
            current->comm, address, offset);
@@ -180,7 +200,7 @@ static struct page * vdso_vma_nopage(struct vm_area_struct * vma,
         * Last page is systemcfg.
         */
        if ((vma->vm_end - address) <= PAGE_SIZE)
-               pg = virt_to_page(_systemcfg);
+               pg = virt_to_page(vdso_data);
        else
                pg = virt_to_page(vbase + offset);
 
@@ -199,13 +219,15 @@ static struct vm_operations_struct vdso_vmops = {
  * This is called from binfmt_elf, we create the special vma for the
  * vDSO and insert it into the mm struct tree
  */
-int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack)
+int arch_setup_additional_pages(struct linux_binprm *bprm,
+                               int executable_stack)
 {
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma;
        unsigned long vdso_pages;
        unsigned long vdso_base;
 
+#ifdef CONFIG_PPC64
        if (test_thread_flag(TIF_32BIT)) {
                vdso_pages = vdso32_pages;
                vdso_base = VDSO32_MBASE;
@@ -213,6 +235,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack)
                vdso_pages = vdso64_pages;
                vdso_base = VDSO64_MBASE;
        }
+#else
+       vdso_pages = vdso32_pages;
+       vdso_base = VDSO32_MBASE;
+#endif
 
        current->thread.vdso_base = 0;
 
@@ -228,6 +254,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack)
 
        memset(vma, 0, sizeof(*vma));
 
+       /* Add a page to the vdso size for the data page */
+       vdso_pages ++;
+
        /*
         * pick a base address for the vDSO in process space. We try to put it
         * at vdso_base which is the "natural" base for it, but we might fail
@@ -244,23 +273,20 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack)
 
        vma->vm_mm = mm;
        vma->vm_start = current->thread.vdso_base;
+       vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT);
 
        /*
-        * the VMA size is one page more than the vDSO since systemcfg
-        * is mapped in the last one
+        * our vma flags don't have VM_WRITE so by default, the process isn't
+        * allowed to write those pages.
+        * gdb can break that with ptrace interface, and thus trigger COW on
+        * those pages but it's then your responsibility to never do that on
+        * the "data" page of the vDSO or you'll stop getting kernel updates
+        * and your nice userland gettimeofday will be totally dead.
+        * It's fine to use that for setting breakpoints in the vDSO code
+        * pages though
         */
-       vma->vm_end = vma->vm_start + ((vdso_pages + 1) << PAGE_SHIFT);
-
-       /*
-        * our vma flags don't have VM_WRITE so by default, the process isn't allowed
-        * to write those pages.
-        * gdb can break that with ptrace interface, and thus trigger COW on those
-        * pages but it's then your responsibility to never do that on the "data" page
-        * of the vDSO or you'll stop getting kernel updates and your nice userland
-        * gettimeofday will be totally dead. It's fine to use that for setting
-        * breakpoints in the vDSO code pages though
-        */
-       vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | VM_RESERVED;
+       vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE |
+               VM_MAYEXEC | VM_RESERVED;
        vma->vm_flags |= mm->def_flags;
        vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
        vma->vm_ops = &vdso_vmops;
@@ -300,6 +326,74 @@ static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname,
        return NULL;
 }
 
+static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib,
+                                       const char *symname)
+{
+       unsigned int i;
+       char name[MAX_SYMNAME], *c;
+
+       for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) {
+               if (lib->dynsym[i].st_name == 0)
+                       continue;
+               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
+                       MAX_SYMNAME);
+               c = strchr(name, '@');
+               if (c)
+                       *c = 0;
+               if (strcmp(symname, name) == 0)
+                       return &lib->dynsym[i];
+       }
+       return NULL;
+}
+
+/* Note that we assume the section is .text and the symbol is relative to
+ * the library base
+ */
+static unsigned long __init find_function32(struct lib32_elfinfo *lib,
+                                           const char *symname)
+{
+       Elf32_Sym *sym = find_symbol32(lib, symname);
+
+       if (sym == NULL) {
+               printk(KERN_WARNING "vDSO32: function %s not found !\n",
+                      symname);
+               return 0;
+       }
+       return sym->st_value - VDSO32_LBASE;
+}
+
+static int vdso_do_func_patch32(struct lib32_elfinfo *v32,
+                               struct lib64_elfinfo *v64,
+                               const char *orig, const char *fix)
+{
+       Elf32_Sym *sym32_gen, *sym32_fix;
+
+       sym32_gen = find_symbol32(v32, orig);
+       if (sym32_gen == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig);
+               return -1;
+       }
+       if (fix == NULL) {
+               sym32_gen->st_name = 0;
+               return 0;
+       }
+       sym32_fix = find_symbol32(v32, fix);
+       if (sym32_fix == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix);
+               return -1;
+       }
+       sym32_gen->st_value = sym32_fix->st_value;
+       sym32_gen->st_size = sym32_fix->st_size;
+       sym32_gen->st_info = sym32_fix->st_info;
+       sym32_gen->st_other = sym32_fix->st_other;
+       sym32_gen->st_shndx = sym32_fix->st_shndx;
+
+       return 0;
+}
+
+
+#ifdef CONFIG_PPC64
+
 static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname,
                                  unsigned long *size)
 {
@@ -324,33 +418,17 @@ static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname,
        return NULL;
 }
 
-static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib, const char *symname)
-{
-       unsigned int i;
-       char name[32], *c;
-
-       for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) {
-               if (lib->dynsym[i].st_name == 0)
-                       continue;
-               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 32);
-               c = strchr(name, '@');
-               if (c)
-                       *c = 0;
-               if (strcmp(symname, name) == 0)
-                       return &lib->dynsym[i];
-       }
-       return NULL;
-}
-
-static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib, const char *symname)
+static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib,
+                                       const char *symname)
 {
        unsigned int i;
-       char name[32], *c;
+       char name[MAX_SYMNAME], *c;
 
        for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) {
                if (lib->dynsym[i].st_name == 0)
                        continue;
-               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 32);
+               strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
+                       MAX_SYMNAME);
                c = strchr(name, '@');
                if (c)
                        *c = 0;
@@ -363,35 +441,55 @@ static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib, const char *s
 /* Note that we assume the section is .text and the symbol is relative to
  * the library base
  */
-static unsigned long __init find_function32(struct lib32_elfinfo *lib, const char *symname)
+static unsigned long __init find_function64(struct lib64_elfinfo *lib,
+                                           const char *symname)
 {
-       Elf32_Sym *sym = find_symbol32(lib, symname);
+       Elf64_Sym *sym = find_symbol64(lib, symname);
 
        if (sym == NULL) {
-               printk(KERN_WARNING "vDSO32: function %s not found !\n", symname);
+               printk(KERN_WARNING "vDSO64: function %s not found !\n",
+                      symname);
                return 0;
        }
-       return sym->st_value - VDSO32_LBASE;
+#ifdef VDS64_HAS_DESCRIPTORS
+       return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) -
+               VDSO64_LBASE;
+#else
+       return sym->st_value - VDSO64_LBASE;
+#endif
 }
 
-/* Note that we assume the section is .text and the symbol is relative to
- * the library base
- */
-static unsigned long __init find_function64(struct lib64_elfinfo *lib, const char *symname)
+static int vdso_do_func_patch64(struct lib32_elfinfo *v32,
+                               struct lib64_elfinfo *v64,
+                               const char *orig, const char *fix)
 {
-       Elf64_Sym *sym = find_symbol64(lib, symname);
+       Elf64_Sym *sym64_gen, *sym64_fix;
 
-       if (sym == NULL) {
-               printk(KERN_WARNING "vDSO64: function %s not found !\n", symname);
+       sym64_gen = find_symbol64(v64, orig);
+       if (sym64_gen == NULL) {
+               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig);
+               return -1;
+       }
+       if (fix == NULL) {
+               sym64_gen->st_name = 0;
                return 0;
        }
-#ifdef VDS64_HAS_DESCRIPTORS
-       return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) - VDSO64_LBASE;
-#else
-       return sym->st_value - VDSO64_LBASE;
-#endif
+       sym64_fix = find_symbol64(v64, fix);
+       if (sym64_fix == NULL) {
+               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix);
+               return -1;
+       }
+       sym64_gen->st_value = sym64_fix->st_value;
+       sym64_gen->st_size = sym64_fix->st_size;
+       sym64_gen->st_info = sym64_fix->st_info;
+       sym64_gen->st_other = sym64_fix->st_other;
+       sym64_gen->st_shndx = sym64_fix->st_shndx;
+
+       return 0;
 }
 
+#endif /* CONFIG_PPC64 */
+
 
 static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
                                        struct lib64_elfinfo *v64)
@@ -405,7 +503,7 @@ static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
        v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize);
        v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL);
        if (v32->dynsym == NULL || v32->dynstr == NULL) {
-               printk(KERN_ERR "vDSO32: a required symbol section was not found\n");
+               printk(KERN_ERR "vDSO32: required symbol section not found\n");
                return -1;
        }
        sect = find_section32(v32->hdr, ".text", NULL);
@@ -415,10 +513,11 @@ static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
        }
        v32->text = sect - vdso32_kbase;
 
+#ifdef CONFIG_PPC64
        v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize);
        v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL);
        if (v64->dynsym == NULL || v64->dynstr == NULL) {
-               printk(KERN_ERR "vDSO64: a required symbol section was not found\n");
+               printk(KERN_ERR "vDSO64: required symbol section not found\n");
                return -1;
        }
        sect = find_section64(v64->hdr, ".text", NULL);
@@ -427,6 +526,7 @@ static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
                return -1;
        }
        v64->text = sect - vdso64_kbase;
+#endif /* CONFIG_PPC64 */
 
        return 0;
 }
@@ -438,82 +538,40 @@ static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32,
         * Find signal trampolines
         */
 
-       vdso64_rt_sigtramp      = find_function64(v64, "__kernel_sigtramp_rt64");
-       vdso32_sigtramp         = find_function32(v32, "__kernel_sigtramp32");
-       vdso32_rt_sigtramp      = find_function32(v32, "__kernel_sigtramp_rt32");
+#ifdef CONFIG_PPC64
+       vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64");
+#endif
+       vdso32_sigtramp    = find_function32(v32, "__kernel_sigtramp32");
+       vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32");
 }
 
 static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32,
                                       struct lib64_elfinfo *v64)
 {
        Elf32_Sym *sym32;
+#ifdef CONFIG_PPC64
        Elf64_Sym *sym64;
 
-       sym32 = find_symbol32(v32, "__kernel_datapage_offset");
-       if (sym32 == NULL) {
-               printk(KERN_ERR "vDSO32: Can't find symbol __kernel_datapage_offset !\n");
-               return -1;
-       }
-       *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) =
-               (vdso32_pages << PAGE_SHIFT) - (sym32->st_value - VDSO32_LBASE);
-
                sym64 = find_symbol64(v64, "__kernel_datapage_offset");
        if (sym64 == NULL) {
-               printk(KERN_ERR "vDSO64: Can't find symbol __kernel_datapage_offset !\n");
+               printk(KERN_ERR "vDSO64: Can't find symbol "
+                      "__kernel_datapage_offset !\n");
                return -1;
        }
        *((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) =
-               (vdso64_pages << PAGE_SHIFT) - (sym64->st_value - VDSO64_LBASE);
-
-       return 0;
-}
-
-static int vdso_do_func_patch32(struct lib32_elfinfo *v32,
-                               struct lib64_elfinfo *v64,
-                               const char *orig, const char *fix)
-{
-       Elf32_Sym *sym32_gen, *sym32_fix;
-
-       sym32_gen = find_symbol32(v32, orig);
-       if (sym32_gen == NULL) {
-               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig);
-               return -1;
-       }
-       sym32_fix = find_symbol32(v32, fix);
-       if (sym32_fix == NULL) {
-               printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix);
-               return -1;
-       }
-       sym32_gen->st_value = sym32_fix->st_value;
-       sym32_gen->st_size = sym32_fix->st_size;
-       sym32_gen->st_info = sym32_fix->st_info;
-       sym32_gen->st_other = sym32_fix->st_other;
-       sym32_gen->st_shndx = sym32_fix->st_shndx;
+               (vdso64_pages << PAGE_SHIFT) -
+               (sym64->st_value - VDSO64_LBASE);
+#endif /* CONFIG_PPC64 */
 
-       return 0;
-}
-
-static int vdso_do_func_patch64(struct lib32_elfinfo *v32,
-                               struct lib64_elfinfo *v64,
-                               const char *orig, const char *fix)
-{
-       Elf64_Sym *sym64_gen, *sym64_fix;
-
-       sym64_gen = find_symbol64(v64, orig);
-       if (sym64_gen == NULL) {
-               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig);
-               return -1;
-       }
-       sym64_fix = find_symbol64(v64, fix);
-       if (sym64_fix == NULL) {
-               printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix);
+       sym32 = find_symbol32(v32, "__kernel_datapage_offset");
+       if (sym32 == NULL) {
+               printk(KERN_ERR "vDSO32: Can't find symbol "
+                      "__kernel_datapage_offset !\n");
                return -1;
        }
-       sym64_gen->st_value = sym64_fix->st_value;
-       sym64_gen->st_size = sym64_fix->st_size;
-       sym64_gen->st_info = sym64_fix->st_info;
-       sym64_gen->st_other = sym64_fix->st_other;
-       sym64_gen->st_shndx = sym64_fix->st_shndx;
+       *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) =
+               (vdso32_pages << PAGE_SHIFT) -
+               (sym32->st_value - VDSO32_LBASE);
 
        return 0;
 }
@@ -521,29 +579,30 @@ static int vdso_do_func_patch64(struct lib32_elfinfo *v32,
 static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32,
                                       struct lib64_elfinfo *v64)
 {
-       u32 pvr;
        int i;
 
-       pvr = mfspr(SPRN_PVR);
        for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) {
                struct vdso_patch_def *patch = &vdso_patches[i];
-               int match = (pvr & patch->pvr_mask) == patch->pvr_value;
-
-               DBG("patch %d (mask: %x, pvr: %x) : %s\n",
-                   i, patch->pvr_mask, patch->pvr_value, match ? "match" : "skip");
-
+               int match = (cur_cpu_spec->cpu_features & patch->ftr_mask)
+                       == patch->ftr_value;
                if (!match)
                        continue;
 
-               DBG("replacing %s with %s...\n", patch->gen_name, patch->fix_name);
+               DBG("replacing %s with %s...\n", patch->gen_name,
+                   patch->fix_name ? "NONE" : patch->fix_name);
 
                /*
-                * Patch the 32 bits and 64 bits symbols. Note that we do not patch
-                * the "." symbol on 64 bits. It would be easy to do, but doesn't
-                * seem to be necessary, patching the OPD symbol is enough.
+                * Patch the 32 bits and 64 bits symbols. Note that we do not
+                * patch the "." symbol on 64 bits.
+                * It would be easy to do, but doesn't seem to be necessary,
+                * patching the OPD symbol is enough.
                 */
-               vdso_do_func_patch32(v32, v64, patch->gen_name, patch->fix_name);
-               vdso_do_func_patch64(v32, v64, patch->gen_name, patch->fix_name);
+               vdso_do_func_patch32(v32, v64, patch->gen_name,
+                                    patch->fix_name);
+#ifdef CONFIG_PPC64
+               vdso_do_func_patch64(v32, v64, patch->gen_name,
+                                    patch->fix_name);
+#endif /* CONFIG_PPC64 */
        }
 
        return 0;
@@ -556,8 +615,9 @@ static __init int vdso_setup(void)
        struct lib64_elfinfo    v64;
 
        v32.hdr = vdso32_kbase;
+#ifdef CONFIG_PPC64
        v64.hdr = vdso64_kbase;
-
+#endif
        if (vdso_do_find_sections(&v32, &v64))
                return -1;
 
@@ -572,40 +632,101 @@ static __init int vdso_setup(void)
        return 0;
 }
 
+/*
+ * Called from setup_arch to initialize the bitmap of available
+ * syscalls in the systemcfg page
+ */
+static void __init vdso_setup_syscall_map(void)
+{
+       unsigned int i;
+       extern unsigned long *sys_call_table;
+       extern unsigned long sys_ni_syscall;
+
+
+       for (i = 0; i < __NR_syscalls; i++) {
+#ifdef CONFIG_PPC64
+               if (sys_call_table[i*2] != sys_ni_syscall)
+                       vdso_data->syscall_map_64[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+               if (sys_call_table[i*2+1] != sys_ni_syscall)
+                       vdso_data->syscall_map_32[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+#else /* CONFIG_PPC64 */
+               if (sys_call_table[i] != sys_ni_syscall)
+                       vdso_data->syscall_map_32[i >> 5] |=
+                               0x80000000UL >> (i & 0x1f);
+#endif /* CONFIG_PPC64 */
+       }
+}
+
+
 void __init vdso_init(void)
 {
        int i;
 
+#ifdef CONFIG_PPC64
+       /*
+        * Fill up the "systemcfg" stuff for backward compatiblity
+        */
+       strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64");
+       vdso_data->version.major = SYSTEMCFG_MAJOR;
+       vdso_data->version.minor = SYSTEMCFG_MINOR;
+       vdso_data->processor = mfspr(SPRN_PVR);
+       vdso_data->platform = _machine;
+       vdso_data->physicalMemorySize = lmb_phys_mem_size();
+       vdso_data->dcache_size = ppc64_caches.dsize;
+       vdso_data->dcache_line_size = ppc64_caches.dline_size;
+       vdso_data->icache_size = ppc64_caches.isize;
+       vdso_data->icache_line_size = ppc64_caches.iline_size;
+
+       /*
+        * Calculate the size of the 64 bits vDSO
+        */
        vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT;
+       DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages);
+#endif /* CONFIG_PPC64 */
+
+
+       /*
+        * Calculate the size of the 32 bits vDSO
+        */
        vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT;
+       DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages);
 
-       DBG("vdso64_kbase: %p, 0x%x pages, vdso32_kbase: %p, 0x%x pages\n",
-              vdso64_kbase, vdso64_pages, vdso32_kbase, vdso32_pages);
 
+       /*
+        * Setup the syscall map in the vDOS
+        */
+       vdso_setup_syscall_map();
        /*
         * Initialize the vDSO images in memory, that is do necessary
         * fixups of vDSO symbols, locate trampolines, etc...
         */
        if (vdso_setup()) {
                printk(KERN_ERR "vDSO setup failure, not enabled !\n");
-               /* XXX should free pages here ? */
-               vdso64_pages = vdso32_pages = 0;
+               vdso32_pages = 0;
+#ifdef CONFIG_PPC64
+               vdso64_pages = 0;
+#endif
                return;
        }
 
        /* Make sure pages are in the correct state */
-       for (i = 0; i < vdso64_pages; i++) {
-               struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
+       for (i = 0; i < vdso32_pages; i++) {
+               struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
                ClearPageReserved(pg);
                get_page(pg);
+
        }
-       for (i = 0; i < vdso32_pages; i++) {
-               struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
+#ifdef CONFIG_PPC64
+       for (i = 0; i < vdso64_pages; i++) {
+               struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
                ClearPageReserved(pg);
                get_page(pg);
        }
+#endif /* CONFIG_PPC64 */
 
-       get_page(virt_to_page(_systemcfg));
+       get_page(virt_to_page(vdso_data));
 }
 
 int in_gate_area_no_task(unsigned long addr)
similarity index 91%
rename from arch/ppc64/kernel/vdso32/Makefile
rename to arch/powerpc/kernel/vdso32/Makefile
index 0b1b0df973eb25b38c00baf1a1e363d91267d3fe..8a3bed5f143a14f4a226a26fbcae4a2ba07e9791 100644 (file)
@@ -5,6 +5,10 @@ obj-vdso32 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
 
 # Build rules
 
+ifeq ($(CONFIG_PPC32),y)
+CROSS32CC := $(CC)
+endif
+
 targets := $(obj-vdso32) vdso32.so
 obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
 
@@ -15,7 +19,7 @@ EXTRA_AFLAGS := -D__VDSO32__ -s
 
 obj-y += vdso32_wrapper.o
 extra-y += vdso32.lds
-CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
+CPPFLAGS_vdso32.lds += -P -C -Upowerpc
 
 # Force dependency (incbin is bad)
 $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
similarity index 97%
rename from arch/ppc64/kernel/vdso32/cacheflush.S
rename to arch/powerpc/kernel/vdso32/cacheflush.S
index c8db993574ee84a0c6dd455f081a5788c9d51b22..09629aea3e4738d812280343756920edd55b0b74 100644 (file)
@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)
        subf    r8,r6,r4                /* compute length */
        add     r8,r8,r5                /* ensure we get enough */
        srwi.   r8,r8,7                 /* compute line count */
+       crclr   cr0*4+so
        beqlr                           /* nothing to do? */
        mtctr   r8
        mr      r3,r6
@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache)
  */
 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
   .cfi_startproc
+       crclr   cr0*4+so
        sync
        isync
        li      r3,0
similarity index 81%
rename from arch/ppc64/kernel/vdso32/datapage.S
rename to arch/powerpc/kernel/vdso32/datapage.S
index 4f4eb0be3992eedf9b58160858efe3c96a366c93..4709f1d9542cde4aca0bfbc1e1bffc2ceefcb3ab 100644 (file)
@@ -54,7 +54,6 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
   .cfi_startproc
        mflr    r12
   .cfi_register lr,r12
-
        mr      r4,r3
        bl      __get_datapage@local
        mtlr    r12
@@ -63,6 +62,25 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
        beqlr
        li      r0,__NR_syscalls
        stw     r0,0(r4)
+       crclr   cr0*4+so
        blr
   .cfi_endproc
 V_FUNCTION_END(__kernel_get_syscall_map)
+
+/*
+ * void unsigned long long  __kernel_get_tbfreq(void);
+ *
+ * returns the timebase frequency in HZ
+ */
+V_FUNCTION_BEGIN(__kernel_get_tbfreq)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+       bl      __get_datapage@local
+       lwz     r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
+       lwz     r3,CFG_TB_TICKS_PER_SEC(r3)
+       mtlr    r12
+       crclr   cr0*4+so
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_tbfreq)
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
new file mode 100644 (file)
index 0000000..7eebff0
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * Userland implementation of gettimeofday() for 32 bits processes in a
+ * ppc64 kernel for use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org,
+ *                    IBM Corp.
+ *
+ * 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/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+
+       .text
+/*
+ * Exact prototype of gettimeofday
+ *
+ * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_gettimeofday)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r10,r3                  /* r10 saves tv */
+       mr      r11,r4                  /* r11 saves tz */
+       bl      __get_datapage@local    /* get data page */
+       mr      r9, r3                  /* datapage ptr in r9 */
+       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    2f                      /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r5,r4,12,20,31
+       rlwimi  r5,r3,12,0,19
+       stw     r5,TVAL32_TV_SEC(r10)
+
+       /* get remaining xsec and convert to usec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication
+        */
+       rlwinm  r5,r4,12,0,19
+       lis     r6,1000000@h
+       ori     r6,r6,1000000@l
+       mulhwu  r5,r5,r6
+       stw     r5,TVAL32_TV_USEC(r10)
+
+       cmpli   cr0,r11,0               /* check if tz is NULL */
+       beq     1f
+       lwz     r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
+       lwz     r5,CFG_TZ_DSTTIME(r9)
+       stw     r4,TZONE_TZ_MINWEST(r11)
+       stw     r5,TZONE_TZ_DSTTIME(r11)
+
+1:     mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0
+       blr
+
+2:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+       li      r0,__NR_gettimeofday
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_gettimeofday)
+
+/*
+ * Exact prototype of clock_gettime()
+ *
+ * int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_gettime)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpli   cr0,r3,CLOCK_REALTIME
+       cmpli   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0*4+eq,cr0*4+eq,cr1*4+eq
+       bne     cr0,99f
+
+       mflr    r12                     /* r12 saves lr */
+  .cfi_register lr,r12
+       mr      r10,r3                  /* r10 saves id */
+       mr      r11,r4                  /* r11 saves tp */
+       bl      __get_datapage@local    /* get data page */
+       mr      r9,r3                   /* datapage ptr in r9 */
+       beq     cr1,50f                 /* if monotonic -> jump there */
+
+       /*
+        * CLOCK_REALTIME
+        */
+
+       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    98f                     /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r5,r4,12,20,31
+       rlwimi  r5,r3,12,0,19
+       stw     r5,TSPC32_TV_SEC(r11)
+
+       /* get remaining xsec and convert to nsec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication, then we multiply by 1000
+        */
+       rlwinm  r5,r4,12,0,19
+       lis     r6,1000000@h
+       ori     r6,r6,1000000@l
+       mulhwu  r5,r5,r6
+       mulli   r5,r5,1000
+       stw     r5,TSPC32_TV_NSEC(r11)
+       mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0
+       blr
+
+       /*
+        * CLOCK_MONOTONIC
+        */
+
+50:    bl      __do_get_xsec@local     /* get xsec from tb & kernel */
+       bne-    98f                     /* out of line -> do syscall */
+
+       /* seconds are xsec >> 20 */
+       rlwinm  r6,r4,12,20,31
+       rlwimi  r6,r3,12,0,19
+
+       /* get remaining xsec and convert to nsec. we scale
+        * up remaining xsec by 12 bits and get the top 32 bits
+        * of the multiplication, then we multiply by 1000
+        */
+       rlwinm  r7,r4,12,0,19
+       lis     r5,1000000@h
+       ori     r5,r5,1000000@l
+       mulhwu  r7,r7,r5
+       mulli   r7,r7,1000
+
+       /* now we must fixup using wall to monotonic. We need to snapshot
+        * that value and do the counter trick again. Fortunately, we still
+        * have the counter value in r8 that was returned by __do_get_xsec.
+        * At this point, r6,r7 contain our sec/nsec values, r3,r4 and r5
+        * can be used
+        */
+
+       lwz     r3,WTOM_CLOCK_SEC(r9)
+       lwz     r4,WTOM_CLOCK_NSEC(r9)
+
+       /* We now have our result in r3,r4. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r5,r4,r3
+       xor     r0,r5,r5
+       add     r9,r9,r0
+#ifdef CONFIG_PPC64
+       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+       lwz     r0,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+        cmpl    cr0,r8,r0              /* check if updated */
+       bne-    50b
+
+       /* Calculate and store result. Note that this mimmics the C code,
+        * which may cause funny results if nsec goes negative... is that
+        * possible at all ?
+        */
+       add     r3,r3,r6
+       add     r4,r4,r7
+       lis     r5,NSEC_PER_SEC@h
+       ori     r5,r5,NSEC_PER_SEC@l
+       cmpl    cr0,r4,r5
+       cmpli   cr1,r4,0
+       blt     1f
+       subf    r4,r5,r4
+       addi    r3,r3,1
+1:     bge     cr1,1f
+       addi    r3,r3,-1
+       add     r4,r4,r5
+1:     stw     r3,TSPC32_TV_SEC(r11)
+       stw     r4,TSPC32_TV_NSEC(r11)
+
+       mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0
+       blr
+
+       /*
+        * syscall fallback
+        */
+98:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+99:
+       li      r0,__NR_clock_gettime
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_gettime)
+
+
+/*
+ * Exact prototype of clock_getres()
+ *
+ * int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_getres)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0*4+eq,cr0*4+eq,cr1*4+eq
+       bne     cr0,99f
+
+       li      r3,0
+       cmpli   cr0,r4,0
+       crclr   cr0*4+so
+       beqlr
+       lis     r5,CLOCK_REALTIME_RES@h
+       ori     r5,r5,CLOCK_REALTIME_RES@l
+       stw     r3,TSPC32_TV_SEC(r4)
+       stw     r5,TSPC32_TV_NSEC(r4)
+       blr
+
+       /*
+        * syscall fallback
+        */
+99:
+       li      r0,__NR_clock_getres
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_getres)
+
+
+/*
+ * This is the core of gettimeofday() & friends, it returns the xsec
+ * value in r3 & r4 and expects the datapage ptr (non clobbered)
+ * in r9. clobbers r0,r4,r5,r6,r7,r8.
+ * When returning, r8 contains the counter value that can be reused
+ * by the monotonic clock implementation
+ */
+__do_get_xsec:
+  .cfi_startproc
+       /* Check for update count & load values. We use the low
+        * order 32 bits of the update count
+        */
+#ifdef CONFIG_PPC64
+1:     lwz     r8,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+1:     lwz     r8,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+       andi.   r0,r8,1                 /* pending update ? loop */
+       bne-    1b
+       xor     r0,r8,r8                /* create dependency */
+       add     r9,r9,r0
+
+       /* Load orig stamp (offset to TB) */
+       lwz     r5,CFG_TB_ORIG_STAMP(r9)
+       lwz     r6,(CFG_TB_ORIG_STAMP+4)(r9)
+
+       /* Get a stable TB value */
+2:     mftbu   r3
+       mftbl   r4
+       mftbu   r0
+       cmpl    cr0,r3,r0
+       bne-    2b
+
+       /* Substract tb orig stamp. If the high part is non-zero, we jump to
+        * the slow path which call the syscall.
+        * If it's ok, then we have our 32 bits tb_ticks value in r7
+        */
+       subfc   r7,r6,r4
+       subfe.  r0,r5,r3
+       bne-    3f
+
+       /* Load scale factor & do multiplication */
+       lwz     r5,CFG_TB_TO_XS(r9)     /* load values */
+       lwz     r6,(CFG_TB_TO_XS+4)(r9)
+       mulhwu  r4,r7,r5
+       mulhwu  r6,r7,r6
+       mullw   r0,r7,r5
+       addc    r6,r6,r0
+
+       /* At this point, we have the scaled xsec value in r4 + XER:CA
+        * we load & add the stamp since epoch
+        */
+       lwz     r5,CFG_STAMP_XSEC(r9)
+       lwz     r6,(CFG_STAMP_XSEC+4)(r9)
+       adde    r4,r4,r6
+       addze   r3,r5
+
+       /* We now have our result in r3,r4. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r6,r4,r3
+       xor     r0,r6,r6
+       add     r9,r9,r0
+#ifdef CONFIG_PPC64
+       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
+#else
+       lwz     r0,(CFG_TB_UPDATE_COUNT)(r9)
+#endif
+        cmpl    cr0,r8,r0              /* check if updated */
+       bne-    1b
+
+       /* Warning ! The caller expects CR:EQ to be set to indicate a
+        * successful calculation (so it won't fallback to the syscall
+        * method). We have overriden that CR bit in the counter check,
+        * but fortunately, the loop exit condition _is_ CR:EQ set, so
+        * we can exit safely here. If you change this code, be careful
+        * of that side effect.
+        */
+3:     blr
+  .cfi_endproc
similarity index 97%
rename from arch/ppc64/kernel/vdso32/vdso32.lds.S
rename to arch/powerpc/kernel/vdso32/vdso32.lds.S
index 6f87a916a394c37f7d63564f8d62edcd7569cc80..f4bad720cb0a1b7f450260671844261f0ebb634e 100644 (file)
@@ -102,9 +102,12 @@ VERSION
 {
   VDSO_VERSION_STRING {
     global:
-       __kernel_datapage_offset; /* Has to be there for the kernel to find it */
+       __kernel_datapage_offset; /* Has to be there for the kernel to find */
        __kernel_get_syscall_map;
        __kernel_gettimeofday;
+       __kernel_clock_gettime;
+       __kernel_clock_getres;
+       __kernel_get_tbfreq;
        __kernel_sync_dicache;
        __kernel_sync_dicache_p5;
        __kernel_sigtramp32;
similarity index 79%
rename from arch/ppc64/kernel/vdso32/vdso32_wrapper.S
rename to arch/powerpc/kernel/vdso32/vdso32_wrapper.S
index 76ca28e09d295cbceca9909ce5b1c7fa858a5b60..556f0caa5d842a27885a6c2417787c18315037dc 100644 (file)
@@ -6,7 +6,7 @@
        .globl vdso32_start, vdso32_end
        .balign PAGE_SIZE
 vdso32_start:
-       .incbin "arch/ppc64/kernel/vdso32/vdso32.so"
+       .incbin "arch/powerpc/kernel/vdso32/vdso32.so"
        .balign PAGE_SIZE
 vdso32_end:
 
similarity index 97%
rename from arch/ppc64/kernel/vdso64/cacheflush.S
rename to arch/powerpc/kernel/vdso64/cacheflush.S
index d4a0ad28d534ead85150a30f5607cfbc48969ad7..cb4ae0a5edd098491fdc2a0145a15b35f7896c22 100644 (file)
@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)
        subf    r8,r6,r4                /* compute length */
        add     r8,r8,r5                /* ensure we get enough */
        srwi.   r8,r8,7                 /* compute line count */
+       crclr   cr0*4+so
        beqlr                           /* nothing to do? */
        mtctr   r8
        mr      r3,r6
@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache)
  */
 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
   .cfi_startproc
+       crclr   cr0*4+so
        sync
        isync
        li      r3,0
similarity index 82%
rename from arch/ppc64/kernel/vdso64/datapage.S
rename to arch/powerpc/kernel/vdso64/datapage.S
index ed6e599ae8242a6a8ad992d0492a15a4cc3b8a1e..3b2dd7d0c1ebf88453cc80b8b7ae658216a20d2e 100644 (file)
@@ -54,15 +54,33 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
   .cfi_startproc
        mflr    r12
   .cfi_register lr,r12
-
        mr      r4,r3
        bl      V_LOCAL_FUNC(__get_datapage)
        mtlr    r12
        addi    r3,r3,CFG_SYSCALL_MAP64
        cmpli   cr0,r4,0
+       crclr   cr0*4+so
        beqlr
        li      r0,__NR_syscalls
        stw     r0,0(r4)
        blr
   .cfi_endproc
 V_FUNCTION_END(__kernel_get_syscall_map)
+
+
+/*
+ * void unsigned long  __kernel_get_tbfreq(void);
+ *
+ * returns the timebase frequency in HZ
+ */
+V_FUNCTION_BEGIN(__kernel_get_tbfreq)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+       bl      V_LOCAL_FUNC(__get_datapage)
+       ld      r3,CFG_TB_TICKS_PER_SEC(r3)
+       mtlr    r12
+       crclr   cr0*4+so
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_get_tbfreq)
diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S
new file mode 100644 (file)
index 0000000..ccaeda5
--- /dev/null
@@ -0,0 +1,253 @@
+
+       /*
+ * Userland implementation of gettimeofday() for 64 bits processes in a
+ * ppc64 kernel for use in the vDSO
+ *
+ * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
+ *                    IBM Corp.
+ *
+ * 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/config.h>
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+#include <asm/vdso.h>
+#include <asm/asm-offsets.h>
+#include <asm/unistd.h>
+
+       .text
+/*
+ * Exact prototype of gettimeofday
+ *
+ * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_gettimeofday)
+  .cfi_startproc
+       mflr    r12
+  .cfi_register lr,r12
+
+       mr      r11,r3                  /* r11 holds tv */
+       mr      r10,r4                  /* r10 holds tz */
+       bl      V_LOCAL_FUNC(__get_datapage)    /* get data page */
+       bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
+       ori     r7,r7,16960
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       std     r5,TVAL64_TV_SEC(r11)   /* store sec in tv */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r0,r0,44,20
+       cmpldi  cr0,r10,0               /* check if tz is NULL */
+       std     r0,TVAL64_TV_USEC(r11)  /* store usec in tv */
+       beq     1f
+       lwz     r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
+       lwz     r5,CFG_TZ_DSTTIME(r3)
+       stw     r4,TZONE_TZ_MINWEST(r10)
+       stw     r5,TZONE_TZ_DSTTIME(r10)
+1:     mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0                    /* always success */
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_gettimeofday)
+
+
+/*
+ * Exact prototype of clock_gettime()
+ *
+ * int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_gettime)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0*4+eq,cr0*4+eq,cr1*4+eq
+       bne     cr0,99f
+
+       mflr    r12                     /* r12 saves lr */
+  .cfi_register lr,r12
+       mr      r10,r3                  /* r10 saves id */
+       mr      r11,r4                  /* r11 saves tp */
+       bl      V_LOCAL_FUNC(__get_datapage)    /* get data page */
+       beq     cr1,50f                 /* if monotonic -> jump there */
+
+       /*
+        * CLOCK_REALTIME
+        */
+
+       bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+
+       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
+       ori     r7,r7,16960
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       std     r5,TSPC64_TV_SEC(r11)   /* store sec in tv */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r0,r0,44,20
+       mulli   r0,r0,1000              /* nsec = usec * 1000 */
+       std     r0,TSPC64_TV_NSEC(r11)  /* store nsec in tp */
+
+       mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0
+       blr
+
+       /*
+        * CLOCK_MONOTONIC
+        */
+
+50:    bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
+
+       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
+       ori     r7,r7,16960
+       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
+       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
+       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
+       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) /
+                                        * XSEC_PER_SEC
+                                        */
+       rldicl  r6,r0,44,20
+       mulli   r6,r6,1000              /* nsec = usec * 1000 */
+
+       /* now we must fixup using wall to monotonic. We need to snapshot
+        * that value and do the counter trick again. Fortunately, we still
+        * have the counter value in r8 that was returned by __do_get_xsec.
+        * At this point, r5,r6 contain our sec/nsec values.
+        * can be used
+        */
+
+       lwa     r4,WTOM_CLOCK_SEC(r3)
+       lwa     r7,WTOM_CLOCK_NSEC(r3)
+
+       /* We now have our result in r4,r7. We create a fake dependency
+        * on that result and re-check the counter
+        */
+       or      r9,r4,r7
+       xor     r0,r9,r9
+       add     r3,r3,r0
+       ld      r0,CFG_TB_UPDATE_COUNT(r3)
+        cmpld   cr0,r0,r8              /* check if updated */
+       bne-    50b
+
+       /* Calculate and store result. Note that this mimmics the C code,
+        * which may cause funny results if nsec goes negative... is that
+        * possible at all ?
+        */
+       add     r4,r4,r5
+       add     r7,r7,r6
+       lis     r9,NSEC_PER_SEC@h
+       ori     r9,r9,NSEC_PER_SEC@l
+       cmpl    cr0,r7,r9
+       cmpli   cr1,r7,0
+       blt     1f
+       subf    r7,r9,r7
+       addi    r4,r4,1
+1:     bge     cr1,1f
+       addi    r4,r4,-1
+       add     r7,r7,r9
+1:     std     r4,TSPC64_TV_SEC(r11)
+       std     r7,TSPC64_TV_NSEC(r11)
+
+       mtlr    r12
+       crclr   cr0*4+so
+       li      r3,0
+       blr
+
+       /*
+        * syscall fallback
+        */
+98:
+       mtlr    r12
+       mr      r3,r10
+       mr      r4,r11
+99:
+       li      r0,__NR_clock_gettime
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_gettime)
+
+
+/*
+ * Exact prototype of clock_getres()
+ *
+ * int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
+ *
+ */
+V_FUNCTION_BEGIN(__kernel_clock_getres)
+  .cfi_startproc
+       /* Check for supported clock IDs */
+       cmpwi   cr0,r3,CLOCK_REALTIME
+       cmpwi   cr1,r3,CLOCK_MONOTONIC
+       cror    cr0*4+eq,cr0*4+eq,cr1*4+eq
+       bne     cr0,99f
+
+       li      r3,0
+       cmpli   cr0,r4,0
+       crclr   cr0*4+so
+       beqlr
+       lis     r5,CLOCK_REALTIME_RES@h
+       ori     r5,r5,CLOCK_REALTIME_RES@l
+       std     r3,TSPC64_TV_SEC(r4)
+       std     r5,TSPC64_TV_NSEC(r4)
+       blr
+
+       /*
+        * syscall fallback
+        */
+99:
+       li      r0,__NR_clock_getres
+       sc
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__kernel_clock_getres)
+
+
+/*
+ * This is the core of gettimeofday(), it returns the xsec
+ * value in r4 and expects the datapage ptr (non clobbered)
+ * in r3. clobbers r0,r4,r5,r6,r7,r8
+ * When returning, r8 contains the counter value that can be reused
+ */
+V_FUNCTION_BEGIN(__do_get_xsec)
+  .cfi_startproc
+       /* check for update count & load values */
+1:     ld      r8,CFG_TB_UPDATE_COUNT(r3)
+       andi.   r0,r4,1                 /* pending update ? loop */
+       bne-    1b
+       xor     r0,r4,r4                /* create dependency */
+       add     r3,r3,r0
+
+       /* Get TB & offset it */
+       mftb    r7
+       ld      r9,CFG_TB_ORIG_STAMP(r3)
+       subf    r7,r9,r7
+
+       /* Scale result */
+       ld      r5,CFG_TB_TO_XS(r3)
+       mulhdu  r7,r7,r5
+
+       /* Add stamp since epoch */
+       ld      r6,CFG_STAMP_XSEC(r3)
+       add     r4,r6,r7
+
+       xor     r0,r4,r4
+       add     r3,r3,r0
+       ld      r0,CFG_TB_UPDATE_COUNT(r3)
+        cmpld   cr0,r0,r8              /* check if updated */
+       bne-    1b
+       blr
+  .cfi_endproc
+V_FUNCTION_END(__do_get_xsec)
similarity index 97%
rename from arch/ppc64/kernel/vdso64/vdso64.lds.S
rename to arch/powerpc/kernel/vdso64/vdso64.lds.S
index 9cb28181da802c0d4c9d3ce6c3220c8371df4256..4bdf224464abaf2914a2d62bb285f5f3404fe85c 100644 (file)
@@ -102,9 +102,12 @@ VERSION
 {
   VDSO_VERSION_STRING {
     global:
-       __kernel_datapage_offset; /* Has to be there for the kernel to find it */
+       __kernel_datapage_offset; /* Has to be there for the kernel to find */
        __kernel_get_syscall_map;
        __kernel_gettimeofday;
+       __kernel_clock_gettime;
+       __kernel_clock_getres;
+       __kernel_get_tbfreq;
        __kernel_sync_dicache;
        __kernel_sync_dicache_p5;
        __kernel_sigtramp_rt64;
similarity index 79%
rename from arch/ppc64/kernel/vdso64/vdso64_wrapper.S
rename to arch/powerpc/kernel/vdso64/vdso64_wrapper.S
index 771c2741c492ebd8b11685ad593dd67fa657ece3..0529cb9e3b97bfaef233858595f91cebb820ac96 100644 (file)
@@ -6,7 +6,7 @@
        .globl vdso64_start, vdso64_end
        .balign PAGE_SIZE
 vdso64_start:
-       .incbin "arch/ppc64/kernel/vdso64/vdso64.so"
+       .incbin "arch/powerpc/kernel/vdso64/vdso64.so"
        .balign PAGE_SIZE
 vdso64_end:
 
index af9ca0eb6d55b6aba7fd0903371cbeef313c2199..5d581bb3aa1249fa8826fe16a648f818c3f33cae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Modifications by Kumar Gala (kumar.gala@freescale.com) to support
+ * Modifications by Kumar Gala (galak@kernel.crashing.org) to support
  * E500 Book E processors.
  *
  * Copyright 2004 Freescale Semiconductor, Inc
index 9b5aa6808eb8b975ebba92f7417d191037f36a6b..9584608fd7688a4b0a8200cc4224f8c9a2a03a14 100644 (file)
 #include "mmu_decl.h"          /* for __max_low_memory */
 #endif
 
-struct lmb lmb;
-
 #undef DEBUG
 
+#ifdef DEBUG
+#include <asm/udbg.h>
+#define DBG(fmt...) udbg_printf(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+struct lmb lmb;
+
 void lmb_dump_all(void)
 {
 #ifdef DEBUG
        unsigned long i;
 
-       udbg_printf("lmb_dump_all:\n");
-       udbg_printf("    memory.cnt               = 0x%lx\n",
-                   lmb.memory.cnt);
-       udbg_printf("    memory.size              = 0x%lx\n",
-                   lmb.memory.size);
+       DBG("lmb_dump_all:\n");
+       DBG("    memory.cnt               = 0x%lx\n", lmb.memory.cnt);
+       DBG("    memory.size              = 0x%lx\n", lmb.memory.size);
        for (i=0; i < lmb.memory.cnt ;i++) {
-               udbg_printf("    memory.region[0x%x].base       = 0x%lx\n",
+               DBG("    memory.region[0x%x].base       = 0x%lx\n",
                            i, lmb.memory.region[i].base);
-               udbg_printf("                 .size     = 0x%lx\n",
+               DBG("                 .size     = 0x%lx\n",
                            lmb.memory.region[i].size);
        }
 
-       udbg_printf("\n    reserved.cnt   = 0x%lx\n",
-                   lmb.reserved.cnt);
-       udbg_printf("    reserved.size    = 0x%lx\n",
-                   lmb.reserved.size);
+       DBG("\n    reserved.cnt   = 0x%lx\n", lmb.reserved.cnt);
+       DBG("    reserved.size    = 0x%lx\n", lmb.reserved.size);
        for (i=0; i < lmb.reserved.cnt ;i++) {
-               udbg_printf("    reserved.region[0x%x].base       = 0x%lx\n",
+               DBG("    reserved.region[0x%x].base       = 0x%lx\n",
                            i, lmb.reserved.region[i].base);
-               udbg_printf("                 .size     = 0x%lx\n",
+               DBG("                 .size     = 0x%lx\n",
                            lmb.reserved.region[i].size);
        }
 #endif /* DEBUG */
index 1dd3cc69a4901710d0514202dad224121619d9df..4bd7b0a70996a6e569790ef8652241d61edb37ba 100644 (file)
@@ -46,9 +46,7 @@
 #include <asm/prom.h>
 #include <asm/lmb.h>
 #include <asm/sections.h>
-#ifdef CONFIG_PPC64
 #include <asm/vdso.h>
-#endif
 
 #include "mmu_decl.h"
 
@@ -202,6 +200,8 @@ void show_mem(void)
                unsigned long flags;
                pgdat_resize_lock(pgdat, &flags);
                for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       if (!pfn_valid(pgdat->node_start_pfn + i))
+                               continue;
                        page = pgdat_page_nr(pgdat, i);
                        total++;
                        if (PageHighMem(page))
@@ -338,7 +338,7 @@ void __init mem_init(void)
        struct page *page;
        unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
 
-       num_physpages = max_pfn;        /* RAM is assumed contiguous */
+       num_physpages = lmb.memory.size >> PAGE_SHIFT;
        high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
@@ -350,11 +350,13 @@ void __init mem_init(void)
                }
        }
 #else
-       max_mapnr = num_physpages;
+       max_mapnr = max_pfn;
        totalram_pages += free_all_bootmem();
 #endif
        for_each_pgdat(pgdat) {
                for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       if (!pfn_valid(pgdat->node_start_pfn + i))
+                               continue;
                        page = pgdat_page_nr(pgdat, i);
                        if (PageReserved(page))
                                reservedpages++;
@@ -397,10 +399,8 @@ void __init mem_init(void)
 
        mem_init_done = 1;
 
-#ifdef CONFIG_PPC64
        /* Initialize the vDSO */
        vdso_init();
-#endif
 }
 
 /*
index da09ba03c424fb6b89ca06c795bbf2c646d5f734..f72cf87364cb29d9953131fc1f0ef46d5a407087 100644 (file)
@@ -17,9 +17,8 @@
 #include <linux/nodemask.h>
 #include <linux/cpu.h>
 #include <linux/notifier.h>
+#include <asm/sparsemem.h>
 #include <asm/lmb.h>
-#include <asm/machdep.h>
-#include <asm/abs_addr.h>
 #include <asm/system.h>
 #include <asm/smp.h>
 
@@ -28,45 +27,113 @@ static int numa_enabled = 1;
 static int numa_debug;
 #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
 
-#ifdef DEBUG_NUMA
-#define ARRAY_INITIALISER -1
-#else
-#define ARRAY_INITIALISER 0
-#endif
-
-int numa_cpu_lookup_table[NR_CPUS] = { [ 0 ... (NR_CPUS - 1)] =
-       ARRAY_INITIALISER};
-char *numa_memory_lookup_table;
+int numa_cpu_lookup_table[NR_CPUS];
 cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES];
-int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
-
 struct pglist_data *node_data[MAX_NUMNODES];
-bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
+
+EXPORT_SYMBOL(numa_cpu_lookup_table);
+EXPORT_SYMBOL(numa_cpumask_lookup_table);
+EXPORT_SYMBOL(node_data);
+
+static bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
 static int min_common_depth;
 
 /*
- * We need somewhere to store start/span for each node until we have
+ * We need somewhere to store start/end/node for each region until we have
  * allocated the real node_data structures.
  */
+#define MAX_REGIONS    (MAX_LMB_REGIONS*2)
 static struct {
-       unsigned long node_start_pfn;
-       unsigned long node_end_pfn;
-       unsigned long node_present_pages;
-} init_node_data[MAX_NUMNODES] __initdata;
+       unsigned long start_pfn;
+       unsigned long end_pfn;
+       int nid;
+} init_node_data[MAX_REGIONS] __initdata;
 
-EXPORT_SYMBOL(node_data);
-EXPORT_SYMBOL(numa_cpu_lookup_table);
-EXPORT_SYMBOL(numa_memory_lookup_table);
-EXPORT_SYMBOL(numa_cpumask_lookup_table);
-EXPORT_SYMBOL(nr_cpus_in_node);
+int __init early_pfn_to_nid(unsigned long pfn)
+{
+       unsigned int i;
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               unsigned long start_pfn = init_node_data[i].start_pfn;
+               unsigned long end_pfn = init_node_data[i].end_pfn;
+
+               if ((start_pfn <= pfn) && (pfn < end_pfn))
+                       return init_node_data[i].nid;
+       }
+
+       return -1;
+}
+
+void __init add_region(unsigned int nid, unsigned long start_pfn,
+                      unsigned long pages)
+{
+       unsigned int i;
+
+       dbg("add_region nid %d start_pfn 0x%lx pages 0x%lx\n",
+               nid, start_pfn, pages);
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               if (init_node_data[i].nid != nid)
+                       continue;
+               if (init_node_data[i].end_pfn == start_pfn) {
+                       init_node_data[i].end_pfn += pages;
+                       return;
+               }
+               if (init_node_data[i].start_pfn == (start_pfn + pages)) {
+                       init_node_data[i].start_pfn -= pages;
+                       return;
+               }
+       }
+
+       /*
+        * Leave last entry NULL so we dont iterate off the end (we use
+        * entry.end_pfn to terminate the walk).
+        */
+       if (i >= (MAX_REGIONS - 1)) {
+               printk(KERN_ERR "WARNING: too many memory regions in "
+                               "numa code, truncating\n");
+               return;
+       }
+
+       init_node_data[i].start_pfn = start_pfn;
+       init_node_data[i].end_pfn = start_pfn + pages;
+       init_node_data[i].nid = nid;
+}
+
+/* We assume init_node_data has no overlapping regions */
+void __init get_region(unsigned int nid, unsigned long *start_pfn,
+                      unsigned long *end_pfn, unsigned long *pages_present)
+{
+       unsigned int i;
+
+       *start_pfn = -1UL;
+       *end_pfn = *pages_present = 0;
+
+       for (i = 0; init_node_data[i].end_pfn; i++) {
+               if (init_node_data[i].nid != nid)
+                       continue;
+
+               *pages_present += init_node_data[i].end_pfn -
+                       init_node_data[i].start_pfn;
+
+               if (init_node_data[i].start_pfn < *start_pfn)
+                       *start_pfn = init_node_data[i].start_pfn;
+
+               if (init_node_data[i].end_pfn > *end_pfn)
+                       *end_pfn = init_node_data[i].end_pfn;
+       }
+
+       /* We didnt find a matching region, return start/end as 0 */
+       if (*start_pfn == -1UL)
+               start_pfn = 0;
+}
 
 static inline void map_cpu_to_node(int cpu, int node)
 {
        numa_cpu_lookup_table[cpu] = node;
-       if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node]))) {
+
+       if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node])))
                cpu_set(cpu, numa_cpumask_lookup_table[node]);
-               nr_cpus_in_node[node]++;
-       }
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -78,7 +145,6 @@ static void unmap_cpu_from_node(unsigned long cpu)
 
        if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) {
                cpu_clear(cpu, numa_cpumask_lookup_table[node]);
-               nr_cpus_in_node[node]--;
        } else {
                printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
                       cpu, node);
@@ -86,7 +152,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
-static struct device_node * __devinit find_cpu_node(unsigned int cpu)
+static struct device_node *find_cpu_node(unsigned int cpu)
 {
        unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
        struct device_node *cpu_node = NULL;
@@ -213,7 +279,7 @@ static int __init get_mem_size_cells(void)
        return rc;
 }
 
-static unsigned long read_n_cells(int n, unsigned int **buf)
+static unsigned long __init read_n_cells(int n, unsigned int **buf)
 {
        unsigned long result = 0;
 
@@ -295,7 +361,8 @@ static int cpu_numa_callback(struct notifier_block *nfb,
  * or zero. If the returned value of size is 0 the region should be
  * discarded as it lies wholy above the memory limit.
  */
-static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsigned long size)
+static unsigned long __init numa_enforce_memory_limit(unsigned long start,
+                                                     unsigned long size)
 {
        /*
         * We use lmb_end_of_DRAM() in here instead of memory_limit because
@@ -320,8 +387,7 @@ static int __init parse_numa_properties(void)
        struct device_node *cpu = NULL;
        struct device_node *memory = NULL;
        int addr_cells, size_cells;
-       int max_domain = 0;
-       long entries = lmb_end_of_DRAM() >> MEMORY_INCREMENT_SHIFT;
+       int max_domain;
        unsigned long i;
 
        if (numa_enabled == 0) {
@@ -329,13 +395,6 @@ static int __init parse_numa_properties(void)
                return -1;
        }
 
-       numa_memory_lookup_table =
-               (char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
-       memset(numa_memory_lookup_table, 0, entries * sizeof(char));
-
-       for (i = 0; i < entries ; i++)
-               numa_memory_lookup_table[i] = ARRAY_INITIALISER;
-
        min_common_depth = find_min_common_depth();
 
        dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
@@ -387,9 +446,6 @@ new_range:
                start = read_n_cells(addr_cells, &memcell_buf);
                size = read_n_cells(size_cells, &memcell_buf);
 
-               start = _ALIGN_DOWN(start, MEMORY_INCREMENT);
-               size = _ALIGN_UP(size, MEMORY_INCREMENT);
-
                numa_domain = of_node_numa_domain(memory);
 
                if (numa_domain >= MAX_NUMNODES) {
@@ -403,44 +459,15 @@ new_range:
                if (max_domain < numa_domain)
                        max_domain = numa_domain;
 
-               if (! (size = numa_enforce_memory_limit(start, size))) {
+               if (!(size = numa_enforce_memory_limit(start, size))) {
                        if (--ranges)
                                goto new_range;
                        else
                                continue;
                }
 
-               /*
-                * Initialize new node struct, or add to an existing one.
-                */
-               if (init_node_data[numa_domain].node_end_pfn) {
-                       if ((start / PAGE_SIZE) <
-                           init_node_data[numa_domain].node_start_pfn)
-                               init_node_data[numa_domain].node_start_pfn =
-                                       start / PAGE_SIZE;
-                       if (((start / PAGE_SIZE) + (size / PAGE_SIZE)) >
-                           init_node_data[numa_domain].node_end_pfn)
-                               init_node_data[numa_domain].node_end_pfn =
-                                       (start / PAGE_SIZE) +
-                                       (size / PAGE_SIZE);
-
-                       init_node_data[numa_domain].node_present_pages +=
-                               size / PAGE_SIZE;
-               } else {
-                       node_set_online(numa_domain);
-
-                       init_node_data[numa_domain].node_start_pfn =
-                               start / PAGE_SIZE;
-                       init_node_data[numa_domain].node_end_pfn =
-                               init_node_data[numa_domain].node_start_pfn +
-                               size / PAGE_SIZE;
-                       init_node_data[numa_domain].node_present_pages =
-                               size / PAGE_SIZE;
-               }
-
-               for (i = start ; i < (start+size); i += MEMORY_INCREMENT)
-                       numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] =
-                               numa_domain;
+               add_region(numa_domain, start >> PAGE_SHIFT,
+                          size >> PAGE_SHIFT);
 
                if (--ranges)
                        goto new_range;
@@ -456,32 +483,18 @@ static void __init setup_nonnuma(void)
 {
        unsigned long top_of_ram = lmb_end_of_DRAM();
        unsigned long total_ram = lmb_phys_mem_size();
-       unsigned long i;
+       unsigned int i;
 
        printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
               top_of_ram, total_ram);
        printk(KERN_INFO "Memory hole size: %ldMB\n",
               (top_of_ram - total_ram) >> 20);
 
-       if (!numa_memory_lookup_table) {
-               long entries = top_of_ram >> MEMORY_INCREMENT_SHIFT;
-               numa_memory_lookup_table =
-                       (char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
-               memset(numa_memory_lookup_table, 0, entries * sizeof(char));
-               for (i = 0; i < entries ; i++)
-                       numa_memory_lookup_table[i] = ARRAY_INITIALISER;
-       }
-
        map_cpu_to_node(boot_cpuid, 0);
-
+       for (i = 0; i < lmb.memory.cnt; ++i)
+               add_region(0, lmb.memory.region[i].base >> PAGE_SHIFT,
+                          lmb_size_pages(&lmb.memory, i));
        node_set_online(0);
-
-       init_node_data[0].node_start_pfn = 0;
-       init_node_data[0].node_end_pfn = lmb_end_of_DRAM() / PAGE_SIZE;
-       init_node_data[0].node_present_pages = total_ram / PAGE_SIZE;
-
-       for (i = 0 ; i < top_of_ram; i += MEMORY_INCREMENT)
-               numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] = 0;
 }
 
 static void __init dump_numa_topology(void)
@@ -499,8 +512,9 @@ static void __init dump_numa_topology(void)
 
                count = 0;
 
-               for (i = 0; i < lmb_end_of_DRAM(); i += MEMORY_INCREMENT) {
-                       if (numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] == node) {
+               for (i = 0; i < lmb_end_of_DRAM();
+                    i += (1 << SECTION_SIZE_BITS)) {
+                       if (early_pfn_to_nid(i >> PAGE_SHIFT) == node) {
                                if (count == 0)
                                        printk(" 0x%lx", i);
                                ++count;
@@ -525,10 +539,12 @@ static void __init dump_numa_topology(void)
  *
  * Returns the physical address of the memory.
  */
-static unsigned long careful_allocation(int nid, unsigned long size,
-                                       unsigned long align, unsigned long end)
+static void __init *careful_allocation(int nid, unsigned long size,
+                                      unsigned long align,
+                                      unsigned long end_pfn)
 {
-       unsigned long ret = lmb_alloc_base(size, align, end);
+       int new_nid;
+       unsigned long ret = lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
 
        /* retry over all memory */
        if (!ret)
@@ -542,28 +558,27 @@ static unsigned long careful_allocation(int nid, unsigned long size,
         * If the memory came from a previously allocated node, we must
         * retry with the bootmem allocator.
         */
-       if (pa_to_nid(ret) < nid) {
-               nid = pa_to_nid(ret);
-               ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(nid),
+       new_nid = early_pfn_to_nid(ret >> PAGE_SHIFT);
+       if (new_nid < nid) {
+               ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(new_nid),
                                size, align, 0);
 
                if (!ret)
                        panic("numa.c: cannot allocate %lu bytes on node %d",
-                             size, nid);
+                             size, new_nid);
 
-               ret = virt_to_abs(ret);
+               ret = __pa(ret);
 
                dbg("alloc_bootmem %lx %lx\n", ret, size);
        }
 
-       return ret;
+       return (void *)ret;
 }
 
 void __init do_init_bootmem(void)
 {
        int nid;
-       int addr_cells, size_cells;
-       struct device_node *memory = NULL;
+       unsigned int i;
        static struct notifier_block ppc64_numa_nb = {
                .notifier_call = cpu_numa_callback,
                .priority = 1 /* Must run before sched domains notifier. */
@@ -581,99 +596,66 @@ void __init do_init_bootmem(void)
        register_cpu_notifier(&ppc64_numa_nb);
 
        for_each_online_node(nid) {
-               unsigned long start_paddr, end_paddr;
-               int i;
+               unsigned long start_pfn, end_pfn, pages_present;
                unsigned long bootmem_paddr;
                unsigned long bootmap_pages;
 
-               start_paddr = init_node_data[nid].node_start_pfn * PAGE_SIZE;
-               end_paddr = init_node_data[nid].node_end_pfn * PAGE_SIZE;
+               get_region(nid, &start_pfn, &end_pfn, &pages_present);
 
                /* Allocate the node structure node local if possible */
-               NODE_DATA(nid) = (struct pglist_data *)careful_allocation(nid,
+               NODE_DATA(nid) = careful_allocation(nid,
                                        sizeof(struct pglist_data),
-                                       SMP_CACHE_BYTES, end_paddr);
-               NODE_DATA(nid) = abs_to_virt(NODE_DATA(nid));
+                                       SMP_CACHE_BYTES, end_pfn);
+               NODE_DATA(nid) = __va(NODE_DATA(nid));
                memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
 
                dbg("node %d\n", nid);
                dbg("NODE_DATA() = %p\n", NODE_DATA(nid));
 
                NODE_DATA(nid)->bdata = &plat_node_bdata[nid];
-               NODE_DATA(nid)->node_start_pfn =
-                       init_node_data[nid].node_start_pfn;
-               NODE_DATA(nid)->node_spanned_pages =
-                       end_paddr - start_paddr;
+               NODE_DATA(nid)->node_start_pfn = start_pfn;
+               NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
 
                if (NODE_DATA(nid)->node_spanned_pages == 0)
                        continue;
 
-               dbg("start_paddr = %lx\n", start_paddr);
-               dbg("end_paddr = %lx\n", end_paddr);
+               dbg("start_paddr = %lx\n", start_pfn << PAGE_SHIFT);
+               dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT);
 
-               bootmap_pages = bootmem_bootmap_pages((end_paddr - start_paddr) >> PAGE_SHIFT);
+               bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
+               bootmem_paddr = (unsigned long)careful_allocation(nid,
+                                       bootmap_pages << PAGE_SHIFT,
+                                       PAGE_SIZE, end_pfn);
+               memset(__va(bootmem_paddr), 0, bootmap_pages << PAGE_SHIFT);
 
-               bootmem_paddr = careful_allocation(nid,
-                               bootmap_pages << PAGE_SHIFT,
-                               PAGE_SIZE, end_paddr);
-               memset(abs_to_virt(bootmem_paddr), 0,
-                      bootmap_pages << PAGE_SHIFT);
                dbg("bootmap_paddr = %lx\n", bootmem_paddr);
 
                init_bootmem_node(NODE_DATA(nid), bootmem_paddr >> PAGE_SHIFT,
-                                 start_paddr >> PAGE_SHIFT,
-                                 end_paddr >> PAGE_SHIFT);
+                                 start_pfn, end_pfn);
 
-               /*
-                * We need to do another scan of all memory sections to
-                * associate memory with the correct node.
-                */
-               addr_cells = get_mem_addr_cells();
-               size_cells = get_mem_size_cells();
-               memory = NULL;
-               while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
-                       unsigned long mem_start, mem_size;
-                       int numa_domain, ranges;
-                       unsigned int *memcell_buf;
-                       unsigned int len;
-
-                       memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
-                       if (!memcell_buf || len <= 0)
-                               continue;
+               /* Add free regions on this node */
+               for (i = 0; init_node_data[i].end_pfn; i++) {
+                       unsigned long start, end;
 
-                       ranges = memory->n_addrs;       /* ranges in cell */
-new_range:
-                       mem_start = read_n_cells(addr_cells, &memcell_buf);
-                       mem_size = read_n_cells(size_cells, &memcell_buf);
-                       if (numa_enabled) {
-                               numa_domain = of_node_numa_domain(memory);
-                               if (numa_domain  >= MAX_NUMNODES)
-                                       numa_domain = 0;
-                       } else
-                               numa_domain =  0;
-
-                       if (numa_domain != nid)
+                       if (init_node_data[i].nid != nid)
                                continue;
 
-                       mem_size = numa_enforce_memory_limit(mem_start, mem_size);
-                       if (mem_size) {
-                               dbg("free_bootmem %lx %lx\n", mem_start, mem_size);
-                               free_bootmem_node(NODE_DATA(nid), mem_start, mem_size);
-                       }
+                       start = init_node_data[i].start_pfn << PAGE_SHIFT;
+                       end = init_node_data[i].end_pfn << PAGE_SHIFT;
 
-                       if (--ranges)           /* process all ranges in cell */
-                               goto new_range;
+                       dbg("free_bootmem %lx %lx\n", start, end - start);
+                       free_bootmem_node(NODE_DATA(nid), start, end - start);
                }
 
-               /*
-                * Mark reserved regions on this node
-                */
+               /* Mark reserved regions on this node */
                for (i = 0; i < lmb.reserved.cnt; i++) {
                        unsigned long physbase = lmb.reserved.region[i].base;
                        unsigned long size = lmb.reserved.region[i].size;
+                       unsigned long start_paddr = start_pfn << PAGE_SHIFT;
+                       unsigned long end_paddr = end_pfn << PAGE_SHIFT;
 
-                       if (pa_to_nid(physbase) != nid &&
-                           pa_to_nid(physbase+size-1) != nid)
+                       if (early_pfn_to_nid(physbase >> PAGE_SHIFT) != nid &&
+                           early_pfn_to_nid((physbase+size-1) >> PAGE_SHIFT) != nid)
                                continue;
 
                        if (physbase < end_paddr &&
@@ -693,46 +675,19 @@ new_range:
                                                     size);
                        }
                }
-               /*
-                * This loop may look famaliar, but we have to do it again
-                * after marking our reserved memory to mark memory present
-                * for sparsemem.
-                */
-               addr_cells = get_mem_addr_cells();
-               size_cells = get_mem_size_cells();
-               memory = NULL;
-               while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
-                       unsigned long mem_start, mem_size;
-                       int numa_domain, ranges;
-                       unsigned int *memcell_buf;
-                       unsigned int len;
-
-                       memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
-                       if (!memcell_buf || len <= 0)
-                               continue;
 
-                       ranges = memory->n_addrs;       /* ranges in cell */
-new_range2:
-                       mem_start = read_n_cells(addr_cells, &memcell_buf);
-                       mem_size = read_n_cells(size_cells, &memcell_buf);
-                       if (numa_enabled) {
-                               numa_domain = of_node_numa_domain(memory);
-                               if (numa_domain  >= MAX_NUMNODES)
-                                       numa_domain = 0;
-                       } else
-                               numa_domain =  0;
-
-                       if (numa_domain != nid)
+               /* Add regions into sparsemem */
+               for (i = 0; init_node_data[i].end_pfn; i++) {
+                       unsigned long start, end;
+
+                       if (init_node_data[i].nid != nid)
                                continue;
 
-                       mem_size = numa_enforce_memory_limit(mem_start, mem_size);
-                       memory_present(numa_domain, mem_start >> PAGE_SHIFT,
-                                      (mem_start + mem_size) >> PAGE_SHIFT);
+                       start = init_node_data[i].start_pfn;
+                       end = init_node_data[i].end_pfn;
 
-                       if (--ranges)           /* process all ranges in cell */
-                               goto new_range2;
+                       memory_present(nid, start, end);
                }
-
        }
 }
 
@@ -746,21 +701,18 @@ void __init paging_init(void)
        memset(zholes_size, 0, sizeof(zholes_size));
 
        for_each_online_node(nid) {
-               unsigned long start_pfn;
-               unsigned long end_pfn;
+               unsigned long start_pfn, end_pfn, pages_present;
 
-               start_pfn = init_node_data[nid].node_start_pfn;
-               end_pfn = init_node_data[nid].node_end_pfn;
+               get_region(nid, &start_pfn, &end_pfn, &pages_present);
 
                zones_size[ZONE_DMA] = end_pfn - start_pfn;
-               zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] -
-                       init_node_data[nid].node_present_pages;
+               zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] - pages_present;
 
                dbg("free_area_init node %d %lx %lx (hole: %lx)\n", nid,
                    zones_size[ZONE_DMA], start_pfn, zholes_size[ZONE_DMA]);
 
-               free_area_init_node(nid, NODE_DATA(nid), zones_size,
-                                                       start_pfn, zholes_size);
+               free_area_init_node(nid, NODE_DATA(nid), zones_size, start_pfn,
+                                   zholes_size);
        }
 }
 
index 86124a94c9afbb8aea10ef6fce4e5e61639d7d25..26539cda602360ed1438b212ff6893e3a33d2818 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 2004 Freescale Semiconductor, Inc
  *
  * Author: Andy Fleming
- * Maintainer: Kumar Gala <Kumar.Gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
index e3a024e324b62f846fb11eb37c2c1059ffc5967c..a3401b46f3bab2f6da3f6aaa701d1a249320ac00 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/system.h>
 #include <asm/processor.h>
 #include <asm/cputable.h>
-#include <asm/systemcfg.h>
 #include <asm/rtas.h>
 #include <asm/oprofile_impl.h>
 #include <asm/reg.h>
index 4099ddab9205ce6b32ed61f47e950a047c5e76b9..dda5f2c72c256f5e73e05de80eb4833bcc4d3f5a 100644 (file)
@@ -257,6 +257,13 @@ void __init chrp_setup_arch(void)
        if (rtas_token("display-character") >= 0)
                ppc_md.progress = rtas_progress;
 
+       /* use RTAS time-of-day routines if available */
+       if (rtas_token("get-time-of-day") != RTAS_UNKNOWN_SERVICE) {
+               ppc_md.get_boot_time    = rtas_get_boot_time;
+               ppc_md.get_rtc_time     = rtas_get_rtc_time;
+               ppc_md.set_rtc_time     = rtas_set_rtc_time;
+       }
+
 #ifdef CONFIG_BOOTX_TEXT
        if (ppc_md.progress == NULL && boot_text_mapped)
                ppc_md.progress = btext_progress;
@@ -505,9 +512,11 @@ void __init chrp_init(void)
        ppc_md.halt           = rtas_halt;
 
        ppc_md.time_init      = chrp_time_init;
+       ppc_md.calibrate_decr = chrp_calibrate_decr;
+
+       /* this may get overridden with rtas routines later... */
        ppc_md.set_rtc_time   = chrp_set_rtc_time;
        ppc_md.get_rtc_time   = chrp_get_rtc_time;
-       ppc_md.calibrate_decr = chrp_calibrate_decr;
 
 #ifdef CONFIG_SMP
        smp_ops = &chrp_smp_ops;
index bb2315997d4560363b2d9bf0a7f8340afb3bd328..b616053bc33119d5a3b6e3523824483f7fe3aea1 100644 (file)
@@ -34,6 +34,7 @@
 #include <asm/machdep.h>
 #include <asm/smp.h>
 #include <asm/mpic.h>
+#include <asm/rtas.h>
 
 static void __devinit smp_chrp_kick_cpu(int nr)
 {
index 9e53535ddb82b580f48d83043f57f8a151a13731..737ee5d9f0aad5cdbbfd4746af9d39aae43aafb4 100644 (file)
@@ -87,7 +87,6 @@ int chrp_set_rtc_time(struct rtc_time *tmarg)
 
        chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
 
-        tm.tm_year -= 1900;
        if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
                BIN_TO_BCD(tm.tm_sec);
                BIN_TO_BCD(tm.tm_min);
@@ -156,7 +155,7 @@ void chrp_get_rtc_time(struct rtc_time *tm)
                BCD_TO_BIN(mon);
                BCD_TO_BIN(year);
        }
-       if ((year += 1900) < 1970)
+       if (year < 70)
                year += 100;
        tm->tm_sec = sec;
        tm->tm_min = min;
index 01090e9ce0cfb74bc30eaa1068d7e0b883883786..a58daa153686db64ca16a9fb4bc6b4f84a19ae7b 100644 (file)
 #include "irq.h"
 #include "call_pci.h"
 
-/* This maps virtual irq numbers to real irqs */
-unsigned int virt_irq_to_real_map[NR_IRQS];
-
-/* The next available virtual irq number */
-/* Note: the pcnet32 driver assumes irq numbers < 2 aren't valid. :( */
-static int next_virtual_irq = 2;
-
 static long Pci_Interrupt_Count;
 static long Pci_Event_Count;
 
@@ -350,26 +343,14 @@ static hw_irq_controller iSeries_IRQ_handler = {
 int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
                HvSubBusNumber subBusNumber, HvAgentId deviceId)
 {
-       unsigned int realirq, virtirq;
+       int virtirq;
+       unsigned int realirq;
        u8 idsel = (deviceId >> 4);
        u8 function = deviceId & 7;
 
-       virtirq = next_virtual_irq++;
        realirq = ((busNumber - 1) << 6) + ((idsel - 1) << 3) + function;
-       virt_irq_to_real_map[virtirq] = realirq;
+       virtirq = virt_irq_create_mapping(realirq);
 
        irq_desc[virtirq].handler = &iSeries_IRQ_handler;
        return virtirq;
 }
-
-int virt_irq_create_mapping(unsigned int real_irq)
-{
-       BUG(); /* Don't call this on iSeries, yet */
-
-       return 0;
-}
-
-void virt_irq_init(void)
-{
-       return;
-}
index 4b75131773a698eef0ec7ff1ab38e5b3b9331b97..dafc518fbb8334ec5db75eb388e34e1c09ca6fcf 100644 (file)
@@ -244,10 +244,9 @@ unsigned long __init find_and_init_phbs(void)
                if (ret == 0) {
                        printk("bus %d appears to exist\n", bus);
 
-                       phb = (struct pci_controller *)kmalloc(sizeof(struct pci_controller), GFP_KERNEL);
+                       phb = pcibios_alloc_controller(NULL);
                        if (phb == NULL)
                                return -ENOMEM;
-                       pci_setup_pci_controller(phb);
 
                        phb->pci_mem_offset = phb->local_number = bus;
                        phb->first_busno = bus;
index 6a29f301436b305b8d11d850babc0eefc31952ec..da26639190dbf5807333d184b8ae0a7051d449f1 100644 (file)
@@ -39,7 +39,6 @@
 #include <asm/sections.h>
 #include <asm/iommu.h>
 #include <asm/firmware.h>
-#include <asm/systemcfg.h>
 #include <asm/system.h>
 #include <asm/time.h>
 #include <asm/paca.h>
@@ -548,8 +547,6 @@ static unsigned long __init build_iSeries_Memory_Map(void)
  */
 static void __init iSeries_setup_arch(void)
 {
-       unsigned procIx = get_paca()->lppaca.dyn_hv_phys_proc_index;
-
        if (get_paca()->lppaca.shared_proc) {
                ppc_md.idle_loop = iseries_shared_idle;
                printk(KERN_INFO "Using shared processor idle loop\n");
@@ -565,9 +562,6 @@ static void __init iSeries_setup_arch(void)
                        itVpdAreas.xSlicMaxLogicalProcs);
        printk("Max physical processors = %d\n",
                        itVpdAreas.xSlicMaxPhysicalProcs);
-
-       _systemcfg->processor = xIoHriProcessorVpd[procIx].xPVR;
-       printk("Processor version = %x\n", _systemcfg->processor);
 }
 
 static void iSeries_show_cpuinfo(struct seq_file *m)
index 895aeb3f75d0d73b6ddf94b370eaec93be0be604..f40451da037c00bd5bc6bc066c2dee90fd1212b0 100644 (file)
@@ -326,26 +326,12 @@ static int __init add_bridge(struct device_node *dev)
                dev->full_name);
        }
 
-       hose = alloc_bootmem(sizeof(struct pci_controller));
+       hose = pcibios_alloc_controller(dev);
        if (hose == NULL)
                return -ENOMEM;
-       pci_setup_pci_controller(hose);
-
-       hose->arch_data = dev;
        hose->first_busno = bus_range ? bus_range[0] : 0;
        hose->last_busno = bus_range ? bus_range[1] : 0xff;
 
-       of_prop = alloc_bootmem(sizeof(struct property) +
-                               sizeof(hose->global_number));
-       if (of_prop) {
-               memset(of_prop, 0, sizeof(struct property));
-               of_prop->name = "linux,pci-domain";
-               of_prop->length = sizeof(hose->global_number);
-               of_prop->value = (unsigned char *)&of_prop[1];
-               memcpy(of_prop->value, &hose->global_number, sizeof(hose->global_number));
-               prom_add_property(dev, of_prop);
-       }
-
        disp_name = NULL;
        if (device_is_compatible(dev, "u3-agp")) {
                setup_u3_agp(hose);
index 40fc07a8e6061165bb8a2037009a0065b0595c15..15846cc938acd4a87158a47b19ba547f5af062d5 100644 (file)
@@ -158,6 +158,11 @@ int maple_set_rtc_time(struct rtc_time *tm)
        return 0;
 }
 
+static struct resource rtc_iores = {
+       .name = "rtc",
+       .flags = IORESOURCE_BUSY,
+};
+
 unsigned long __init maple_get_boot_time(void)
 {
        struct rtc_time tm;
@@ -172,7 +177,11 @@ unsigned long __init maple_get_boot_time(void)
                printk(KERN_INFO "Maple: No device node for RTC, assuming "
                       "legacy address (0x%x)\n", maple_rtc_addr);
        }
-       
+
+       rtc_iores.start = maple_rtc_addr;
+       rtc_iores.end = maple_rtc_addr + 7;
+       request_resource(&ioport_resource, &rtc_iores);
+
        maple_get_rtc_time(&tm);
        return mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
                      tm.tm_hour, tm.tm_min, tm.tm_sec);
index 10f1d942c661b9054bca770659527871da2676b0..0d7fa00fcb00cd8d608b5045557a6f6f5128bb72 100644 (file)
@@ -2362,6 +2362,14 @@ static struct pmac_mb_def pmac_mb_defs[] = {
                PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
                PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
        },
+       {       "PowerBook5,8",                 "PowerBook G4 15\"",
+               PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
+               PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
+       },
+       {       "PowerBook5,9",                 "PowerBook G4 17\"",
+               PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
+               PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
+       },
        {       "PowerBook6,1",                 "PowerBook G4 12\"",
                PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
                PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
index dfd41b9781a9a9df37dbeac71d3c8d18e5510404..443be526cde7ec90a3b0b2e2f18f965613cd3581 100644 (file)
@@ -640,15 +640,16 @@ static void __init setup_u3_ht(struct pci_controller* hose)
         * the reg address cell, we shall fix that by killing struct
         * reg_property and using some accessor functions instead
         */
-       hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000, 0x02000000);
+       hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000,
+                                                          0x02000000);
 
        /*
-        * /ht node doesn't expose a "ranges" property, so we "remove" regions that
-        * have been allocated to AGP. So far, this version of the code doesn't assign
-        * any of the 0xfxxxxxxx "fine" memory regions to /ht.
-        * We need to fix that sooner or later by either parsing all child "ranges"
-        * properties or figuring out the U3 address space decoding logic and
-        * then read its configuration register (if any).
+        * /ht node doesn't expose a "ranges" property, so we "remove"
+        * regions that have been allocated to AGP. So far, this version of
+        * the code doesn't assign any of the 0xfxxxxxxx "fine" memory regions
+        * to /ht. We need to fix that sooner or later by either parsing all
+        * child "ranges" properties or figuring out the U3 address space
+        * decoding logic and then read its configuration register (if any).
         */
        hose->io_base_phys = 0xf4000000;
        hose->pci_io_size = 0x00400000;
@@ -671,10 +672,10 @@ static void __init setup_u3_ht(struct pci_controller* hose)
                return;
        }
 
-       /* We "remove" the AGP resources from the resources allocated to HT, that
-        * is we create "holes". However, that code does assumptions that so far
-        * happen to be true (cross fingers...), typically that resources in the
-        * AGP node are properly ordered
+       /* We "remove" the AGP resources from the resources allocated to HT,
+        * that is we create "holes". However, that code does assumptions
+        * that so far happen to be true (cross fingers...), typically that
+        * resources in the AGP node are properly ordered
         */
        cur = 0;
        for (i=0; i<3; i++) {
@@ -684,23 +685,30 @@ static void __init setup_u3_ht(struct pci_controller* hose)
                /* We don't care about "fine" resources */
                if (res->start >= 0xf0000000)
                        continue;
-               /* Check if it's just a matter of "shrinking" us in one direction */
+               /* Check if it's just a matter of "shrinking" us in one
+                * direction
+                */
                if (hose->mem_resources[cur].start == res->start) {
                        DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n",
-                           cur, hose->mem_resources[cur].start, res->end + 1);
+                           cur, hose->mem_resources[cur].start,
+                           res->end + 1);
                        hose->mem_resources[cur].start = res->end + 1;
                        continue;
                }
                if (hose->mem_resources[cur].end == res->end) {
                        DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n",
-                           cur, hose->mem_resources[cur].end, res->start - 1);
+                           cur, hose->mem_resources[cur].end,
+                           res->start - 1);
                        hose->mem_resources[cur].end = res->start - 1;
                        continue;
                }
                /* No, it's not the case, we need a hole */
                if (cur == 2) {
-                       /* not enough resources for a hole, we drop part of the range */
-                       printk(KERN_WARNING "Running out of resources for /ht host !\n");
+                       /* not enough resources for a hole, we drop part
+                        * of the range
+                        */
+                       printk(KERN_WARNING "Running out of resources"
+                              " for /ht host !\n");
                        hose->mem_resources[cur].end = res->start - 1;
                        continue;
                }
@@ -714,17 +722,6 @@ static void __init setup_u3_ht(struct pci_controller* hose)
                hose->mem_resources[cur-1].end = res->start - 1;
        }
 }
-
-/* XXX this needs to be converged between ppc32 and ppc64... */
-static struct pci_controller * __init pcibios_alloc_controller(void)
-{
-       struct pci_controller *hose;
-
-       hose = alloc_bootmem(sizeof(struct pci_controller));
-       if (hose)
-               pci_setup_pci_controller(hose);
-       return hose;
-}
 #endif
 
 /*
@@ -756,11 +753,16 @@ static int __init add_bridge(struct device_node *dev)
 #endif
        bus_range = (int *) get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
-               printk(KERN_WARNING "Can't get bus-range for %s, assume bus 0\n",
-                              dev->full_name);
+               printk(KERN_WARNING "Can't get bus-range for %s, assume"
+                      " bus 0\n", dev->full_name);
        }
 
+       /* XXX Different prototypes, to be merged */
+#ifdef CONFIG_PPC64
+       hose = pcibios_alloc_controller(dev);
+#else
        hose = pcibios_alloc_controller();
+#endif
        if (!hose)
                return -ENOMEM;
        hose->arch_data = dev;
@@ -768,7 +770,7 @@ static int __init add_bridge(struct device_node *dev)
        hose->last_busno = bus_range ? bus_range[1] : 0xff;
 
        disp_name = NULL;
-#ifdef CONFIG_POWER4
+#ifdef CONFIG_PPC64
        if (device_is_compatible(dev, "u3-agp")) {
                setup_u3_agp(hose);
                disp_name = "U3-AGP";
index 5947b21a8588251ec47af261841b7a2c3fe5d033..feb0a94e78192e28010b6635473e45780a0a3862 100644 (file)
@@ -102,7 +102,7 @@ static unsigned long from_rtc_time(struct rtc_time *tm)
 static unsigned long cuda_get_time(void)
 {
        struct adb_request req;
-       unsigned long now;
+       unsigned int now;
 
        if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_GET_TIME) < 0)
                return 0;
@@ -113,7 +113,7 @@ static unsigned long cuda_get_time(void)
                       req.reply_len);
        now = (req.reply[3] << 24) + (req.reply[4] << 16)
                + (req.reply[5] << 8) + req.reply[6];
-       return now - RTC_OFFSET;
+       return ((unsigned long)now) - RTC_OFFSET;
 }
 
 #define cuda_get_rtc_time(tm)  to_rtc_time(cuda_get_time(), (tm))
@@ -146,7 +146,7 @@ static int cuda_set_rtc_time(struct rtc_time *tm)
 static unsigned long pmu_get_time(void)
 {
        struct adb_request req;
-       unsigned long now;
+       unsigned int now;
 
        if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0)
                return 0;
@@ -156,7 +156,7 @@ static unsigned long pmu_get_time(void)
                       req.reply_len);
        now = (req.reply[0] << 24) + (req.reply[1] << 16)
                + (req.reply[2] << 8) + req.reply[3];
-       return now - RTC_OFFSET;
+       return ((unsigned long)now) - RTC_OFFSET;
 }
 
 #define pmu_get_rtc_time(tm)   to_rtc_time(pmu_get_time(), (tm))
@@ -199,6 +199,7 @@ static unsigned long smu_get_time(void)
 #define smu_set_rtc_time(tm, spin)     0
 #endif
 
+/* Can't be __init, it's called when suspending and resuming */
 unsigned long pmac_get_boot_time(void)
 {
        /* Get the time from the RTC, used only at boot time */
index e7ca5b1f591e2977dd5d2162747086400b82a4f1..06d5ef501218c8d5f1a638a0906d859a5cc083f8 100644 (file)
@@ -4,4 +4,7 @@ obj-$(CONFIG_SMP)       += smp.o
 obj-$(CONFIG_IBMVIO)   += vio.o
 obj-$(CONFIG_XICS)     += xics.o
 obj-$(CONFIG_SCANLOG)  += scanlog.o
-obj-$(CONFIG_EEH)    += eeh.o eeh_event.o
+obj-$(CONFIG_EEH)      += eeh.o eeh_event.o
+
+obj-$(CONFIG_HVC_CONSOLE)      += hvconsole.o
+obj-$(CONFIG_HVCS)             += hvcserver.o
index 79de2310e70b86eb050eae59e45e3a10dd933337..c8d2a40dc5b48ceb6038b3f9fcbc8bc036850efa 100644 (file)
@@ -86,7 +86,8 @@ static int ibm_read_slot_reset_state;
 static int ibm_read_slot_reset_state2;
 static int ibm_slot_error_detail;
 
-static int eeh_subsystem_enabled;
+int eeh_subsystem_enabled;
+EXPORT_SYMBOL(eeh_subsystem_enabled);
 
 /* Lock to avoid races due to multiple reports of an error */
 static DEFINE_SPINLOCK(confirm_error_lock);
index 00cf331a1dc4dd1c53de8e72c044611f5b8a1ee2..a6f628d4c9dc59130e2c226b7abf6348fa9764d0 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/prom.h>
 #include <asm/nvram.h>
 #include <asm/atomic.h>
-#include <asm/systemcfg.h>
 
 #if 0
 #define DEBUG(A...)    printk(KERN_ERR A)
index e94247c28d422a321def8829c0ca3db2daa8429e..4a465f067ede53b64481574092f8bc7fe4c4735c 100644 (file)
@@ -200,14 +200,12 @@ static void __init pSeries_setup_arch(void)
        if (ppc64_interrupt_controller == IC_OPEN_PIC) {
                ppc_md.init_IRQ       = pSeries_init_mpic;
                ppc_md.get_irq        = mpic_get_irq;
-               ppc_md.cpu_irq_down   = mpic_teardown_this_cpu;
                /* Allocate the mpic now, so that find_and_init_phbs() can
                 * fill the ISUs */
                pSeries_setup_mpic();
        } else {
                ppc_md.init_IRQ       = xics_init_IRQ;
                ppc_md.get_irq        = xics_get_irq;
-               ppc_md.cpu_irq_down   = xics_teardown_cpu;
        }
 
 #ifdef CONFIG_SMP
@@ -306,9 +304,7 @@ static void __init fw_feature_init(void)
        }
 
        of_node_put(dn);
- no_rtas:
-       printk(KERN_INFO "firmware_features = 0x%lx\n", 
-              ppc64_firmware_features);
+no_rtas:
 
        DBG(" <- fw_feature_init()\n");
 }
@@ -508,7 +504,7 @@ static void pseries_dedicated_idle(void)
                lpaca->lppaca.idle = 1;
 
                if (!need_resched()) {
-                       start_snooze = __get_tb() +
+                       start_snooze = get_tb() +
                                *smt_snooze_delay * tb_ticks_per_usec;
 
                        while (!need_resched() && !cpu_is_offline(cpu)) {
@@ -522,7 +518,7 @@ static void pseries_dedicated_idle(void)
                                HMT_very_low();
 
                                if (*smt_snooze_delay != 0 &&
-                                   __get_tb() > start_snooze) {
+                                   get_tb() > start_snooze) {
                                        HMT_medium();
                                        dedicated_idle_sleep(cpu);
                                }
@@ -597,6 +593,27 @@ static int pSeries_pci_probe_mode(struct pci_bus *bus)
        return PCI_PROBE_NORMAL;
 }
 
+#ifdef CONFIG_KEXEC
+static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
+{
+       /* Don't risk a hypervisor call if we're crashing */
+       if (!crash_shutdown) {
+               unsigned long vpa = __pa(&get_paca()->lppaca);
+
+               if (unregister_vpa(hard_smp_processor_id(), vpa)) {
+                       printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
+                                       "failed\n", smp_processor_id(),
+                                       hard_smp_processor_id());
+               }
+       }
+
+       if (ppc64_interrupt_controller == IC_OPEN_PIC)
+               mpic_teardown_this_cpu(secondary);
+       else
+               xics_teardown_cpu(secondary);
+}
+#endif
+
 struct machdep_calls __initdata pSeries_md = {
        .probe                  = pSeries_probe,
        .setup_arch             = pSeries_setup_arch,
@@ -619,4 +636,7 @@ struct machdep_calls __initdata pSeries_md = {
        .check_legacy_ioport    = pSeries_check_legacy_ioport,
        .system_reset_exception = pSeries_system_reset_exception,
        .machine_check_exception = pSeries_machine_check_exception,
+#ifdef CONFIG_KEXEC
+       .kexec_cpu_down         = pseries_kexec_cpu_down,
+#endif
 };
index 3ba794ca3288c72fbed747cf1f254fdd5c8ed59a..25181c594d737f128c0f8676a30dad24a328108c 100644 (file)
 #include <asm/rtas.h>
 #include <asm/pSeries_reconfig.h>
 #include <asm/mpic.h>
-#include <asm/systemcfg.h>
+#include <asm/vdso_datapage.h>
 
 #include "plpar_wrappers.h"
 
 #ifdef DEBUG
+#include <asm/udbg.h>
 #define DBG(fmt...) udbg_printf(fmt)
 #else
 #define DBG(fmt...)
@@ -97,7 +98,7 @@ int pSeries_cpu_disable(void)
        int cpu = smp_processor_id();
 
        cpu_clear(cpu, cpu_online_map);
-       _systemcfg->processorCount--;
+       vdso_data->processorCount--;
 
        /*fix boot_cpuid here*/
        if (cpu == boot_cpuid)
index cfcb2a56d6625d9c9c24edb94cc6aa63504874c1..c45a6ad5f3b75d55dfe0d44a78b5dd255bb7ffde 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/cpumask.h>
 #include <linux/module.h>
 #include <linux/sysrq.h>
+#include <linux/interrupt.h>
 
 #include <asm/ptrace.h>
 #include <asm/string.h>
@@ -1467,17 +1468,23 @@ read_spr(int n)
 {
        unsigned int instrs[2];
        unsigned long (*code)(void);
-       unsigned long opd[3];
        unsigned long ret = -1UL;
+#ifdef CONFIG_PPC64
+       unsigned long opd[3];
 
-       instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
-       instrs[1] = 0x4e800020;
        opd[0] = (unsigned long)instrs;
        opd[1] = 0;
        opd[2] = 0;
+       code = (unsigned long (*)(void)) opd;
+#else
+       code = (unsigned long (*)(void)) instrs;
+#endif
+
+       /* mfspr r3,n; blr */
+       instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
+       instrs[1] = 0x4e800020;
        store_inst(instrs);
        store_inst(instrs+1);
-       code = (unsigned long (*)(void)) opd;
 
        if (setjmp(bus_error_jmp) == 0) {
                catch_memory_errors = 1;
@@ -1499,16 +1506,21 @@ write_spr(int n, unsigned long val)
 {
        unsigned int instrs[2];
        unsigned long (*code)(unsigned long);
+#ifdef CONFIG_PPC64
        unsigned long opd[3];
 
-       instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
-       instrs[1] = 0x4e800020;
        opd[0] = (unsigned long)instrs;
        opd[1] = 0;
        opd[2] = 0;
+       code = (unsigned long (*)(unsigned long)) opd;
+#else
+       code = (unsigned long (*)(unsigned long)) instrs;
+#endif
+
+       instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
+       instrs[1] = 0x4e800020;
        store_inst(instrs);
        store_inst(instrs+1);
-       code = (unsigned long (*)(unsigned long)) opd;
 
        if (setjmp(bus_error_jmp) == 0) {
                catch_memory_errors = 1;
index 17a4da65e275f99930ca6664a89ab28424f919cd..0bb23fce42935e6e51e826cdfd991449b3cdadfa 100644 (file)
@@ -13,7 +13,7 @@ extra-$(CONFIG_POWER4)                += idle_power4.o
 extra-y                                += vmlinux.lds
 
 obj-y                          := entry.o traps.o idle.o time.o misc.o \
-                                       process.o align.o \
+                                       process.o \
                                        setup.o \
                                        ppc_htab.o
 obj-$(CONFIG_6xx)              += l2cr.o cpu_setup_6xx.o
@@ -38,7 +38,7 @@ endif
 # These are here while we do the architecture merge
 
 else
-obj-y                          := idle.o align.o
+obj-y                          := idle.o
 obj-$(CONFIG_6xx)              += l2cr.o cpu_setup_6xx.o
 obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o
 obj-$(CONFIG_MODULES)          += module.o
diff --git a/arch/ppc/kernel/align.c b/arch/ppc/kernel/align.c
deleted file mode 100644 (file)
index ab398c4..0000000
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * align.c - handle alignment exceptions for the Power PC.
- *
- * Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
- * Copyright (c) 1998-1999 TiVo, Inc.
- *   PowerPC 403GCX modifications.
- * Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
- *   PowerPC 403GCX/405GP modifications.
- */
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <asm/ptrace.h>
-#include <asm/processor.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/cache.h>
-
-struct aligninfo {
-       unsigned char len;
-       unsigned char flags;
-};
-
-#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
-#define        OPCD(inst)      (((inst) & 0xFC000000) >> 26)
-#define        RS(inst)        (((inst) & 0x03E00000) >> 21)
-#define        RA(inst)        (((inst) & 0x001F0000) >> 16)
-#define        IS_XFORM(code)  ((code) == 31)
-#endif
-
-#define INVALID        { 0, 0 }
-
-#define LD     1       /* load */
-#define ST     2       /* store */
-#define        SE      4       /* sign-extend value */
-#define F      8       /* to/from fp regs */
-#define U      0x10    /* update index register */
-#define M      0x20    /* multiple load/store */
-#define S      0x40    /* single-precision fp, or byte-swap value */
-#define SX     0x40    /* byte count in XER */
-#define HARD   0x80    /* string, stwcx. */
-
-#define DCBZ   0x5f    /* 8xx/82xx dcbz faults when cache not enabled */
-
-/*
- * The PowerPC stores certain bits of the instruction that caused the
- * alignment exception in the DSISR register.  This array maps those
- * bits to information about the operand length and what the
- * instruction would do.
- */
-static struct aligninfo aligninfo[128] = {
-       { 4, LD },              /* 00 0 0000: lwz / lwarx */
-       INVALID,                /* 00 0 0001 */
-       { 4, ST },              /* 00 0 0010: stw */
-       INVALID,                /* 00 0 0011 */
-       { 2, LD },              /* 00 0 0100: lhz */
-       { 2, LD+SE },           /* 00 0 0101: lha */
-       { 2, ST },              /* 00 0 0110: sth */
-       { 4, LD+M },            /* 00 0 0111: lmw */
-       { 4, LD+F+S },          /* 00 0 1000: lfs */
-       { 8, LD+F },            /* 00 0 1001: lfd */
-       { 4, ST+F+S },          /* 00 0 1010: stfs */
-       { 8, ST+F },            /* 00 0 1011: stfd */
-       INVALID,                /* 00 0 1100 */
-       INVALID,                /* 00 0 1101: ld/ldu/lwa */
-       INVALID,                /* 00 0 1110 */
-       INVALID,                /* 00 0 1111: std/stdu */
-       { 4, LD+U },            /* 00 1 0000: lwzu */
-       INVALID,                /* 00 1 0001 */
-       { 4, ST+U },            /* 00 1 0010: stwu */
-       INVALID,                /* 00 1 0011 */
-       { 2, LD+U },            /* 00 1 0100: lhzu */
-       { 2, LD+SE+U },         /* 00 1 0101: lhau */
-       { 2, ST+U },            /* 00 1 0110: sthu */
-       { 4, ST+M },            /* 00 1 0111: stmw */
-       { 4, LD+F+S+U },        /* 00 1 1000: lfsu */
-       { 8, LD+F+U },          /* 00 1 1001: lfdu */
-       { 4, ST+F+S+U },        /* 00 1 1010: stfsu */
-       { 8, ST+F+U },          /* 00 1 1011: stfdu */
-       INVALID,                /* 00 1 1100 */
-       INVALID,                /* 00 1 1101 */
-       INVALID,                /* 00 1 1110 */
-       INVALID,                /* 00 1 1111 */
-       INVALID,                /* 01 0 0000: ldx */
-       INVALID,                /* 01 0 0001 */
-       INVALID,                /* 01 0 0010: stdx */
-       INVALID,                /* 01 0 0011 */
-       INVALID,                /* 01 0 0100 */
-       INVALID,                /* 01 0 0101: lwax */
-       INVALID,                /* 01 0 0110 */
-       INVALID,                /* 01 0 0111 */
-       { 4, LD+M+HARD+SX },    /* 01 0 1000: lswx */
-       { 4, LD+M+HARD },       /* 01 0 1001: lswi */
-       { 4, ST+M+HARD+SX },    /* 01 0 1010: stswx */
-       { 4, ST+M+HARD },       /* 01 0 1011: stswi */
-       INVALID,                /* 01 0 1100 */
-       INVALID,                /* 01 0 1101 */
-       INVALID,                /* 01 0 1110 */
-       INVALID,                /* 01 0 1111 */
-       INVALID,                /* 01 1 0000: ldux */
-       INVALID,                /* 01 1 0001 */
-       INVALID,                /* 01 1 0010: stdux */
-       INVALID,                /* 01 1 0011 */
-       INVALID,                /* 01 1 0100 */
-       INVALID,                /* 01 1 0101: lwaux */
-       INVALID,                /* 01 1 0110 */
-       INVALID,                /* 01 1 0111 */
-       INVALID,                /* 01 1 1000 */
-       INVALID,                /* 01 1 1001 */
-       INVALID,                /* 01 1 1010 */
-       INVALID,                /* 01 1 1011 */
-       INVALID,                /* 01 1 1100 */
-       INVALID,                /* 01 1 1101 */
-       INVALID,                /* 01 1 1110 */
-       INVALID,                /* 01 1 1111 */
-       INVALID,                /* 10 0 0000 */
-       INVALID,                /* 10 0 0001 */
-       { 0, ST+HARD },         /* 10 0 0010: stwcx. */
-       INVALID,                /* 10 0 0011 */
-       INVALID,                /* 10 0 0100 */
-       INVALID,                /* 10 0 0101 */
-       INVALID,                /* 10 0 0110 */
-       INVALID,                /* 10 0 0111 */
-       { 4, LD+S },            /* 10 0 1000: lwbrx */
-       INVALID,                /* 10 0 1001 */
-       { 4, ST+S },            /* 10 0 1010: stwbrx */
-       INVALID,                /* 10 0 1011 */
-       { 2, LD+S },            /* 10 0 1100: lhbrx */
-       INVALID,                /* 10 0 1101 */
-       { 2, ST+S },            /* 10 0 1110: sthbrx */
-       INVALID,                /* 10 0 1111 */
-       INVALID,                /* 10 1 0000 */
-       INVALID,                /* 10 1 0001 */
-       INVALID,                /* 10 1 0010 */
-       INVALID,                /* 10 1 0011 */
-       INVALID,                /* 10 1 0100 */
-       INVALID,                /* 10 1 0101 */
-       INVALID,                /* 10 1 0110 */
-       INVALID,                /* 10 1 0111 */
-       INVALID,                /* 10 1 1000 */
-       INVALID,                /* 10 1 1001 */
-       INVALID,                /* 10 1 1010 */
-       INVALID,                /* 10 1 1011 */
-       INVALID,                /* 10 1 1100 */
-       INVALID,                /* 10 1 1101 */
-       INVALID,                /* 10 1 1110 */
-       { 0, ST+HARD },         /* 10 1 1111: dcbz */
-       { 4, LD },              /* 11 0 0000: lwzx */
-       INVALID,                /* 11 0 0001 */
-       { 4, ST },              /* 11 0 0010: stwx */
-       INVALID,                /* 11 0 0011 */
-       { 2, LD },              /* 11 0 0100: lhzx */
-       { 2, LD+SE },           /* 11 0 0101: lhax */
-       { 2, ST },              /* 11 0 0110: sthx */
-       INVALID,                /* 11 0 0111 */
-       { 4, LD+F+S },          /* 11 0 1000: lfsx */
-       { 8, LD+F },            /* 11 0 1001: lfdx */
-       { 4, ST+F+S },          /* 11 0 1010: stfsx */
-       { 8, ST+F },            /* 11 0 1011: stfdx */
-       INVALID,                /* 11 0 1100 */
-       INVALID,                /* 11 0 1101: lmd */
-       INVALID,                /* 11 0 1110 */
-       INVALID,                /* 11 0 1111: stmd */
-       { 4, LD+U },            /* 11 1 0000: lwzux */
-       INVALID,                /* 11 1 0001 */
-       { 4, ST+U },            /* 11 1 0010: stwux */
-       INVALID,                /* 11 1 0011 */
-       { 2, LD+U },            /* 11 1 0100: lhzux */
-       { 2, LD+SE+U },         /* 11 1 0101: lhaux */
-       { 2, ST+U },            /* 11 1 0110: sthux */
-       INVALID,                /* 11 1 0111 */
-       { 4, LD+F+S+U },        /* 11 1 1000: lfsux */
-       { 8, LD+F+U },          /* 11 1 1001: lfdux */
-       { 4, ST+F+S+U },        /* 11 1 1010: stfsux */
-       { 8, ST+F+U },          /* 11 1 1011: stfdux */
-       INVALID,                /* 11 1 1100 */
-       INVALID,                /* 11 1 1101 */
-       INVALID,                /* 11 1 1110 */
-       INVALID,                /* 11 1 1111 */
-};
-
-#define SWAP(a, b)     (t = (a), (a) = (b), (b) = t)
-
-int
-fix_alignment(struct pt_regs *regs)
-{
-       int instr, nb, flags;
-#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
-       int opcode, f1, f2, f3;
-#endif
-       int i, t;
-       int reg, areg;
-       int offset, nb0;
-       unsigned char __user *addr;
-       unsigned char *rptr;
-       union {
-               long l;
-               float f;
-               double d;
-               unsigned char v[8];
-       } data;
-
-       CHECK_FULL_REGS(regs);
-
-#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
-       /* The 4xx-family & Book-E processors have no DSISR register,
-        * so we emulate it.
-        * The POWER4 has a DSISR register but doesn't set it on
-        * an alignment fault.  -- paulus
-        */
-
-       if (__get_user(instr, (unsigned int __user *) regs->nip))
-               return 0;
-       opcode = OPCD(instr);
-       reg = RS(instr);
-       areg = RA(instr);
-
-       if (!IS_XFORM(opcode)) {
-               f1 = 0;
-               f2 = (instr & 0x04000000) >> 26;
-               f3 = (instr & 0x78000000) >> 27;
-       } else {
-               f1 = (instr & 0x00000006) >> 1;
-               f2 = (instr & 0x00000040) >> 6;
-               f3 = (instr & 0x00000780) >> 7;
-       }
-
-       instr = ((f1 << 5) | (f2 << 4) | f3);
-#else
-       reg = (regs->dsisr >> 5) & 0x1f;        /* source/dest register */
-       areg = regs->dsisr & 0x1f;              /* register to update */
-       instr = (regs->dsisr >> 10) & 0x7f;
-#endif
-
-       nb = aligninfo[instr].len;
-       if (nb == 0) {
-               long __user *p;
-               int i;
-
-               if (instr != DCBZ)
-                       return 0;       /* too hard or invalid instruction */
-               /*
-                * The dcbz (data cache block zero) instruction
-                * gives an alignment fault if used on non-cacheable
-                * memory.  We handle the fault mainly for the
-                * case when we are running with the cache disabled
-                * for debugging.
-                */
-               p = (long __user *) (regs->dar & -L1_CACHE_BYTES);
-               if (user_mode(regs)
-                   && !access_ok(VERIFY_WRITE, p, L1_CACHE_BYTES))
-                       return -EFAULT;
-               for (i = 0; i < L1_CACHE_BYTES / sizeof(long); ++i)
-                       if (__put_user(0, p+i))
-                               return -EFAULT;
-               return 1;
-       }
-
-       flags = aligninfo[instr].flags;
-       if ((flags & (LD|ST)) == 0)
-               return 0;
-
-       /* For the 4xx-family & Book-E processors, the 'dar' field of the
-        * pt_regs structure is overloaded and is really from the DEAR.
-        */
-
-       addr = (unsigned char __user *)regs->dar;
-
-       if (flags & M) {
-               /* lmw, stmw, lswi/x, stswi/x */
-               nb0 = 0;
-               if (flags & HARD) {
-                       if (flags & SX) {
-                               nb = regs->xer & 127;
-                               if (nb == 0)
-                                       return 1;
-                       } else {
-                               if (__get_user(instr,
-                                           (unsigned int __user *)regs->nip))
-                                       return 0;
-                               nb = (instr >> 11) & 0x1f;
-                               if (nb == 0)
-                                       nb = 32;
-                       }
-                       if (nb + reg * 4 > 128) {
-                               nb0 = nb + reg * 4 - 128;
-                               nb = 128 - reg * 4;
-                       }
-               } else {
-                       /* lwm, stmw */
-                       nb = (32 - reg) * 4;
-               }
-
-               if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
-                       return -EFAULT; /* bad address */
-
-               rptr = (unsigned char *) &regs->gpr[reg];
-               if (flags & LD) {
-                       for (i = 0; i < nb; ++i)
-                               if (__get_user(rptr[i], addr+i))
-                                       return -EFAULT;
-                       if (nb0 > 0) {
-                               rptr = (unsigned char *) &regs->gpr[0];
-                               addr += nb;
-                               for (i = 0; i < nb0; ++i)
-                                       if (__get_user(rptr[i], addr+i))
-                                               return -EFAULT;
-                       }
-                       for (; (i & 3) != 0; ++i)
-                               rptr[i] = 0;
-               } else {
-                       for (i = 0; i < nb; ++i)
-                               if (__put_user(rptr[i], addr+i))
-                                       return -EFAULT;
-                       if (nb0 > 0) {
-                               rptr = (unsigned char *) &regs->gpr[0];
-                               addr += nb;
-                               for (i = 0; i < nb0; ++i)
-                                       if (__put_user(rptr[i], addr+i))
-                                               return -EFAULT;
-                       }
-               }
-               return 1;
-       }
-
-       offset = 0;
-       if (nb < 4) {
-               /* read/write the least significant bits */
-               data.l = 0;
-               offset = 4 - nb;
-       }
-
-       /* Verify the address of the operand */
-       if (user_mode(regs)) {
-               if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb))
-                       return -EFAULT; /* bad address */
-       }
-
-       if (flags & F) {
-               preempt_disable();
-               if (regs->msr & MSR_FP)
-                       giveup_fpu(current);
-               preempt_enable();
-       }
-
-       /* If we read the operand, copy it in, else get register values */
-       if (flags & LD) {
-               for (i = 0; i < nb; ++i)
-                       if (__get_user(data.v[offset+i], addr+i))
-                               return -EFAULT;
-       } else if (flags & F) {
-               data.d = current->thread.fpr[reg];
-       } else {
-               data.l = regs->gpr[reg];
-       }
-
-       switch (flags & ~U) {
-       case LD+SE:     /* sign extend */
-               if (data.v[2] >= 0x80)
-                       data.v[0] = data.v[1] = -1;
-               break;
-
-       case LD+S:      /* byte-swap */
-       case ST+S:
-               if (nb == 2) {
-                       SWAP(data.v[2], data.v[3]);
-               } else {
-                       SWAP(data.v[0], data.v[3]);
-                       SWAP(data.v[1], data.v[2]);
-               }
-               break;
-
-       /* Single-precision FP load and store require conversions... */
-       case LD+F+S:
-#ifdef CONFIG_PPC_FPU
-               preempt_disable();
-               enable_kernel_fp();
-               cvt_fd(&data.f, &data.d, &current->thread);
-               preempt_enable();
-#else
-               return 0;
-#endif
-               break;
-       case ST+F+S:
-#ifdef CONFIG_PPC_FPU
-               preempt_disable();
-               enable_kernel_fp();
-               cvt_df(&data.d, &data.f, &current->thread);
-               preempt_enable();
-#else
-               return 0;
-#endif
-               break;
-       }
-
-       if (flags & ST) {
-               for (i = 0; i < nb; ++i)
-                       if (__put_user(data.v[offset+i], addr+i))
-                               return -EFAULT;
-       } else if (flags & F) {
-               current->thread.fpr[reg] = data.d;
-       } else {
-               regs->gpr[reg] = data.l;
-       }
-
-       if (flags & U)
-               regs->gpr[areg] = regs->dar;
-
-       return 1;
-}
index 968261d6957223a88b3812a414ac0574bb365667..fe0e767fb94ed51f916ce087be3f5efdbd70ea8f 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/processor.h>
 #include <asm/cputable.h>
 #include <asm/thread_info.h>
+#include <asm/vdso_datapage.h>
 
 #define DEFINE(sym, val) \
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
@@ -143,5 +144,32 @@ main(void)
 
        DEFINE(TASK_SIZE, TASK_SIZE);
        DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
+
+       /* datapage offsets for use by vdso */
+       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
+       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
+       DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
+       DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
+       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
+       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
+       DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
+       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
+       DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
+       DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
+       DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
+       DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
+       DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
+       DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
+
+       /* timeval/timezone offsets for use by vdso */
+       DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
+       DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
+
+       /* Other bits used by the vdso */
+       DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
+       DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
+       DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
+       DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
+
        return 0;
 }
index 5063c603fad441e56a92ee9ff3de3a165c11ab4f..8d60fa99fc4b992a402ec73dfa516b139f049d08 100644 (file)
@@ -24,7 +24,7 @@
  *    Copyright 2002-2004 MontaVista Software, Inc.
  *      PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
  *    Copyright 2004 Freescale Semiconductor, Inc
- *      PowerPC e500 modifications, Kumar Gala <kumar.gala@freescale.com>
+ *      PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
  *
  * 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
index e8f4e576750a07aa220d29f7871d33a5c1316ebf..f7fae5f153b2b55a7aff720947f76255bcc69179 100644 (file)
@@ -45,7 +45,6 @@ static void update_bridge_base(struct pci_bus *bus, int i);
 static void pcibios_fixup_resources(struct pci_dev* dev);
 static void fixup_broken_pcnet32(struct pci_dev* dev);
 static int reparent_resources(struct resource *parent, struct resource *res);
-static void fixup_rev1_53c810(struct pci_dev* dev);
 static void fixup_cpc710_pci64(struct pci_dev* dev);
 #ifdef CONFIG_PPC_OF
 static u8* pci_to_OF_bus_map;
@@ -61,20 +60,6 @@ struct pci_controller** hose_tail = &hose_head;
 
 static int pci_bus_count;
 
-static void
-fixup_rev1_53c810(struct pci_dev* dev)
-{
-       /* rev 1 ncr53c810 chips don't set the class at all which means
-        * they don't get their resources remapped. Fix that here.
-        */
-
-       if ((dev->class == PCI_CLASS_NOT_DEFINED)) {
-               printk("NCR 53c810 rev 1 detected, setting PCI class.\n");
-               dev->class = PCI_CLASS_STORAGE_SCSI;
-       }
-}
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR,    PCI_DEVICE_ID_NCR_53C810,       fixup_rev1_53c810);
-
 static void
 fixup_broken_pcnet32(struct pci_dev* dev)
 {
index dc55e1abc45bde685741522caa14f1cfae7cfb5e..0eb0b7085e6a86f9e9b18df12dac6f0ad03d89f0 100644 (file)
@@ -602,7 +602,19 @@ void parse_bootinfo(struct bi_record *rec)
 #endif /* CONFIG_BLK_DEV_INITRD */
 #ifdef CONFIG_PPC_MULTIPLATFORM
                case BI_MACHTYPE:
-                       _machine = data[0];
+                       /* Machine types changed with the merge. Since the
+                        * bootinfo are now deprecated, we can just hard code
+                        * the appropriate conversion here for when we are
+                        * called with yaboot which passes us a machine type
+                        * this way.
+                        */
+                       switch(data[0]) {
+                       case 1: _machine = _MACH_prep; break;
+                       case 2: _machine = _MACH_Pmac; break;
+                       case 4: _machine = _MACH_chrp; break;
+                       default:
+                               _machine = data[0];
+                       }
                        break;
 #endif
                case BI_MEMSIZE:
index af9ca0eb6d55b6aba7fd0903371cbeef313c2199..5d581bb3aa1249fa8826fe16a648f818c3f33cae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Modifications by Kumar Gala (kumar.gala@freescale.com) to support
+ * Modifications by Kumar Gala (galak@kernel.crashing.org) to support
  * E500 Book E processors.
  *
  * Copyright 2004 Freescale Semiconductor, Inc
index 99b48abd32969d8cfb485dc87b105bce9482bfb7..45f0782059f1a4be97451a6abfc2ccfa82443ba2 100644 (file)
@@ -597,21 +597,20 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
 
        if (pfn_valid(pfn)) {
                struct page *page = pfn_to_page(pfn);
-               if (!PageReserved(page)
-                   && !test_bit(PG_arch_1, &page->flags)) {
-                       if (vma->vm_mm == current->active_mm) {
 #ifdef CONFIG_8xx
-                       /* On 8xx, cache control instructions (particularly 
-                        * "dcbst" from flush_dcache_icache) fault as write 
-                        * operation if there is an unpopulated TLB entry 
-                        * for the address in question. To workaround that, 
-                        * we invalidate the TLB here, thus avoiding dcbst 
-                        * misbehaviour.
-                        */
-                               _tlbie(address);
+               /* On 8xx, the TLB handlers work in 2 stages:
+                * First, a zeroed entry is loaded by TLBMiss handler,
+                * which causes the TLBError handler to be triggered.
+                * That means the zeroed TLB has to be invalidated
+                * whenever a page miss occurs.
+                */
+               _tlbie(address);
 #endif
+               if (!PageReserved(page)
+                   && !test_bit(PG_arch_1, &page->flags)) {
+                       if (vma->vm_mm == current->active_mm)
                                __flush_dcache_icache((void *) address);
-                       else
+                       else
                                flush_dcache_icache_page(page);
                        set_bit(PG_arch_1, &page->flags);
                }
index 98edc75f4105b22149a967b3dfd624ffee64e766..04bdc39bf47b473f762ffbfc8d4a3d58c70671d9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC834x SYS board specific routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
@@ -73,12 +73,19 @@ mpc83xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
             *       A      B      C      D
             */
        {
-               {PIRQA, PIRQB,  PIRQC,  PIRQD}, /* idsel 0x11 */
-               {PIRQC, PIRQD,  PIRQA,  PIRQB}, /* idsel 0x12 */
-               {PIRQD, PIRQA,  PIRQB,  PIRQC}  /* idsel 0x13 */
+               {PIRQA, PIRQB, PIRQC, PIRQD},   /* idsel 0x11 */
+               {PIRQC, PIRQD, PIRQA, PIRQB},   /* idsel 0x12 */
+               {PIRQD, PIRQA, PIRQB, PIRQC},   /* idsel 0x13 */
+               {0, 0, 0, 0},
+               {PIRQA, PIRQB, PIRQC, PIRQD},   /* idsel 0x15 */
+               {PIRQD, PIRQA, PIRQB, PIRQC},   /* idsel 0x16 */
+               {PIRQC, PIRQD, PIRQA, PIRQB},   /* idsel 0x17 */
+               {PIRQB, PIRQC, PIRQD, PIRQA},   /* idsel 0x18 */
+               {0, 0, 0, 0},                   /* idsel 0x19 */
+               {0, 0, 0, 0},                   /* idsel 0x20 */
        };
 
-       const long min_idsel = 0x11, max_idsel = 0x13, irqs_per_slot = 4;
+       const long min_idsel = 0x11, max_idsel = 0x20, irqs_per_slot = 4;
        return PCI_IRQ_TABLE_LOOKUP;
 }
 
index 58e44c042535bb6a11d2ab3bb6b1bb559ead4e7b..2e514d316fb85c3f651bd001d95923483390bd8d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC834X SYS common board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor, Inc.
  *
index 7e952c1228cba50c4cd3823e4612f4b0ef7705ca..c5cde97c6ef00b2832a9949c884b977d83578ba7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8540ADS board specific routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 3d05d7c4a938f2a36d54a3f3cd18de77c69ccf17..e48ca3a97397c37fdf80c71af2e3730b28767f76 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8540ADS board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index e0e75568bc579213089e01eb71245588f1fad487..1a8e6c67355d67771651b61e7ec978df38501c15 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8555CDS board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 208433f1e93ae32a1bcf207073374146da8ef6a0..8e39a551709292fd8935d88a9c8591110cb42068 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8560ADS board specific routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 7df885d73e9dc558f5dd4eb4a7843d20ea2794cd..143ae7eefa7c501341c5a3ce1c64ddb9be8ceb25 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8540ADS board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 16ad092d8a06396a4ffed0f44037c5dce99a44ec..17ce48fe3503e8ad4d5c54bd57dba949cdaaf36b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx ADS board common routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 84acf6e8d45ef895e02b02ed753a0514bf91fe8a..198a6a02cde83b8889ad98b639172e51b2a2a21b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85XX ADS common board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
@@ -25,6 +25,8 @@
 #define BCSR_ADDR              ((uint)0xf8000000)
 #define BCSR_SIZE              ((uint)(32 * 1024))
 
+struct seq_file;
+
 extern int mpc85xx_ads_show_cpuinfo(struct seq_file *m);
 extern void mpc85xx_ads_init_IRQ(void) __init;
 extern void mpc85xx_ads_map_io(void) __init;
index a21156967a5e130ea0ca70f76c9503965156edff..d8991b88dc9c531692584548fc601eafe898a7c0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx CDS board specific routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor, Inc
  *
index 12b292c6ae3225bb41eeea720de35a8770bdca0a..5b588cfd0e41bc16c3b102b685d4f11eb852546d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx CDS board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor, Inc
  *
index b4ee1707a836ce81693f4eae22d8bc5efae75a2d..45a5b81b4ed1ae4da5e81fa88fe280ea930b3401 100644 (file)
@@ -3,7 +3,7 @@
  * 
  * Wind River SBC8560 board specific routines
  * 
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  * 
index 7bcc6c35a417eda482c0434332aa82db1084d63d..2f25b51951520ea560f18c5ec74173dc3b1c8c5e 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <linux/config.h>
 #include <linux/init.h>
-#include <linux/seq_file.h>
 #include <asm/ppcboot.h>
 
 #define BOARD_CCSRBAR          ((uint)0xe0000000)
@@ -43,7 +42,6 @@ extern void mpc85xx_setup_hose(void) __init;
 extern void mpc85xx_restart(char *cmd);
 extern void mpc85xx_power_off(void);
 extern void mpc85xx_halt(void);
-extern int mpc85xx_show_cpuinfo(struct seq_file *m);
 extern void mpc85xx_init_IRQ(void) __init;
 extern unsigned long mpc85xx_find_end_of_memory(void) __init;
 extern void mpc85xx_calibrate_decr(void) __init;
index 58884a63ebdbed4983e509ff3d24dec6fe045468..1e69b05931620a2f1420adea43a27cac67644f6b 100644 (file)
@@ -2317,6 +2317,14 @@ static struct pmac_mb_def pmac_mb_defs[] = {
                PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
                PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
        },
+       {       "PowerBook5,8",                 "PowerBook G4 15\"",
+               PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
+               PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
+       },
+       {       "PowerBook5,9",                 "PowerBook G4 17\"",
+               PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
+               PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
+       },
        {       "PowerBook6,1",                 "PowerBook G4 12\"",
                PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
                PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
index 6a1475c1e128ea30e39628c684fbea415963535d..71c9fca1fe9b9d4ce293e2793dcfe0a943cf04be 100644 (file)
@@ -3,7 +3,7 @@
  *
  * PQ2ADS platform support
  *
- * Author: Kumar Gala <kumar.gala@freescale.com>
+ * Author: Kumar Gala <galak@kernel.crashing.org>
  * Derived from: est8260_setup.c by Allen Curtis
  *
  * Copyright 2004 Freescale Semiconductor, Inc.
index c867be6981cb34f615755c888d6212737eb53cbf..29d95d415ceb7f70accd8c8381f9666f748be467 100644 (file)
@@ -37,7 +37,7 @@ static        u_char  irq_to_siureg[] = {
 static u_char  irq_to_siubit[] = {
         0, 15, 14, 13, 12, 11, 10,  9,
         8,  7,  6,  5,  4,  3,  2,  1,
-        2,  1, 15, 14, 13, 12, 11, 10,
+        2,  1,  0, 14, 13, 12, 11, 10,
         9,  8,  7,  6,  5,  4,  3,  0,
        31, 30, 29, 28, 27, 26, 25, 24,
        23, 22, 21, 20, 19, 18, 17, 16,
index 2b56a4fcf373e1e5e7a0aaa2ae03ae0c88f25058..a7ce7da8785c4c2ef256dd8144f9e2aa4cff7126 100644 (file)
@@ -3,7 +3,7 @@
  *
  * IPIC private definitions and structure.
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor, Inc
  *
index f43fbf9a9389c05cbc4e6303c35f7d64a5909ce7..847df4409982af4298af2852920127ab28c2bfee 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC83xx Device descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index da743446789b01882ae9375adc55145538e2b48c..82cf3ab77f4a67b08e2c108bdfd28cf94769287a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC83xx System descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
@@ -69,9 +69,33 @@ struct ppc_sys_spec ppc_sys_specs[] = {
                },
        },
        {
-               .ppc_sys_name   = "8343E",
+               .ppc_sys_name   = "8347E",
                .mask           = 0xFFFF0000,
                .value          = 0x80540000,
+               .num_devices    = 9,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
+                       MPC83xx_IIC2, MPC83xx_DUART, MPC83xx_SEC2,
+                       MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
+               },
+       },
+       {
+               .ppc_sys_name   = "8347",
+               .mask           = 0xFFFF0000,
+               .value          = 0x80550000,
+               .num_devices    = 8,
+               .device_list    = (enum ppc_sys_devices[])
+               {
+                       MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
+                       MPC83xx_IIC2, MPC83xx_DUART,
+                       MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
+               },
+       },
+       {
+               .ppc_sys_name   = "8343E",
+               .mask           = 0xFFFF0000,
+               .value          = 0x80560000,
                .num_devices    = 8,
                .device_list    = (enum ppc_sys_devices[])
                {
@@ -83,7 +107,7 @@ struct ppc_sys_spec ppc_sys_specs[] = {
        {
                .ppc_sys_name   = "8343",
                .mask           = 0xFFFF0000,
-               .value          = 0x80550000,
+               .value          = 0x80570000,
                .num_devices    = 7,
                .device_list    = (enum ppc_sys_devices[])
                {
index 2ede677a0a53c37d24ad208a8a9447f7acb195b7..69949d255658c93b76fb24d3d6e52df6f7479a34 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx Device descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index cb68d8c58348528d98a4414f7d607fe5c4ced4cf..397cfbcce5ea10b88e4834385415809de26b4c0e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx System descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index 2b5f0e70168717ed1ceafd8fee0912d9282d746f..92dc98b36bdeffb3145d4a2057bb0eb975db5235 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8xx Device descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 MontaVista Software, Inc. by Vitaly Bordug<vbordug@ru.mvista.com>
  *
index 3cc27d29e3af64e59fdf3a78d0549dfd6ac78070..d3c61752160398411682e2f0986c9461305ce1b4 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC8xx System descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 MontaVista Software, Inc. by Vitaly Bordug <vbordug@ru.mvista.com>
  *
index 4da168a6ad0310777403b52b35ac3a9068963d97..1b5fe9e398d405b353d68018dbf1641b2ae37e6c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC83XX common board code
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index c766c1a5f786d62fee8413145563cf5634e0627d..a122a7322e5eeda3d5c1457985e3aea0a213b16c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC83XX common board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index da841dacdc135175b92c6ff0d23be212bdf18655..19ad537225e4340c4c49485e082490144ecbd0ac 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx support routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 2c8f304441bfcb943cd6ab4be5f32172d8c7e3b9..94edf32151dda0a80de4193d3a1550d41783562d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx support routines
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index de2f90576577198d6019374173dc5e98192e6b89..1a47ff4b831d3d75e33eca61669c3fe869ea79cd 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85XX common board code
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 6e6cfe162faf9b28bb6bd8fb043bef07ae92abc7..e340b0545fb5e2bbc7842ecba8066c75ccac53bf 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85XX common board definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor Inc.
  *
index 603f0119081602e866d83324acf09f7c7a93808d..c0b93c4191eeac2b73e1803b1646bb61f61e4e3c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * PPC System library functions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  * Copyright 2005 MontaVista, Inc. by Vitaly Bordug <vbordug@ru.mvista.com>
index e960fe9353256b82e611da8226988d679b2ba433..6ff3aab82fc3374c362951b82ab70d36315e3c16 100644 (file)
@@ -3,7 +3,7 @@
  *
  * PQ2 Device descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * This file is licensed under the terms of the GNU General Public License
  * version 2. This program is licensed "as is" without any warranty of any
index 7b6c9ebdb9e3eaac47bda5c78fb46171586210ea..36d6e217994019200f0ccb390a8ac47e88721c6f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * PQ2 System descriptions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * This file is licensed under the terms of the GNU General Public License
  * version 2. This program is licensed "as is" without any warranty of any
index 98612d420346bde2e149e0368aadc84a82a82d40..c80177f8ec04e1f1fa6cc32fed12e90a6c3d26d9 100644 (file)
@@ -184,7 +184,9 @@ xmon_map_scc(void)
                sccc = base + (addr & ~PAGE_MASK);
                sccd = sccc + 0x10;
 
-       } else {
+       }
+#ifdef CONFIG_PPC_CHRP
+       else {
                base = (volatile unsigned char *) isa_io_base;
                if (_machine == _MACH_chrp)
                        base = (volatile unsigned char *)
@@ -200,6 +202,7 @@ xmon_map_scc(void)
                RXRDY = 1;
                DLAB = 0x80;
        }
+#endif /* CONFIG_PPC_CHRP */
 #elif defined(CONFIG_GEMINI)
        /* should already be mapped by the kernel boot */
        sccc = (volatile unsigned char *) 0xffeffb0d;
diff --git a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig
deleted file mode 100644 (file)
index c9d32db..0000000
+++ /dev/null
@@ -1,525 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-
-config 64BIT
-       def_bool y
-
-config MMU
-       bool
-       default y
-
-config PPC_STD_MMU
-       def_bool y
-
-config UID16
-       bool
-
-config RWSEM_GENERIC_SPINLOCK
-       bool
-
-config RWSEM_XCHGADD_ALGORITHM
-       bool
-       default y
-
-config GENERIC_CALIBRATE_DELAY
-       bool
-       default y
-
-config GENERIC_ISA_DMA
-       bool
-       default y
-
-config EARLY_PRINTK
-       bool
-       default y
-
-config COMPAT
-       bool
-       default y
-
-config SCHED_NO_NO_OMIT_FRAME_POINTER
-       bool
-       default y
-
-config ARCH_MAY_HAVE_PC_FDC
-       bool
-       default y
-
-config PPC_STD_MMU
-       bool
-       default y
-
-# We optimistically allocate largepages from the VM, so make the limit
-# large enough (16MB). This badly named config option is actually
-# max order + 1
-config FORCE_MAX_ZONEORDER
-       int
-       default "9" if PPC_64K_PAGES
-       default "13"
-
-source "init/Kconfig"
-
-config SYSVIPC_COMPAT
-       bool
-       depends on COMPAT && SYSVIPC
-       default y
-
-menu "Platform support"
-
-choice
-       prompt "Platform Type"
-       default PPC_MULTIPLATFORM
-
-config PPC_ISERIES
-       bool "IBM Legacy iSeries"
-
-config PPC_MULTIPLATFORM
-       bool "Generic"
-
-endchoice
-
-config PPC_PSERIES
-       depends on PPC_MULTIPLATFORM
-       bool "  IBM pSeries & new iSeries"
-       default y
-
-config PPC_BPA
-       bool "  Broadband Processor Architecture"
-       depends on PPC_MULTIPLATFORM
-
-config PPC_PMAC
-       depends on PPC_MULTIPLATFORM
-       bool "  Apple G5 based machines"
-       default y
-       select U3_DART
-       select GENERIC_TBSYNC
-
-config PPC_MAPLE
-       depends on PPC_MULTIPLATFORM
-       bool "  Maple 970FX Evaluation Board"
-       select U3_DART
-       select MPIC_BROKEN_U3
-       select GENERIC_TBSYNC
-       default n
-       help
-          This option enables support for the Maple 970FX Evaluation Board.
-         For more informations, refer to <http://www.970eval.com>
-
-config PPC
-       bool
-       default y
-
-config PPC64
-       bool
-       default y
-
-config PPC_OF
-       depends on PPC_MULTIPLATFORM
-       bool
-       default y
-
-config XICS
-       depends on PPC_PSERIES
-       bool
-       default y
-
-config MPIC
-       depends on PPC_PSERIES || PPC_PMAC || PPC_MAPLE
-       bool
-       default y
-
-config PPC_I8259
-       depends on PPC_PSERIES
-       bool
-       default y
-
-config BPA_IIC
-       depends on PPC_BPA
-       bool
-       default y
-
-# VMX is pSeries only for now until somebody writes the iSeries
-# exception vectors for it
-config ALTIVEC
-       bool "Support for VMX (Altivec) vector unit"
-       depends on PPC_MULTIPLATFORM
-       default y
-
-config PPC_SPLPAR
-       depends on PPC_PSERIES
-       bool "Support for shared-processor logical partitions"
-       default n
-       help
-         Enabling this option will make the kernel run more efficiently
-         on logically-partitioned pSeries systems which use shared
-         processors, that is, which share physical processors between
-         two or more partitions.
-
-config KEXEC
-       bool "kexec system call (EXPERIMENTAL)"
-       depends on PPC_MULTIPLATFORM && EXPERIMENTAL
-       help
-         kexec is a system call that implements the ability to shutdown your
-         current kernel, and to start another kernel.  It is like a reboot
-         but it is indepedent of the system firmware.  And like a reboot
-         you can start any kernel with it, not just Linux.
-
-         The name comes from the similiarity to the exec system call.
-
-         It is an ongoing process to be certain the hardware in a machine
-         is properly shutdown, so do not be surprised if this code does not
-         initially work for you.  It may help to enable device hotplugging
-         support.  As of this writing the exact hardware interface is
-         strongly in flux, so no good recommendation can be made.
-
-source "drivers/cpufreq/Kconfig"
-
-config CPU_FREQ_PMAC64
-       bool "Support for some Apple G5s"
-       depends on CPU_FREQ && PMAC_SMU && PPC64
-       select CPU_FREQ_TABLE
-       help
-         This adds support for frequency switching on Apple iMac G5,
-         and some of the more recent desktop G5 machines as well.
-
-config IBMVIO
-       depends on PPC_PSERIES || PPC_ISERIES
-       bool
-       default y
-
-config U3_DART
-       bool 
-       depends on PPC_MULTIPLATFORM
-       default n
-
-config MPIC_BROKEN_U3
-       bool
-       depends on PPC_MAPLE
-       default y
-
-config GENERIC_TBSYNC
-       def_bool n
-
-config PPC_PMAC64
-       bool
-       depends on PPC_PMAC
-       default y
-
-config BOOTX_TEXT
-       bool "Support for early boot text console"
-       depends PPC_OF
-       help
-         Say Y here to see progress messages from the boot firmware in text
-         mode. Requires an Open Firmware compatible video card.
-
-config POWER4
-       def_bool y
-
-config PPC_FPU
-       def_bool y
-
-config POWER4_ONLY
-       bool "Optimize for POWER4"
-       default n
-       ---help---
-         Cause the compiler to optimize for POWER4 processors. The resulting
-         binary will not work on POWER3 or RS64 processors when compiled with
-         binutils 2.15 or later.
-
-config IOMMU_VMERGE
-       bool "Enable IOMMU virtual merging (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       default n
-       help
-         Cause IO segments sent to a device for DMA to be merged virtually
-         by the IOMMU when they happen to have been allocated contiguously.
-         This doesn't add pressure to the IOMMU allocator. However, some
-         drivers don't support getting large merged segments coming back
-         from *_map_sg(). Say Y if you know the drivers you are using are
-         properly handling this case.
-
-config SMP
-       bool "Symmetric multi-processing support"
-       ---help---
-         This enables support for systems with more than one CPU. If you have
-         a system with only one CPU, say N. If you have a system with more
-         than one CPU, say Y.
-
-         If you say N here, the kernel will run on single and multiprocessor
-         machines, but will use only one CPU of a multiprocessor machine. If
-         you say Y here, the kernel will run on single-processor machines.
-         On a single-processor machine, the kernel will run faster if you say
-         N here.
-
-         If you don't know what to do here, say Y.
-
-config NR_CPUS
-       int "Maximum number of CPUs (2-128)"
-       range 2 128
-       depends on SMP
-       default "32"
-
-config HMT
-       bool "Hardware multithreading"
-       depends on SMP && PPC_PSERIES && BROKEN
-       help
-         This option enables hardware multithreading on RS64 cpus.
-         pSeries systems p620 and p660 have such a cpu type.
-
-config NUMA
-       bool "NUMA support"
-       default y if SMP && PPC_PSERIES
-
-config ARCH_SELECT_MEMORY_MODEL
-       def_bool y
-
-config ARCH_FLATMEM_ENABLE
-       def_bool y
-       depends on !NUMA
-
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on SMP && PPC_PSERIES
-
-config ARCH_DISCONTIGMEM_DEFAULT
-       def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
-
-config ARCH_SPARSEMEM_ENABLE
-       def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
-
-source "mm/Kconfig"
-
-config HAVE_ARCH_EARLY_PFN_TO_NID
-       def_bool y
-       depends on NEED_MULTIPLE_NODES
-
-config ARCH_MEMORY_PROBE
-       def_bool y
-       depends on MEMORY_HOTPLUG
-
-# Some NUMA nodes have memory ranges that span
-# other nodes.  Even though a pfn is valid and
-# between a node's start and end pfns, it may not
-# reside on that node.
-#
-# This is a relatively temporary hack that should
-# be able to go away when sparsemem is fully in
-# place
-config NODES_SPAN_OTHER_NODES
-       def_bool y
-       depends on NEED_MULTIPLE_NODES
-
-config PPC_64K_PAGES
-       bool "64k page size"
-       help
-         This option changes the kernel logical page size to 64k. On machines
-          without processor support for 64k pages, the kernel will simulate
-          them by loading each individual 4k page on demand transparently,
-          while on hardware with such support, it will be used to map
-          normal application pages.
-
-config SCHED_SMT
-       bool "SMT (Hyperthreading) scheduler support"
-       depends on SMP
-       default off
-       help
-         SMT scheduler support improves the CPU scheduler's decision making
-         when dealing with POWER5 cpus at a cost of slightly increased
-         overhead in some places. If unsure say N here.
-
-source "kernel/Kconfig.preempt"
-source kernel/Kconfig.hz
-
-config EEH
-       bool "PCI Extended Error Handling (EEH)" if EMBEDDED
-       depends on PPC_PSERIES
-       default y if !EMBEDDED
-
-#
-# Use the generic interrupt handling code in kernel/irq/:
-#
-config GENERIC_HARDIRQS
-       bool
-       default y
-
-config PPC_RTAS
-       bool
-       depends on PPC_PSERIES || PPC_BPA
-       default y
-
-config RTAS_ERROR_LOGGING
-       bool
-       depends on PPC_RTAS
-       default y
-
-config RTAS_PROC
-       bool "Proc interface to RTAS"
-       depends on PPC_RTAS
-       default y
-
-config RTAS_FLASH
-       tristate "Firmware flash interface"
-       depends on RTAS_PROC
-
-config SCANLOG
-       tristate "Scanlog dump interface"
-       depends on RTAS_PROC && PPC_PSERIES
-
-config LPARCFG
-       tristate "LPAR Configuration Data"
-       depends on PPC_PSERIES || PPC_ISERIES
-       help
-       Provide system capacity information via human readable
-       <key word>=<value> pairs through a /proc/ppc64/lparcfg interface.
-
-config SECCOMP
-       bool "Enable seccomp to safely compute untrusted bytecode"
-       depends on PROC_FS
-       default y
-       help
-         This kernel feature is useful for number crunching applications
-         that may need to compute untrusted bytecode during their
-         execution. By using pipes or other transports made available to
-         the process as file descriptors supporting the read/write
-         syscalls, it's possible to isolate those applications in
-         their own address space using seccomp. Once seccomp is
-         enabled via /proc/<pid>/seccomp, it cannot be disabled
-         and the task is only allowed to execute a few safe syscalls
-         defined by each seccomp mode.
-
-         If unsure, say Y. Only embedded should say N here.
-
-source "fs/Kconfig.binfmt"
-
-config HOTPLUG_CPU
-       bool "Support for hot-pluggable CPUs"
-       depends on SMP && EXPERIMENTAL && (PPC_PSERIES || PPC_PMAC)
-       select HOTPLUG
-       ---help---
-         Say Y here to be able to turn CPUs off and on.
-
-         Say N if you are unsure.
-
-config PROC_DEVICETREE
-       bool "Support for Open Firmware device tree in /proc"
-       help
-         This option adds a device-tree directory under /proc which contains
-         an image of the device tree that the kernel copies from Open
-         Firmware. If unsure, say Y here.
-
-config CMDLINE_BOOL
-       bool "Default bootloader kernel arguments"
-       depends on !PPC_ISERIES
-
-config CMDLINE
-       string "Initial kernel command string"
-       depends on CMDLINE_BOOL
-       default "console=ttyS0,9600 console=tty0 root=/dev/sda2"
-       help
-         On some platforms, there is currently no way for the boot loader to
-         pass arguments to the kernel. For these platforms, you can supply
-         some command-line options at build time by entering them here.  In
-         most cases you will need to specify the root device here.
-
-endmenu
-
-config ISA_DMA_API
-       bool
-       default y
-
-menu "Bus Options"
-
-config ISA
-       bool
-       help
-         Find out whether you have ISA slots on your motherboard.  ISA is the
-         name of a bus system, i.e. the way the CPU talks to the other stuff
-         inside your box.  If you have an Apple machine, say N here; if you
-         have an IBM RS/6000 or pSeries machine or a PReP machine, say Y.  If
-         you have an embedded board, consult your board documentation.
-
-config SBUS
-       bool
-
-config MCA
-       bool
-
-config EISA
-       bool
-
-config PCI
-       bool "support for PCI devices" if (EMBEDDED && PPC_ISERIES)
-       default y
-       help
-         Find out whether your system includes a PCI bus. PCI is the name of
-         a bus system, i.e. the way the CPU talks to the other stuff inside
-         your box.  If you say Y here, the kernel will include drivers and
-         infrastructure code to support PCI bus devices.
-
-config PCI_DOMAINS
-       bool
-       default PCI
-
-source "drivers/pci/Kconfig"
-
-source "drivers/pcmcia/Kconfig"
-
-source "drivers/pci/hotplug/Kconfig"
-
-endmenu
-
-source "net/Kconfig"
-
-source "drivers/Kconfig"
-
-source "fs/Kconfig"
-
-menu "iSeries device drivers"
-       depends on PPC_ISERIES
-
-config VIOCONS
-       tristate "iSeries Virtual Console Support"
-
-config VIODASD
-       tristate "iSeries Virtual I/O disk support"
-       help
-         If you are running on an iSeries system and you want to use
-         virtual disks created and managed by OS/400, say Y.
-
-config VIOCD
-       tristate "iSeries Virtual I/O CD support"
-       help
-         If you are running Linux on an IBM iSeries system and you want to
-         read a CD drive owned by OS/400, say Y here.
-
-config VIOTAPE
-       tristate "iSeries Virtual Tape Support"
-       help
-         If you are running Linux on an iSeries system and you want Linux
-         to read and/or write a tape drive owned by OS/400, say Y here.
-
-endmenu
-
-config VIOPATH
-       bool
-       depends on VIOCONS || VIODASD || VIOCD || VIOTAPE || VETH
-       default y
-
-source "arch/powerpc/oprofile/Kconfig"
-
-source "arch/ppc64/Kconfig.debug"
-
-source "security/Kconfig"
-
-config KEYS_COMPAT
-       bool
-       depends on COMPAT && KEYS
-       default y
-
-source "crypto/Kconfig"
-
-source "lib/Kconfig"
diff --git a/arch/ppc64/Kconfig.debug b/arch/ppc64/Kconfig.debug
deleted file mode 100644 (file)
index b258c93..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-menu "Kernel hacking"
-
-source "lib/Kconfig.debug"
-
-config DEBUG_STACKOVERFLOW
-       bool "Check for stack overflows"
-       depends on DEBUG_KERNEL
-       help
-         This option will cause messages to be printed if free stack space
-         drops below a certain limit.
-
-config KPROBES
-       bool "Kprobes"
-       depends on DEBUG_KERNEL
-       help
-         Kprobes allows you to trap at almost any kernel address and
-         execute a callback function.  register_kprobe() establishes
-         a probepoint and specifies the callback.  Kprobes is useful
-         for kernel debugging, non-intrusive instrumentation and testing.
-         If in doubt, say "N".
-
-config DEBUG_STACK_USAGE
-       bool "Stack utilization instrumentation"
-       depends on DEBUG_KERNEL
-       help
-         Enables the display of the minimum amount of free stack which each
-         task has ever had available in the sysrq-T and sysrq-P debug output.
-
-         This option will slow down process creation somewhat.
-
-config DEBUGGER
-       bool "Enable debugger hooks"
-       depends on DEBUG_KERNEL
-       help
-         Include in-kernel hooks for kernel debuggers. Unless you are
-         intending to debug the kernel, say N here.
-
-config XMON
-       bool "Include xmon kernel debugger"
-       depends on DEBUGGER && !PPC_ISERIES
-       help
-         Include in-kernel hooks for the xmon kernel monitor/debugger.
-         Unless you are intending to debug the kernel, say N here.
-         Make sure to enable also CONFIG_BOOTX_TEXT on Macs. Otherwise
-         nothing will appear on the screen (xmon writes directly to the
-         framebuffer memory).
-         The cmdline option 'xmon' or 'xmon=early' will drop into xmon very
-         early during boot. 'xmon=on' will just enable the xmon debugger hooks.
-         'xmon=off' will disable the debugger hooks if CONFIG_XMON_DEFAULT is set.
-
-config XMON_DEFAULT
-       bool "Enable xmon by default"
-       depends on XMON
-       help
-         xmon is normally disabled unless booted with 'xmon=on'.
-         Use 'xmon=off' to disable xmon init during runtime.
-
-config IRQSTACKS
-       bool "Use separate kernel stacks when processing interrupts"
-       help
-         If you say Y here the kernel will use separate kernel stacks
-         for handling hard and soft interrupts.  This can help avoid
-         overflowing the process kernel stacks.
-
-endmenu
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile
deleted file mode 100644 (file)
index a55a82d..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies. Remember to do have actions
-# for "archclean" and "archdep" for cleaning up and making dependencies for
-# this architecture
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (C) 1994 by Linus Torvalds
-# Changes for PPC by Gary Thomas
-# Rewritten by Cort Dougan and Paul Mackerras
-# Adjusted for PPC64 by Tom Gall
-#
-
-KERNELLOAD     := 0xc000000000000000
-
-# Set default 32 bits cross compilers for vdso and boot wrapper
-CROSS32_COMPILE ?=
-
-CROSS32CC              := $(CROSS32_COMPILE)gcc
-CROSS32AS              := $(CROSS32_COMPILE)as
-CROSS32LD              := $(CROSS32_COMPILE)ld
-CROSS32OBJCOPY         := $(CROSS32_COMPILE)objcopy
-
-# If we have a biarch compiler, use it for 32 bits cross compile if
-# CROSS32_COMPILE wasn't explicitely defined, and add proper explicit
-# target type to target compilers
-
-HAS_BIARCH      := $(call cc-option-yn, -m64)
-ifeq ($(HAS_BIARCH),y)
-ifeq ($(CROSS32_COMPILE),)
-CROSS32CC      := $(CC) -m32
-CROSS32AS      := $(AS) -a32
-CROSS32LD      := $(LD) -m elf32ppc
-CROSS32OBJCOPY := $(OBJCOPY)
-endif
-override AS    += -a64
-override LD    += -m elf64ppc
-override CC    += -m64
-endif
-
-export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
-
-new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi)
-
-ifeq ($(new_nm),y)
-NM             := $(NM) --synthetic
-
-endif
-
-CHECKFLAGS     += -m64 -D__powerpc__ -D__powerpc64__
-
-LDFLAGS                := -m elf64ppc
-LDFLAGS_vmlinux        := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
-CFLAGS         += -msoft-float -pipe -mminimal-toc -mtraceback=none \
-                  -mcall-aixdesc
-# Temporary hack until we have migrated to asm-powerpc
-CPPFLAGS       += -Iarch/$(ARCH)/include
-
-GCC_VERSION     := $(call cc-version)
-GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;)
-
-ifeq ($(CONFIG_POWER4_ONLY),y)
-ifeq ($(CONFIG_ALTIVEC),y)
-ifeq ($(GCC_BROKEN_VEC),y)
-       CFLAGS += $(call cc-option,-mcpu=970)
-else
-       CFLAGS += $(call cc-option,-mcpu=power4)
-endif
-else
-       CFLAGS += $(call cc-option,-mcpu=power4)
-endif
-else
-       CFLAGS += $(call cc-option,-mtune=power4)
-endif
-
-# No AltiVec instruction when building kernel
-CFLAGS += $(call cc-option, -mno-altivec)
-
-# Enable unit-at-a-time mode when possible. It shrinks the
-# kernel considerably.
-CFLAGS += $(call cc-option,-funit-at-a-time)
-
-head-y := arch/ppc64/kernel/head.o
-head-y += arch/powerpc/kernel/fpu.o
-head-y += arch/powerpc/kernel/entry_64.o
-
-core-y                         += arch/ppc64/kernel/ arch/powerpc/kernel/
-core-y                         += arch/powerpc/mm/
-core-y                         += arch/powerpc/sysdev/
-core-y                         += arch/powerpc/platforms/
-core-y                         += arch/powerpc/lib/
-core-$(CONFIG_XMON)            += arch/powerpc/xmon/
-drivers-$(CONFIG_OPROFILE)     += arch/powerpc/oprofile/
-
-boot := arch/ppc64/boot
-
-boottargets-$(CONFIG_PPC_PSERIES) += zImage zImage.initrd
-boottargets-$(CONFIG_PPC_PMAC) += zImage.vmode zImage.initrd.vmode
-boottargets-$(CONFIG_PPC_MAPLE) += zImage zImage.initrd
-boottargets-$(CONFIG_PPC_ISERIES) += vmlinux.sminitrd vmlinux.initrd vmlinux.sm
-boottargets-$(CONFIG_PPC_BPA) += zImage zImage.initrd
-$(boottargets-y): vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
-
-bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage
-bootimage-$(CONFIG_PPC_PMAC) := vmlinux
-bootimage-$(CONFIG_PPC_MAPLE) := $(boot)/zImage
-bootimage-$(CONFIG_PPC_BPA) := $(boot)/zImage
-bootimage-$(CONFIG_PPC_ISERIES) := vmlinux
-BOOTIMAGE := $(bootimage-y)
-install: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@
-
-defaultimage-$(CONFIG_PPC_PSERIES) := zImage
-defaultimage-$(CONFIG_PPC_PMAC) := zImage.vmode
-defaultimage-$(CONFIG_PPC_MAPLE) := zImage
-defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
-KBUILD_IMAGE := $(defaultimage-y)
-all: $(KBUILD_IMAGE)
-
-archclean:
-       $(Q)$(MAKE) $(clean)=$(boot)
-       # Temporary hack until we have migrated to asm-powerpc
-       $(Q)rm -rf arch/$(ARCH)/include
-
-
-# Temporary hack until we have migrated to asm-powerpc
-include/asm: arch/$(ARCH)/include/asm
-arch/$(ARCH)/include/asm:
-       $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
-       $(Q)ln -fsn $(srctree)/include/asm-powerpc arch/$(ARCH)/include/asm
-
-define archhelp
-  echo  '  zImage.vmode        - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)'
-  echo  '  zImage.initrd.vmode - Compressed kernel image with initrd attached,'
-  echo  '                        sourced from arch/$(ARCH)/boot/ramdisk.image.gz'
-  echo  '                        (arch/$(ARCH)/boot/zImage.initrd.vmode)'
-  echo  '  zImage              - zImage for pSeries machines'
-  echo  '  zImage.initrd       - zImage with initrd for pSeries machines'
-endef
diff --git a/arch/ppc64/configs/bpa_defconfig b/arch/ppc64/configs/bpa_defconfig
deleted file mode 100644 (file)
index 67ffecb..0000000
+++ /dev/null
@@ -1,1024 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:29:10 2005
-#
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_COMPAT=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-# CONFIG_KMOD is not set
-CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Platform support
-#
-# CONFIG_PPC_ISERIES is not set
-CONFIG_PPC_MULTIPLATFORM=y
-# CONFIG_PPC_PSERIES is not set
-CONFIG_PPC_BPA=y
-# CONFIG_PPC_PMAC is not set
-# CONFIG_PPC_MAPLE is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
-CONFIG_PPC_OF=y
-CONFIG_BPA_IIC=y
-CONFIG_ALTIVEC=y
-CONFIG_KEXEC=y
-# CONFIG_U3_DART is not set
-# CONFIG_BOOTX_TEXT is not set
-# CONFIG_POWER4_ONLY is not set
-# CONFIG_IOMMU_VMERGE is not set
-CONFIG_SMP=y
-CONFIG_NR_CPUS=4
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
-CONFIG_SCHED_SMT=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_PPC_RTAS=y
-CONFIG_RTAS_PROC=y
-CONFIG_RTAS_FLASH=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_PROC_DEVICETREE=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus Options
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_LEGACY_PROC=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-CONFIG_INET_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-CONFIG_IPV6=y
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=y
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=y
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-# CONFIG_IP_NF_NETBIOS_NS is not set
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-# CONFIG_IP_NF_PPTP is not set
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_MAC=m
-CONFIG_IP_NF_MATCH_PKTTYPE=m
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH_ESP=m
-CONFIG_IP_NF_MATCH_LENGTH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_TCPMSS=m
-CONFIG_IP_NF_MATCH_HELPER=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_CONNTRACK=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_REALM=m
-CONFIG_IP_NF_MATCH_SCTP=m
-# CONFIG_IP_NF_MATCH_DCCP is not set
-CONFIG_IP_NF_MATCH_COMMENT=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_MATCH_STRING=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_TARGET_NFQUEUE=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_TARGET_NFQUEUE is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-CONFIG_NET_CLS_ROUTE=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=y
-# CONFIG_BLK_DEV_SX8 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=131072
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-CONFIG_IDEDISK_MULTI_MODE=y
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-CONFIG_BLK_DEV_AEC62XX=y
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-CONFIG_BLK_DEV_SIIMAGE=y
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Macintosh device drivers
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=m
-# CONFIG_E1000_NAPI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-CONFIG_SKGE=m
-# CONFIG_SK98LIN is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_BNX2 is not set
-# CONFIG_SPIDER_NET is not set
-# CONFIG_MV643XX_ETH is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_SERIAL_NONSTANDARD=y
-# CONFIG_ROCKETPORT is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_ISI is not set
-# CONFIG_SYNCLINK is not set
-# CONFIG_SYNCLINKMP is not set
-# CONFIG_N_HDLC is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_STALDRV is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-
-#
-# Watchdog Device Drivers
-#
-# CONFIG_SOFT_WATCHDOG is not set
-CONFIG_WATCHDOG_RTAS=y
-
-#
-# PCI-based Watchdog Cards
-#
-# CONFIG_PCIPCWATCHDOG is not set
-# CONFIG_WDTPCI is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_SCx200_ACB is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_RTC8564 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-# CONFIG_USB is not set
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# SN Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-CONFIG_HUGETLBFS=y
-CONFIG_HUGETLB_PAGE=y
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=m
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-# CONFIG_NFSD_V4 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_ACL_SUPPORT=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=m
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=15
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_SPINLOCK_SLEEP=y
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_KPROBES is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-CONFIG_DEBUGGER=y
-# CONFIG_XMON is not set
-# CONFIG_PPCDBG is not set
-CONFIG_IRQSTACKS=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
diff --git a/arch/ppc64/configs/g5_defconfig b/arch/ppc64/configs/g5_defconfig
deleted file mode 100644 (file)
index 6323065..0000000
+++ /dev/null
@@ -1,1392 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:30:23 2005
-#
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_COMPAT=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Platform support
-#
-# CONFIG_PPC_ISERIES is not set
-CONFIG_PPC_MULTIPLATFORM=y
-# CONFIG_PPC_PSERIES is not set
-# CONFIG_PPC_BPA is not set
-CONFIG_PPC_PMAC=y
-# CONFIG_PPC_MAPLE is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
-CONFIG_PPC_OF=y
-CONFIG_MPIC=y
-CONFIG_ALTIVEC=y
-CONFIG_KEXEC=y
-CONFIG_U3_DART=y
-CONFIG_PPC_PMAC64=y
-CONFIG_BOOTX_TEXT=y
-CONFIG_POWER4_ONLY=y
-CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=2
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
-# CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_PROC_DEVICETREE=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus Options
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_LEGACY_PROC=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK_EVENTS=y
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-# CONFIG_IP_NF_NETBIOS_NS is not set
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-# CONFIG_IP_NF_PPTP is not set
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_MAC=m
-CONFIG_IP_NF_MATCH_PKTTYPE=m
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH_ESP=m
-CONFIG_IP_NF_MATCH_LENGTH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_TCPMSS=m
-CONFIG_IP_NF_MATCH_HELPER=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_CONNTRACK=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_REALM=m
-CONFIG_IP_NF_MATCH_SCTP=m
-# CONFIG_IP_NF_MATCH_DCCP is not set
-CONFIG_IP_NF_MATCH_COMMENT=m
-CONFIG_IP_NF_MATCH_CONNMARK=m
-CONFIG_IP_NF_MATCH_CONNBYTES=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_MATCH_STRING=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_TARGET_NFQUEUE=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_TARGET_CONNMARK=m
-CONFIG_IP_NF_TARGET_CLUSTERIP=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-CONFIG_NET_CLS_ROUTE=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=65536
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_CDROM_PKTCDVD_BUFFERS=8
-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-CONFIG_BLK_DEV_IDE_PMAC=y
-CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
-CONFIG_BLK_DEV_IDEDMA_PMAC=y
-# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-# CONFIG_CHR_DEV_OSST is not set
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-CONFIG_SCSI_SATA=y
-# CONFIG_SCSI_SATA_AHCI is not set
-CONFIG_SCSI_SATA_SVW=y
-# CONFIG_SCSI_ATA_PIIX is not set
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-# CONFIG_SCSI_SATA_SX4 is not set
-# CONFIG_SCSI_SATA_SIL is not set
-# CONFIG_SCSI_SATA_SIS is not set
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-CONFIG_SCSI_QLA2XXX=y
-# CONFIG_SCSI_QLA21XX is not set
-# CONFIG_SCSI_QLA22XX is not set
-# CONFIG_SCSI_QLA2300 is not set
-# CONFIG_SCSI_QLA2322 is not set
-# CONFIG_SCSI_QLA6312 is not set
-# CONFIG_SCSI_QLA24XX is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=y
-CONFIG_MD_RAID0=y
-CONFIG_MD_RAID1=y
-CONFIG_MD_RAID10=m
-CONFIG_MD_RAID5=y
-CONFIG_MD_RAID6=m
-CONFIG_MD_MULTIPATH=m
-CONFIG_MD_FAULTY=m
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-# CONFIG_DM_MULTIPATH is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SPI is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-CONFIG_IEEE1394=y
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-CONFIG_IEEE1394_OUI_DB=y
-CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y
-CONFIG_IEEE1394_CONFIG_ROM_IP1394=y
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
-
-#
-# Device Drivers
-#
-# CONFIG_IEEE1394_PCILYNX is not set
-CONFIG_IEEE1394_OHCI1394=y
-
-#
-# Protocol Drivers
-#
-CONFIG_IEEE1394_VIDEO1394=m
-CONFIG_IEEE1394_SBP2=m
-# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
-CONFIG_IEEE1394_ETH1394=m
-CONFIG_IEEE1394_DV1394=m
-CONFIG_IEEE1394_RAWIO=y
-# CONFIG_IEEE1394_CMP is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Macintosh device drivers
-#
-CONFIG_ADB_PMU=y
-CONFIG_PMAC_SMU=y
-CONFIG_THERM_PM72=y
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-CONFIG_SUNGEM=y
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=y
-CONFIG_ACENIC_OMIT_TIGON_I=y
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SK98LIN is not set
-CONFIG_TIGON3=m
-# CONFIG_BNX2 is not set
-# CONFIG_MV643XX_ETH is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-
-#
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=y
-# CONFIG_3C359 is not set
-# CONFIG_TMS380TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=m
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-# CONFIG_MOUSE_PS2 is not set
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_PMACZILOG is not set
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=m
-CONFIG_AGP_UNINORTH=m
-# CONFIG_DRM is not set
-CONFIG_RAW_DRIVER=y
-CONFIG_MAX_RAW_DEVS=256
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-CONFIG_I2C_KEYWEST=y
-CONFIG_I2C_PMAC_SMU=y
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_SCx200_ACB is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_RTC8564 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
-CONFIG_FB_MACMODES=y
-CONFIG_FB_MODE_HELPERS=y
-CONFIG_FB_TILEBLITTING=y
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-CONFIG_FB_OF=y
-# CONFIG_FB_CONTROL is not set
-# CONFIG_FB_PLATINUM is not set
-# CONFIG_FB_VALKYRIE is not set
-# CONFIG_FB_CT65550 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_NVIDIA is not set
-CONFIG_FB_RIVA=y
-# CONFIG_FB_RIVA_I2C is not set
-# CONFIG_FB_RIVA_DEBUG is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON_OLD is not set
-CONFIG_FB_RADEON=y
-CONFIG_FB_RADEON_I2C=y
-# CONFIG_FB_RADEON_DEBUG is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_CYBLA is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-CONFIG_LOGO_LINUX_CLUT224=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=m
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_UHCI_HCD is not set
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_BLUETOOTH_TTY is not set
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-CONFIG_USB_STORAGE_FREECOM=y
-CONFIG_USB_STORAGE_ISD200=y
-CONFIG_USB_STORAGE_DPCM=y
-# CONFIG_USB_STORAGE_USBAT is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_JUMPSHOT=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-CONFIG_HID_FF=y
-CONFIG_HID_PID=y
-CONFIG_LOGITECH_FF=y
-CONFIG_THRUSTMASTER_FF=y
-CONFIG_USB_HIDDEV=y
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_MTOUCH is not set
-# CONFIG_USB_ITMTOUCH is not set
-# CONFIG_USB_EGALAX is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Multimedia devices
-#
-# CONFIG_USB_DABUSB is not set
-
-#
-# Video4Linux support is needed for USB Multimedia device support
-#
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-# CONFIG_USB_NET_AX8817X is not set
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-CONFIG_USB_SERIAL=m
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-CONFIG_USB_SERIAL_VISOR=m
-CONFIG_USB_SERIAL_IPAQ=m
-CONFIG_USB_SERIAL_IR=m
-CONFIG_USB_SERIAL_EDGEPORT=m
-CONFIG_USB_SERIAL_EDGEPORT_TI=m
-CONFIG_USB_SERIAL_GARMIN=m
-CONFIG_USB_SERIAL_IPW=m
-CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-CONFIG_USB_SERIAL_KEYSPAN=m
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# SN Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_EXPORT=y
-# CONFIG_XFS_QUOTA is not set
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-# CONFIG_XFS_RT is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-CONFIG_HUGETLBFS=y
-CONFIG_HUGETLB_PAGE=y
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-CONFIG_HFS_FS=m
-CONFIG_HFSPLUS_FS=m
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_ACL_SUPPORT=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_MAC_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-CONFIG_NLS_CODEPAGE_1250=y
-CONFIG_NLS_CODEPAGE_1251=y
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-CONFIG_NLS_ISO8859_15=y
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-CONFIG_NLS_UTF8=y
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_KPROBES is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUGGER is not set
-# CONFIG_PPCDBG is not set
-CONFIG_IRQSTACKS=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=y
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
diff --git a/arch/ppc64/configs/iSeries_defconfig b/arch/ppc64/configs/iSeries_defconfig
deleted file mode 100644 (file)
index 62e92c7..0000000
+++ /dev/null
@@ -1,998 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:30:56 2005
-#
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_COMPAT=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Platform support
-#
-CONFIG_PPC_ISERIES=y
-# CONFIG_PPC_MULTIPLATFORM is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
-CONFIG_IBMVIO=y
-# CONFIG_POWER4_ONLY is not set
-CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=32
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
-# CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_LPARCFG=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus Options
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_LEGACY_PROC=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK_EVENTS=y
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-# CONFIG_IP_NF_NETBIOS_NS is not set
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-# CONFIG_IP_NF_PPTP is not set
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_MAC=m
-CONFIG_IP_NF_MATCH_PKTTYPE=m
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH_ESP=m
-CONFIG_IP_NF_MATCH_LENGTH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_TCPMSS=m
-CONFIG_IP_NF_MATCH_HELPER=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_CONNTRACK=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_REALM=m
-CONFIG_IP_NF_MATCH_SCTP=m
-# CONFIG_IP_NF_MATCH_DCCP is not set
-CONFIG_IP_NF_MATCH_COMMENT=m
-CONFIG_IP_NF_MATCH_CONNMARK=m
-CONFIG_IP_NF_MATCH_CONNBYTES=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_MATCH_STRING=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_TARGET_NFQUEUE=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_TARGET_CONNMARK=m
-CONFIG_IP_NF_TARGET_CLUSTERIP=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-CONFIG_NET_CLS_ROUTE=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=m
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=65536
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-# CONFIG_CHR_DEV_OSST is not set
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_IPS is not set
-CONFIG_SCSI_IBMVSCSI=m
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-CONFIG_SCSI_QLA2XXX=y
-# CONFIG_SCSI_QLA21XX is not set
-# CONFIG_SCSI_QLA22XX is not set
-# CONFIG_SCSI_QLA2300 is not set
-# CONFIG_SCSI_QLA2322 is not set
-# CONFIG_SCSI_QLA6312 is not set
-# CONFIG_SCSI_QLA24XX is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=y
-CONFIG_MD_RAID0=y
-CONFIG_MD_RAID1=y
-CONFIG_MD_RAID10=m
-CONFIG_MD_RAID5=y
-CONFIG_MD_RAID6=m
-CONFIG_MD_MULTIPATH=m
-CONFIG_MD_FAULTY=m
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-# CONFIG_DM_MULTIPATH is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SPI is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Macintosh device drivers
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=y
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=m
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=m
-# CONFIG_E1000_NAPI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_BNX2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-
-#
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=y
-# CONFIG_3C359 is not set
-# CONFIG_TMS380TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-CONFIG_ISERIES_VETH=y
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL=y
-CONFIG_NETPOLL_RX=y
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=m
-CONFIG_SERIAL_ICOM=m
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-CONFIG_RAW_DRIVER=y
-CONFIG_MAX_RAW_DEVS=256
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FB is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-# CONFIG_USB is not set
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# SN Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-CONFIG_JFS_SECURITY=y
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_EXPORT=y
-# CONFIG_XFS_QUOTA is not set
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-# CONFIG_XFS_RT is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLBFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_ACL_SUPPORT=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-CONFIG_RPCSEC_GSS_SPKM3=m
-# CONFIG_SMB_FS is not set
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-CONFIG_CIFS_XATTR=y
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# iSeries device drivers
-#
-CONFIG_VIOCONS=y
-CONFIG_VIODASD=y
-CONFIG_VIOCD=m
-CONFIG_VIOTAPE=m
-CONFIG_VIOPATH=y
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
-CONFIG_DEBUG_STACK_USAGE=y
-# CONFIG_DEBUGGER is not set
-# CONFIG_PPCDBG is not set
-CONFIG_IRQSTACKS=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=y
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
diff --git a/arch/ppc64/configs/maple_defconfig b/arch/ppc64/configs/maple_defconfig
deleted file mode 100644 (file)
index 7b480f3..0000000
+++ /dev/null
@@ -1,1062 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:31:24 2005
-#
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_COMPAT=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-# CONFIG_HOTPLUG is not set
-CONFIG_KOBJECT_UEVENT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-CONFIG_KALLSYMS_ALL=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Platform support
-#
-# CONFIG_PPC_ISERIES is not set
-CONFIG_PPC_MULTIPLATFORM=y
-# CONFIG_PPC_PSERIES is not set
-# CONFIG_PPC_BPA is not set
-# CONFIG_PPC_PMAC is not set
-CONFIG_PPC_MAPLE=y
-CONFIG_PPC=y
-CONFIG_PPC64=y
-CONFIG_PPC_OF=y
-CONFIG_MPIC=y
-# CONFIG_ALTIVEC is not set
-CONFIG_KEXEC=y
-CONFIG_U3_DART=y
-CONFIG_MPIC_BROKEN_U3=y
-CONFIG_BOOTX_TEXT=y
-CONFIG_POWER4_ONLY=y
-CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=2
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_NUMA is not set
-# CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_PROC_DEVICETREE=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus Options
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_LEGACY_PROC=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=8192
-# CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-CONFIG_IDE_TASK_IOCTL=y
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-CONFIG_BLK_DEV_AMD74XX=y
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Macintosh device drivers
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-CONFIG_AMD8111_ETH=y
-# CONFIG_AMD8111E_NAPI is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_E100 is not set
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_BNX2 is not set
-# CONFIG_MV643XX_ETH is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1600
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-CONFIG_I2C_AMD8111=y
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_SCx200_ACB is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_RTC8564 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_SPLIT_ISO=y
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_BLUETOOTH_TTY is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_MTOUCH is not set
-# CONFIG_USB_ITMTOUCH is not set
-# CONFIG_USB_EGALAX is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-
-#
-# USB Multimedia devices
-#
-# CONFIG_USB_DABUSB is not set
-
-#
-# Video4Linux support is needed for USB Multimedia device support
-#
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-CONFIG_USB_PEGASUS=y
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-CONFIG_USB_SERIAL=y
-# CONFIG_USB_SERIAL_CONSOLE is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-CONFIG_USB_SERIAL_GARMIN=m
-CONFIG_USB_SERIAL_IPW=m
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN=y
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_TI=m
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# SN Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_FS_XATTR is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-CONFIG_HUGETLBFS=y
-CONFIG_HUGETLB_PAGE=y
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_ACL_SUPPORT=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_MAC_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="utf-8"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-CONFIG_NLS_UTF8=y
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-CONFIG_DEBUG_SLAB=y
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_SPINLOCK_SLEEP=y
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
-CONFIG_DEBUG_STACK_USAGE=y
-CONFIG_DEBUGGER=y
-CONFIG_XMON=y
-CONFIG_XMON_DEFAULT=y
-# CONFIG_PPCDBG is not set
-# CONFIG_IRQSTACKS is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=y
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=y
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=y
diff --git a/arch/ppc64/configs/pSeries_defconfig b/arch/ppc64/configs/pSeries_defconfig
deleted file mode 100644 (file)
index 9f09dff..0000000
+++ /dev/null
@@ -1,1371 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Thu Oct 20 08:32:17 2005
-#
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_COMPAT=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_FORCE_MAX_ZONEORDER=13
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_CPUSETS=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-CONFIG_KALLSYMS_ALL=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Platform support
-#
-# CONFIG_PPC_ISERIES is not set
-CONFIG_PPC_MULTIPLATFORM=y
-CONFIG_PPC_PSERIES=y
-# CONFIG_PPC_BPA is not set
-# CONFIG_PPC_PMAC is not set
-# CONFIG_PPC_MAPLE is not set
-CONFIG_PPC=y
-CONFIG_PPC64=y
-CONFIG_PPC_OF=y
-CONFIG_XICS=y
-CONFIG_MPIC=y
-CONFIG_ALTIVEC=y
-CONFIG_PPC_SPLPAR=y
-CONFIG_KEXEC=y
-CONFIG_IBMVIO=y
-# CONFIG_U3_DART is not set
-# CONFIG_BOOTX_TEXT is not set
-# CONFIG_POWER4_ONLY is not set
-CONFIG_IOMMU_VMERGE=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=128
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_FLATMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM_MANUAL=y
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_NEED_MULTIPLE_NODES=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_NODES_SPAN_OTHER_NODES=y
-CONFIG_NUMA=y
-CONFIG_SCHED_SMT=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-CONFIG_EEH=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_PPC_RTAS=y
-CONFIG_RTAS_PROC=y
-CONFIG_RTAS_FLASH=m
-CONFIG_SCANLOG=m
-CONFIG_LPARCFG=y
-CONFIG_SECCOMP=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_HOTPLUG_CPU=y
-CONFIG_PROC_DEVICETREE=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus Options
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_LEGACY_PROC=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=m
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-CONFIG_HOTPLUG_PCI_RPA=m
-CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_NETFILTER_NETLINK=y
-CONFIG_NETFILTER_NETLINK_QUEUE=m
-CONFIG_NETFILTER_NETLINK_LOG=m
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK_EVENTS=y
-CONFIG_IP_NF_CONNTRACK_NETLINK=m
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-# CONFIG_IP_NF_NETBIOS_NS is not set
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-# CONFIG_IP_NF_PPTP is not set
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_MAC=m
-CONFIG_IP_NF_MATCH_PKTTYPE=m
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH_ESP=m
-CONFIG_IP_NF_MATCH_LENGTH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_TCPMSS=m
-CONFIG_IP_NF_MATCH_HELPER=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_CONNTRACK=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_REALM=m
-CONFIG_IP_NF_MATCH_SCTP=m
-# CONFIG_IP_NF_MATCH_DCCP is not set
-CONFIG_IP_NF_MATCH_COMMENT=m
-CONFIG_IP_NF_MATCH_CONNMARK=m
-CONFIG_IP_NF_MATCH_CONNBYTES=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_MATCH_STRING=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_TARGET_NFQUEUE=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_TARGET_CONNMARK=m
-CONFIG_IP_NF_TARGET_CLUSTERIP=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-CONFIG_NET_CLS_ROUTE=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-CONFIG_PARPORT=m
-CONFIG_PARPORT_PC=m
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_1284 is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=m
-# CONFIG_PARIDE is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=65536
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_SL82C105=y
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-CONFIG_BLK_DEV_AMD74XX=y
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-# CONFIG_CHR_DEV_OSST is not set
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
-CONFIG_SCSI_ISCSI_ATTRS=m
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_IPS is not set
-CONFIG_SCSI_IBMVSCSI=y
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_PPA is not set
-# CONFIG_SCSI_IMM is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
-CONFIG_SCSI_IPR=y
-CONFIG_SCSI_IPR_TRACE=y
-CONFIG_SCSI_IPR_DUMP=y
-# CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-CONFIG_SCSI_QLA2XXX=y
-CONFIG_SCSI_QLA21XX=m
-CONFIG_SCSI_QLA22XX=m
-CONFIG_SCSI_QLA2300=m
-CONFIG_SCSI_QLA2322=m
-CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA24XX=m
-CONFIG_SCSI_LPFC=m
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=y
-CONFIG_MD_RAID0=y
-CONFIG_MD_RAID1=y
-CONFIG_MD_RAID10=m
-CONFIG_MD_RAID5=y
-CONFIG_MD_RAID6=m
-CONFIG_MD_MULTIPATH=m
-CONFIG_MD_FAULTY=m
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SPI is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Macintosh device drivers
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=y
-# CONFIG_TYPHOON is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-CONFIG_IBMVETH=y
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=y
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_NET_POCKET is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=y
-CONFIG_ACENIC_OMIT_TIGON_I=y
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-# CONFIG_BNX2 is not set
-# CONFIG_MV643XX_ETH is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-CONFIG_IXGB=m
-# CONFIG_IXGB_NAPI is not set
-CONFIG_S2IO=m
-# CONFIG_S2IO_NAPI is not set
-# CONFIG_2BUFF_MODE is not set
-
-#
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=y
-# CONFIG_3C359 is not set
-# CONFIG_TMS380TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PLIP is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL=y
-CONFIG_NETPOLL_RX=y
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_PCSPKR=m
-# CONFIG_INPUT_UINPUT is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PARKBD is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_ICOM=m
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-# CONFIG_PRINTER is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-CONFIG_HVC_CONSOLE=y
-CONFIG_HVCS=m
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-CONFIG_RAW_DRIVER=y
-CONFIG_MAX_RAW_DEVS=1024
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_PARPORT is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_SCx200_ACB is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_RTC8564 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
-CONFIG_FB_MACMODES=y
-CONFIG_FB_MODE_HELPERS=y
-CONFIG_FB_TILEBLITTING=y
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-CONFIG_FB_OF=y
-# CONFIG_FB_CT65550 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-CONFIG_FB_MATROX=y
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G=y
-# CONFIG_FB_MATROX_I2C is not set
-CONFIG_FB_MATROX_MULTIHEAD=y
-# CONFIG_FB_RADEON_OLD is not set
-CONFIG_FB_RADEON=y
-CONFIG_FB_RADEON_I2C=y
-# CONFIG_FB_RADEON_DEBUG is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_CYBLA is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-CONFIG_LOGO_LINUX_CLUT224=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=m
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_UHCI_HCD is not set
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_BLUETOOTH_TTY is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_HID_FF is not set
-CONFIG_USB_HIDDEV=y
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_MTOUCH is not set
-# CONFIG_USB_ITMTOUCH is not set
-# CONFIG_USB_EGALAX is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Multimedia devices
-#
-# CONFIG_USB_DABUSB is not set
-
-#
-# Video4Linux support is needed for USB Multimedia device support
-#
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# InfiniBand support
-#
-CONFIG_INFINIBAND=m
-# CONFIG_INFINIBAND_USER_MAD is not set
-# CONFIG_INFINIBAND_USER_ACCESS is not set
-CONFIG_INFINIBAND_MTHCA=m
-# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
-CONFIG_INFINIBAND_IPOIB=m
-# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
-
-#
-# SN Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-CONFIG_JFS_SECURITY=y
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_EXPORT=y
-# CONFIG_XFS_QUOTA is not set
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-# CONFIG_XFS_RT is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-CONFIG_HUGETLBFS=y
-CONFIG_HUGETLB_PAGE=y
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_ACL_SUPPORT=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-CONFIG_RPCSEC_GSS_SPKM3=m
-# CONFIG_SMB_FS is not set
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-CONFIG_CIFS_XATTR=y
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_KPROBES is not set
-CONFIG_DEBUG_STACK_USAGE=y
-CONFIG_DEBUGGER=y
-CONFIG_XMON=y
-CONFIG_XMON_DEFAULT=y
-# CONFIG_PPCDBG is not set
-CONFIG_IRQSTACKS=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=y
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
diff --git a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile
deleted file mode 100644 (file)
index 58b19f1..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Makefile for the linux ppc64 kernel.
-#
-
-ifneq ($(CONFIG_PPC_MERGE),y)
-
-EXTRA_CFLAGS   += -mno-minimal-toc
-extra-y                := head.o vmlinux.lds
-
-obj-y               := misc.o prom.o
-
-endif
-
-obj-y               += idle.o dma.o \
-                       align.o \
-                       udbg.o \
-                       rtc.o \
-                       iommu.o vdso.o
-obj-y += vdso32/ vdso64/
-
-pci-obj-$(CONFIG_PPC_MULTIPLATFORM)    += pci_dn.o pci_direct_iommu.o
-
-obj-$(CONFIG_PCI)      += pci.o pci_iommu.o iomap.o $(pci-obj-y)
-
-obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o
-ifneq ($(CONFIG_PPC_MERGE),y)
-obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
-endif
-
-obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
-
-obj-$(CONFIG_KEXEC)            += machine_kexec.o
-obj-$(CONFIG_MODULES)          += module.o
-ifneq ($(CONFIG_PPC_MERGE),y)
-obj-$(CONFIG_MODULES)          += ppc_ksyms.o
-endif
-obj-$(CONFIG_HVC_CONSOLE)      += hvconsole.o
-ifneq ($(CONFIG_PPC_MERGE),y)
-obj-$(CONFIG_BOOTX_TEXT)       += btext.o
-endif
-obj-$(CONFIG_HVCS)             += hvcserver.o
-
-obj-$(CONFIG_PPC_PMAC)         += udbg_scc.o
-
-obj-$(CONFIG_PPC_MAPLE)                += udbg_16550.o
-
-obj-$(CONFIG_KPROBES)          += kprobes.o
-
-ifneq ($(CONFIG_PPC_MERGE),y)
-ifeq ($(CONFIG_PPC_ISERIES),y)
-arch/ppc64/kernel/head.o: arch/powerpc/kernel/lparmap.s
-AFLAGS_head.o += -Iarch/powerpc/kernel
-endif
-endif
diff --git a/arch/ppc64/kernel/asm-offsets.c b/arch/ppc64/kernel/asm-offsets.c
deleted file mode 100644 (file)
index 84ab5c1..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * This program is used to generate definitions needed by
- * assembly language modules.
- *
- * We use the technique used in the OSF Mach kernel code:
- * generate asm statements containing #defines,
- * compile this file to assembler, and then extract the
- * #defines from the assembly-language output.
- *
- * 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/config.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/time.h>
-#include <linux/hardirq.h>
-#include <asm/io.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-
-#include <asm/paca.h>
-#include <asm/lppaca.h>
-#include <asm/iseries/hv_lp_event.h>
-#include <asm/rtas.h>
-#include <asm/cputable.h>
-#include <asm/cache.h>
-#include <asm/systemcfg.h>
-#include <asm/compat.h>
-
-#define DEFINE(sym, val) \
-       asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-int main(void)
-{
-       /* thread struct on stack */
-       DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
-       DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
-       DEFINE(TI_SC_NOERR, offsetof(struct thread_info, syscall_noerror));
-
-       /* task_struct->thread */
-       DEFINE(THREAD, offsetof(struct task_struct, thread));
-       DEFINE(PT_REGS, offsetof(struct thread_struct, regs));
-       DEFINE(THREAD_FPEXC_MODE, offsetof(struct thread_struct, fpexc_mode));
-       DEFINE(THREAD_FPR0, offsetof(struct thread_struct, fpr[0]));
-       DEFINE(THREAD_FPSCR, offsetof(struct thread_struct, fpscr));
-       DEFINE(KSP, offsetof(struct thread_struct, ksp));
-       DEFINE(KSP_VSID, offsetof(struct thread_struct, ksp_vsid));
-
-#ifdef CONFIG_ALTIVEC
-       DEFINE(THREAD_VR0, offsetof(struct thread_struct, vr[0]));
-       DEFINE(THREAD_VRSAVE, offsetof(struct thread_struct, vrsave));
-       DEFINE(THREAD_VSCR, offsetof(struct thread_struct, vscr));
-       DEFINE(THREAD_USED_VR, offsetof(struct thread_struct, used_vr));
-#endif /* CONFIG_ALTIVEC */
-       DEFINE(MM, offsetof(struct task_struct, mm));
-       DEFINE(AUDITCONTEXT, offsetof(struct task_struct, audit_context));
-
-       DEFINE(DCACHEL1LINESIZE, offsetof(struct ppc64_caches, dline_size));
-       DEFINE(DCACHEL1LOGLINESIZE, offsetof(struct ppc64_caches, log_dline_size));
-       DEFINE(DCACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, dlines_per_page));
-       DEFINE(ICACHEL1LINESIZE, offsetof(struct ppc64_caches, iline_size));
-       DEFINE(ICACHEL1LOGLINESIZE, offsetof(struct ppc64_caches, log_iline_size));
-       DEFINE(ICACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, ilines_per_page));
-       DEFINE(PLATFORM_LPAR, PLATFORM_LPAR);
-
-       /* paca */
-        DEFINE(PACA_SIZE, sizeof(struct paca_struct));
-        DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index));
-        DEFINE(PACAPROCSTART, offsetof(struct paca_struct, cpu_start));
-        DEFINE(PACAKSAVE, offsetof(struct paca_struct, kstack));
-       DEFINE(PACACURRENT, offsetof(struct paca_struct, __current));
-        DEFINE(PACASAVEDMSR, offsetof(struct paca_struct, saved_msr));
-        DEFINE(PACASTABREAL, offsetof(struct paca_struct, stab_real));
-        DEFINE(PACASTABVIRT, offsetof(struct paca_struct, stab_addr));
-       DEFINE(PACASTABRR, offsetof(struct paca_struct, stab_rr));
-        DEFINE(PACAR1, offsetof(struct paca_struct, saved_r1));
-       DEFINE(PACATOC, offsetof(struct paca_struct, kernel_toc));
-       DEFINE(PACAPROCENABLED, offsetof(struct paca_struct, proc_enabled));
-       DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache));
-       DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr));
-       DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id));
-#ifdef CONFIG_PPC_64K_PAGES
-       DEFINE(PACAPGDIR, offsetof(struct paca_struct, pgdir));
-#endif
-#ifdef CONFIG_HUGETLB_PAGE
-       DEFINE(PACALOWHTLBAREAS, offsetof(struct paca_struct, context.low_htlb_areas));
-       DEFINE(PACAHIGHHTLBAREAS, offsetof(struct paca_struct, context.high_htlb_areas));
-#endif /* CONFIG_HUGETLB_PAGE */
-       DEFINE(PACADEFAULTDECR, offsetof(struct paca_struct, default_decr));
-        DEFINE(PACA_EXGEN, offsetof(struct paca_struct, exgen));
-        DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc));
-        DEFINE(PACA_EXSLB, offsetof(struct paca_struct, exslb));
-        DEFINE(PACA_EXDSI, offsetof(struct paca_struct, exdsi));
-        DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp));
-       DEFINE(PACALPPACA, offsetof(struct paca_struct, lppaca));
-       DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
-       DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0));
-       DEFINE(LPPACASRR1, offsetof(struct lppaca, saved_srr1));
-       DEFINE(LPPACAANYINT, offsetof(struct lppaca, int_dword.any_int));
-       DEFINE(LPPACADECRINT, offsetof(struct lppaca, int_dword.fields.decr_int));
-
-       /* RTAS */
-       DEFINE(RTASBASE, offsetof(struct rtas_t, base));
-       DEFINE(RTASENTRY, offsetof(struct rtas_t, entry));
-
-       /* Interrupt register frame */
-       DEFINE(STACK_FRAME_OVERHEAD, STACK_FRAME_OVERHEAD);
-
-       DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs));
-
-       /* 288 = # of volatile regs, int & fp, for leaf routines */
-       /* which do not stack a frame.  See the PPC64 ABI.       */
-       DEFINE(INT_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 288);
-       /* Create extra stack space for SRR0 and SRR1 when calling prom/rtas. */
-       DEFINE(PROM_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16);
-       DEFINE(RTAS_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16);
-       DEFINE(GPR0, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[0]));
-       DEFINE(GPR1, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[1]));
-       DEFINE(GPR2, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[2]));
-       DEFINE(GPR3, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[3]));
-       DEFINE(GPR4, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[4]));
-       DEFINE(GPR5, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[5]));
-       DEFINE(GPR6, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[6]));
-       DEFINE(GPR7, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[7]));
-       DEFINE(GPR8, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[8]));
-       DEFINE(GPR9, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[9]));
-       DEFINE(GPR10, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[10]));
-       DEFINE(GPR11, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[11]));
-       DEFINE(GPR12, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[12]));
-       DEFINE(GPR13, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[13]));
-       /*
-        * Note: these symbols include _ because they overlap with special
-        * register names
-        */
-       DEFINE(_NIP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, nip));
-       DEFINE(_MSR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, msr));
-       DEFINE(_CTR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ctr));
-       DEFINE(_LINK, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, link));
-       DEFINE(_CCR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ccr));
-       DEFINE(_XER, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, xer));
-       DEFINE(_DAR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dar));
-       DEFINE(_DSISR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dsisr));
-       DEFINE(ORIG_GPR3, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, orig_gpr3));
-       DEFINE(RESULT, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, result));
-       DEFINE(_TRAP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, trap));
-       DEFINE(SOFTE, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, softe));
-
-       /* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */
-       DEFINE(_SRR0, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs));
-       DEFINE(_SRR1, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)+8);
-
-       DEFINE(CLONE_VM, CLONE_VM);
-       DEFINE(CLONE_UNTRACED, CLONE_UNTRACED);
-
-       /* About the CPU features table */
-       DEFINE(CPU_SPEC_ENTRY_SIZE, sizeof(struct cpu_spec));
-       DEFINE(CPU_SPEC_PVR_MASK, offsetof(struct cpu_spec, pvr_mask));
-       DEFINE(CPU_SPEC_PVR_VALUE, offsetof(struct cpu_spec, pvr_value));
-       DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
-       DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
-
-       /* systemcfg offsets for use by vdso */
-       DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct systemcfg, tb_orig_stamp));
-       DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct systemcfg, tb_ticks_per_sec));
-       DEFINE(CFG_TB_TO_XS, offsetof(struct systemcfg, tb_to_xs));
-       DEFINE(CFG_STAMP_XSEC, offsetof(struct systemcfg, stamp_xsec));
-       DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct systemcfg, tb_update_count));
-       DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct systemcfg, tz_minuteswest));
-       DEFINE(CFG_TZ_DSTTIME, offsetof(struct systemcfg, tz_dsttime));
-       DEFINE(CFG_SYSCALL_MAP32, offsetof(struct systemcfg, syscall_map_32));
-       DEFINE(CFG_SYSCALL_MAP64, offsetof(struct systemcfg, syscall_map_64));
-
-       /* timeval/timezone offsets for use by vdso */
-       DEFINE(TVAL64_TV_SEC, offsetof(struct timeval, tv_sec));
-       DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
-       DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
-       DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec));
-       DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
-       DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
-
-       return 0;
-}
diff --git a/arch/ppc64/kernel/btext.c b/arch/ppc64/kernel/btext.c
deleted file mode 100644 (file)
index 506a378..0000000
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- * Procedures for drawing on the screen early on in the boot process.
- *
- * Benjamin Herrenschmidt <benh@kernel.crashing.org>
- */
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/init.h>
-
-#include <asm/sections.h>
-#include <asm/prom.h>
-#include <asm/btext.h>
-#include <asm/prom.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/pgtable.h>
-#include <asm/io.h>
-#include <asm/lmb.h>
-#include <asm/processor.h>
-#include <asm/udbg.h>
-
-#undef NO_SCROLL
-
-#ifndef NO_SCROLL
-static void scrollscreen(void);
-#endif
-
-static void draw_byte(unsigned char c, long locX, long locY);
-static void draw_byte_32(unsigned char *bits, unsigned int *base, int rb);
-static void draw_byte_16(unsigned char *bits, unsigned int *base, int rb);
-static void draw_byte_8(unsigned char *bits, unsigned int *base, int rb);
-
-static int g_loc_X;
-static int g_loc_Y;
-static int g_max_loc_X;
-static int g_max_loc_Y;
-
-static int dispDeviceRowBytes;
-static int dispDeviceDepth;
-static int dispDeviceRect[4];
-static unsigned char *dispDeviceBase, *logicalDisplayBase;
-
-unsigned long disp_BAT[2] __initdata = {0, 0};
-
-#define cmapsz (16*256)
-
-static unsigned char vga_font[cmapsz];
-
-int boot_text_mapped;
-int force_printk_to_btext = 0;
-
-
-/* Here's a small text engine to use during early boot
- * or for debugging purposes
- *
- * todo:
- *
- *  - build some kind of vgacon with it to enable early printk
- *  - move to a separate file
- *  - add a few video driver hooks to keep in sync with display
- *    changes.
- */
-
-void map_boot_text(void)
-{
-       unsigned long base, offset, size;
-       unsigned char *vbase;
-
-       /* By default, we are no longer mapped */
-       boot_text_mapped = 0;
-       if (dispDeviceBase == 0)
-               return;
-       base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
-       offset = ((unsigned long) dispDeviceBase) - base;
-       size = dispDeviceRowBytes * dispDeviceRect[3] + offset
-               + dispDeviceRect[0];
-       vbase = __ioremap(base, size, _PAGE_NO_CACHE);
-       if (vbase == 0)
-               return;
-       logicalDisplayBase = vbase + offset;
-       boot_text_mapped = 1;
-}
-
-int btext_initialize(struct device_node *np)
-{
-       unsigned int width, height, depth, pitch;
-       unsigned long address = 0;
-       u32 *prop;
-
-       prop = (u32 *)get_property(np, "width", NULL);
-       if (prop == NULL)
-               return -EINVAL;
-       width = *prop;
-       prop = (u32 *)get_property(np, "height", NULL);
-       if (prop == NULL)
-               return -EINVAL;
-       height = *prop;
-       prop = (u32 *)get_property(np, "depth", NULL);
-       if (prop == NULL)
-               return -EINVAL;
-       depth = *prop;
-       pitch = width * ((depth + 7) / 8);
-       prop = (u32 *)get_property(np, "linebytes", NULL);
-       if (prop)
-               pitch = *prop;
-       if (pitch == 1)
-               pitch = 0x1000;
-       prop = (u32 *)get_property(np, "address", NULL);
-       if (prop)
-               address = *prop;
-
-       /* FIXME: Add support for PCI reg properties */
-
-       if (address == 0)
-               return -EINVAL;
-
-       g_loc_X = 0;
-       g_loc_Y = 0;
-       g_max_loc_X = width / 8;
-       g_max_loc_Y = height / 16;
-       logicalDisplayBase = (unsigned char *)address;
-       dispDeviceBase = (unsigned char *)address;
-       dispDeviceRowBytes = pitch;
-       dispDeviceDepth = depth;
-       dispDeviceRect[0] = dispDeviceRect[1] = 0;
-       dispDeviceRect[2] = width;
-       dispDeviceRect[3] = height;
-
-       map_boot_text();
-
-       return 0;
-}
-
-static void btext_putc(unsigned char c)
-{
-       btext_drawchar(c);
-}
-
-void __init init_boot_display(void)
-{
-       char *name;
-       struct device_node *np = NULL; 
-       int rc = -ENODEV;
-
-       printk("trying to initialize btext ...\n");
-
-       name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
-       if (name != NULL) {
-               np = of_find_node_by_path(name);
-               if (np != NULL) {
-                       if (strcmp(np->type, "display") != 0) {
-                               printk("boot stdout isn't a display !\n");
-                               of_node_put(np);
-                               np = NULL;
-                       }
-               }
-       }
-       if (np)
-               rc = btext_initialize(np);
-       if (rc) {
-               for (np = NULL; (np = of_find_node_by_type(np, "display"));) {
-                       if (get_property(np, "linux,opened", NULL)) {
-                               printk("trying %s ...\n", np->full_name);
-                               rc = btext_initialize(np);
-                               printk("result: %d\n", rc);
-                       }
-                       if (rc == 0)
-                               break;
-               }
-       }
-       if (rc == 0 && udbg_putc == NULL)
-               udbg_putc = btext_putc;
-}
-
-
-/* Calc the base address of a given point (x,y) */
-static unsigned char * calc_base(int x, int y)
-{
-       unsigned char *base;
-
-       base = logicalDisplayBase;
-       if (base == 0)
-               base = dispDeviceBase;
-       base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
-       base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
-       return base;
-}
-
-/* Adjust the display to a new resolution */
-void btext_update_display(unsigned long phys, int width, int height,
-                         int depth, int pitch)
-{
-       if (dispDeviceBase == 0)
-               return;
-
-       /* check it's the same frame buffer (within 256MB) */
-       if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
-               return;
-
-       dispDeviceBase = (__u8 *) phys;
-       dispDeviceRect[0] = 0;
-       dispDeviceRect[1] = 0;
-       dispDeviceRect[2] = width;
-       dispDeviceRect[3] = height;
-       dispDeviceDepth = depth;
-       dispDeviceRowBytes = pitch;
-       if (boot_text_mapped) {
-               iounmap(logicalDisplayBase);
-               boot_text_mapped = 0;
-       }
-       map_boot_text();
-       g_loc_X = 0;
-       g_loc_Y = 0;
-       g_max_loc_X = width / 8;
-       g_max_loc_Y = height / 16;
-}
-
-void btext_clearscreen(void)
-{
-       unsigned long *base     = (unsigned long *)calc_base(0, 0);
-       unsigned long width     = ((dispDeviceRect[2] - dispDeviceRect[0]) *
-                                       (dispDeviceDepth >> 3)) >> 3;
-       int i,j;
-
-       for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
-       {
-               unsigned long *ptr = base;
-               for(j=width; j; --j)
-                       *(ptr++) = 0;
-               base += (dispDeviceRowBytes >> 3);
-       }
-}
-
-#ifndef NO_SCROLL
-static void scrollscreen(void)
-{
-       unsigned long *src      = (unsigned long *)calc_base(0,16);
-       unsigned long *dst      = (unsigned long *)calc_base(0,0);
-       unsigned long width     = ((dispDeviceRect[2] - dispDeviceRect[0]) *
-                                  (dispDeviceDepth >> 3)) >> 3;
-       int i,j;
-
-       for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
-       {
-               unsigned long *src_ptr = src;
-               unsigned long *dst_ptr = dst;
-               for(j=width; j; --j)
-                       *(dst_ptr++) = *(src_ptr++);
-               src += (dispDeviceRowBytes >> 3);
-               dst += (dispDeviceRowBytes >> 3);
-       }
-       for (i=0; i<16; i++)
-       {
-               unsigned long *dst_ptr = dst;
-               for(j=width; j; --j)
-                       *(dst_ptr++) = 0;
-               dst += (dispDeviceRowBytes >> 3);
-       }
-}
-#endif /* ndef NO_SCROLL */
-
-void btext_drawchar(char c)
-{
-       int cline = 0;
-#ifdef NO_SCROLL
-       int x;
-#endif
-       if (!boot_text_mapped)
-               return;
-
-       switch (c) {
-       case '\b':
-               if (g_loc_X > 0)
-                       --g_loc_X;
-               break;
-       case '\t':
-               g_loc_X = (g_loc_X & -8) + 8;
-               break;
-       case '\r':
-               g_loc_X = 0;
-               break;
-       case '\n':
-               g_loc_X = 0;
-               g_loc_Y++;
-               cline = 1;
-               break;
-       default:
-               draw_byte(c, g_loc_X++, g_loc_Y);
-       }
-       if (g_loc_X >= g_max_loc_X) {
-               g_loc_X = 0;
-               g_loc_Y++;
-               cline = 1;
-       }
-#ifndef NO_SCROLL
-       while (g_loc_Y >= g_max_loc_Y) {
-               scrollscreen();
-               g_loc_Y--;
-       }
-#else
-       /* wrap around from bottom to top of screen so we don't
-          waste time scrolling each line.  -- paulus. */
-       if (g_loc_Y >= g_max_loc_Y)
-               g_loc_Y = 0;
-       if (cline) {
-               for (x = 0; x < g_max_loc_X; ++x)
-                       draw_byte(' ', x, g_loc_Y);
-       }
-#endif
-}
-
-void btext_drawstring(const char *c)
-{
-       if (!boot_text_mapped)
-               return;
-       while (*c)
-               btext_drawchar(*c++);
-}
-
-void btext_drawhex(unsigned long v)
-{
-       char *hex_table = "0123456789abcdef";
-
-       if (!boot_text_mapped)
-               return;
-       btext_drawchar(hex_table[(v >> 60) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 56) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 52) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 48) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 44) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 40) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 36) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 32) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 28) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 24) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 20) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 16) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >> 12) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >>  8) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >>  4) & 0x0000000FUL]);
-       btext_drawchar(hex_table[(v >>  0) & 0x0000000FUL]);
-       btext_drawchar(' ');
-}
-
-static void draw_byte(unsigned char c, long locX, long locY)
-{
-       unsigned char *base     = calc_base(locX << 3, locY << 4);
-       unsigned char *font     = &vga_font[((unsigned int)c) * 16];
-       int rb                  = dispDeviceRowBytes;
-
-       switch(dispDeviceDepth) {
-       case 24:
-       case 32:
-               draw_byte_32(font, (unsigned int *)base, rb);
-               break;
-       case 15:
-       case 16:
-               draw_byte_16(font, (unsigned int *)base, rb);
-               break;
-       case 8:
-               draw_byte_8(font, (unsigned int *)base, rb);
-               break;
-       }
-}
-
-static unsigned int expand_bits_8[16] = {
-       0x00000000,
-       0x000000ff,
-       0x0000ff00,
-       0x0000ffff,
-       0x00ff0000,
-       0x00ff00ff,
-       0x00ffff00,
-       0x00ffffff,
-       0xff000000,
-       0xff0000ff,
-       0xff00ff00,
-       0xff00ffff,
-       0xffff0000,
-       0xffff00ff,
-       0xffffff00,
-       0xffffffff
-};
-
-static unsigned int expand_bits_16[4] = {
-       0x00000000,
-       0x0000ffff,
-       0xffff0000,
-       0xffffffff
-};
-
-
-static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
-{
-       int l, bits;
-       int fg = 0xFFFFFFFFUL;
-       int bg = 0x00000000UL;
-
-       for (l = 0; l < 16; ++l)
-       {
-               bits = *font++;
-               base[0] = (-(bits >> 7) & fg) ^ bg;
-               base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
-               base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
-               base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
-               base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
-               base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
-               base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
-               base[7] = (-(bits & 1) & fg) ^ bg;
-               base = (unsigned int *) ((char *)base + rb);
-       }
-}
-
-static void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
-{
-       int l, bits;
-       int fg = 0xFFFFFFFFUL;
-       int bg = 0x00000000UL;
-       unsigned int *eb = (int *)expand_bits_16;
-
-       for (l = 0; l < 16; ++l)
-       {
-               bits = *font++;
-               base[0] = (eb[bits >> 6] & fg) ^ bg;
-               base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
-               base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
-               base[3] = (eb[bits & 3] & fg) ^ bg;
-               base = (unsigned int *) ((char *)base + rb);
-       }
-}
-
-static void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
-{
-       int l, bits;
-       int fg = 0x0F0F0F0FUL;
-       int bg = 0x00000000UL;
-       unsigned int *eb = (int *)expand_bits_8;
-
-       for (l = 0; l < 16; ++l)
-       {
-               bits = *font++;
-               base[0] = (eb[bits >> 4] & fg) ^ bg;
-               base[1] = (eb[bits & 0xf] & fg) ^ bg;
-               base = (unsigned int *) ((char *)base + rb);
-       }
-}
-
-static unsigned char vga_font[cmapsz] = {
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
-0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
-0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
-0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
-0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
-0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
-0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
-0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
-0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
-0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
-0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
-0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
-0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
-0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
-0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
-0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
-0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
-0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
-0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
-0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
-0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
-0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
-0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
-0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
-0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
-0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
-0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
-0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
-0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
-0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
-0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
-0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
-0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
-0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
-0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
-0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
-0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
-0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
-0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
-0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
-0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
-0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
-0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
-0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
-0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
-0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
-0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
-0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
-0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
-0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
-0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
-0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
-0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
-0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
-0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
-0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
-0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
-0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
-0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
-0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
-0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
-0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
-0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
-0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
-0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
-0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
-0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
-0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
-0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
-0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
-0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
-0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
-0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
-0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
-0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
-0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
-0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
-0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
-0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
-0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
-0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
-0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
-0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
-0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
-0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
-0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
-0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
-0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
-0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
-0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
-0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
-0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
-0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
-0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
-0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
-0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
-0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
-0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
-0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
-0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
-0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
-0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
-0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
-0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
-0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
-0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
-0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
-0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
-0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
-0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
-0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00,
-};
diff --git a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S
deleted file mode 100644 (file)
index 1c869ea..0000000
+++ /dev/null
@@ -1,2007 +0,0 @@
-/*
- *  arch/ppc64/kernel/head.S
- *
- *  PowerPC version
- *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
- *
- *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
- *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
- *  Adapted for Power Macintosh by Paul Mackerras.
- *  Low-level exception handlers and MMU support
- *  rewritten by Paul Mackerras.
- *    Copyright (C) 1996 Paul Mackerras.
- *
- *  Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and
- *    Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com
- *
- *  This file contains the low-level support and setup for the
- *  PowerPC-64 platform, including trap and interrupt dispatch.
- *
- *  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/config.h>
-#include <linux/threads.h>
-#include <asm/processor.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/bug.h>
-#include <asm/cputable.h>
-#include <asm/setup.h>
-#include <asm/hvcall.h>
-#include <asm/iseries/lpar_map.h>
-#include <asm/thread_info.h>
-
-#ifdef CONFIG_PPC_ISERIES
-#define DO_SOFT_DISABLE
-#endif
-
-/*
- * We layout physical memory as follows:
- * 0x0000 - 0x00ff : Secondary processor spin code
- * 0x0100 - 0x2fff : pSeries Interrupt prologs
- * 0x3000 - 0x5fff : interrupt support, iSeries and common interrupt prologs
- * 0x6000 - 0x6fff : Initial (CPU0) segment table
- * 0x7000 - 0x7fff : FWNMI data area
- * 0x8000 -        : Early init and support code
- */
-
-/*
- *   SPRG Usage
- *
- *   Register  Definition
- *
- *   SPRG0     reserved for hypervisor
- *   SPRG1     temp - used to save gpr
- *   SPRG2     temp - used to save gpr
- *   SPRG3     virt addr of paca
- */
-
-/*
- * Entering into this code we make the following assumptions:
- *  For pSeries:
- *   1. The MMU is off & open firmware is running in real mode.
- *   2. The kernel is entered at __start
- *
- *  For iSeries:
- *   1. The MMU is on (as it always is for iSeries)
- *   2. The kernel is entered at system_reset_iSeries
- */
-
-       .text
-       .globl  _stext
-_stext:
-#ifdef CONFIG_PPC_MULTIPLATFORM
-_GLOBAL(__start)
-       /* NOP this out unconditionally */
-BEGIN_FTR_SECTION
-       b       .__start_initialization_multiplatform
-END_FTR_SECTION(0, 1)
-#endif /* CONFIG_PPC_MULTIPLATFORM */
-
-       /* Catch branch to 0 in real mode */
-       trap
-
-#ifdef CONFIG_PPC_ISERIES
-       /*
-        * At offset 0x20, there is a pointer to iSeries LPAR data.
-        * This is required by the hypervisor
-        */
-       . = 0x20
-       .llong hvReleaseData-KERNELBASE
-
-       /*
-        * At offset 0x28 and 0x30 are offsets to the mschunks_map
-        * array (used by the iSeries LPAR debugger to do translation
-        * between physical addresses and absolute addresses) and
-        * to the pidhash table (also used by the debugger)
-        */
-       .llong mschunks_map-KERNELBASE
-       .llong 0        /* pidhash-KERNELBASE SFRXXX */
-
-       /* Offset 0x38 - Pointer to start of embedded System.map */
-       .globl  embedded_sysmap_start
-embedded_sysmap_start:
-       .llong  0
-       /* Offset 0x40 - Pointer to end of embedded System.map */
-       .globl  embedded_sysmap_end
-embedded_sysmap_end:
-       .llong  0
-
-#endif /* CONFIG_PPC_ISERIES */
-
-       /* Secondary processors spin on this value until it goes to 1. */
-       .globl  __secondary_hold_spinloop
-__secondary_hold_spinloop:
-       .llong  0x0
-
-       /* Secondary processors write this value with their cpu # */
-       /* after they enter the spin loop immediately below.      */
-       .globl  __secondary_hold_acknowledge
-__secondary_hold_acknowledge:
-       .llong  0x0
-
-       . = 0x60
-/*
- * The following code is used on pSeries to hold secondary processors
- * in a spin loop after they have been freed from OpenFirmware, but
- * before the bulk of the kernel has been relocated.  This code
- * is relocated to physical address 0x60 before prom_init is run.
- * All of it must fit below the first exception vector at 0x100.
- */
-_GLOBAL(__secondary_hold)
-       mfmsr   r24
-       ori     r24,r24,MSR_RI
-       mtmsrd  r24                     /* RI on */
-
-       /* Grab our linux cpu number */
-       mr      r24,r3
-
-       /* Tell the master cpu we're here */
-       /* Relocation is off & we are located at an address less */
-       /* than 0x100, so only need to grab low order offset.    */
-       std     r24,__secondary_hold_acknowledge@l(0)
-       sync
-
-       /* All secondary cpus wait here until told to start. */
-100:   ld      r4,__secondary_hold_spinloop@l(0)
-       cmpdi   0,r4,1
-       bne     100b
-
-#ifdef CONFIG_HMT
-       b       .hmt_init
-#else
-#ifdef CONFIG_SMP
-       mr      r3,r24
-       b       .pSeries_secondary_smp_init
-#else
-       BUG_OPCODE
-#endif
-#endif
-
-/* This value is used to mark exception frames on the stack. */
-       .section ".toc","aw"
-exception_marker:
-       .tc     ID_72656773_68657265[TC],0x7265677368657265
-       .text
-
-/*
- * The following macros define the code that appears as
- * the prologue to each of the exception handlers.  They
- * are split into two parts to allow a single kernel binary
- * to be used for pSeries and iSeries.
- * LOL.  One day... - paulus
- */
-
-/*
- * We make as much of the exception code common between native
- * exception handlers (including pSeries LPAR) and iSeries LPAR
- * implementations as possible.
- */
-
-/*
- * This is the start of the interrupt handlers for pSeries
- * This code runs with relocation off.
- */
-#define EX_R9          0
-#define EX_R10         8
-#define EX_R11         16
-#define EX_R12         24
-#define EX_R13         32
-#define EX_SRR0                40
-#define EX_DAR         48
-#define EX_DSISR       56
-#define EX_CCR         60
-#define EX_R3          64
-#define EX_LR          72
-
-#define EXCEPTION_PROLOG_PSERIES(area, label)                          \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
-       std     r11,area+EX_R11(r13);                                   \
-       std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG1;                                          \
-       std     r9,area+EX_R13(r13);                                    \
-       mfcr    r9;                                                     \
-       clrrdi  r12,r13,32;             /* get high part of &label */   \
-       mfmsr   r10;                                                    \
-       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
-       ori     r12,r12,(label)@l;      /* virt addr of handler */      \
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
-       mtspr   SPRN_SRR0,r12;                                          \
-       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
-       mtspr   SPRN_SRR1,r10;                                          \
-       rfid;                                                           \
-       b       .       /* prevent speculative execution */
-
-/*
- * This is the start of the interrupt handlers for iSeries
- * This code runs with relocation on.
- */
-#define EXCEPTION_PROLOG_ISERIES_1(area)                               \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
-       std     r11,area+EX_R11(r13);                                   \
-       std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG1;                                          \
-       std     r9,area+EX_R13(r13);                                    \
-       mfcr    r9
-
-#define EXCEPTION_PROLOG_ISERIES_2                                     \
-       mfmsr   r10;                                                    \
-       ld      r11,PACALPPACA+LPPACASRR0(r13);                         \
-       ld      r12,PACALPPACA+LPPACASRR1(r13);                         \
-       ori     r10,r10,MSR_RI;                                         \
-       mtmsrd  r10,1
-
-/*
- * The common exception prolog is used for all except a few exceptions
- * such as a segment miss on a kernel address.  We have to be prepared
- * to take another exception from the point where we first touch the
- * kernel stack onwards.
- *
- * On entry r13 points to the paca, r9-r13 are saved in the paca,
- * r9 contains the saved CR, r11 and r12 contain the saved SRR0 and
- * SRR1, and relocation is on.
- */
-#define EXCEPTION_PROLOG_COMMON(n, area)                                  \
-       andi.   r10,r12,MSR_PR;         /* See if coming from user      */ \
-       mr      r10,r1;                 /* Save r1                      */ \
-       subi    r1,r1,INT_FRAME_SIZE;   /* alloc frame on kernel stack  */ \
-       beq-    1f;                                                        \
-       ld      r1,PACAKSAVE(r13);      /* kernel stack to use          */ \
-1:     cmpdi   cr1,r1,0;               /* check if r1 is in userspace  */ \
-       bge-    cr1,bad_stack;          /* abort if it is               */ \
-       std     r9,_CCR(r1);            /* save CR in stackframe        */ \
-       std     r11,_NIP(r1);           /* save SRR0 in stackframe      */ \
-       std     r12,_MSR(r1);           /* save SRR1 in stackframe      */ \
-       std     r10,0(r1);              /* make stack chain pointer     */ \
-       std     r0,GPR0(r1);            /* save r0 in stackframe        */ \
-       std     r10,GPR1(r1);           /* save r1 in stackframe        */ \
-       std     r2,GPR2(r1);            /* save r2 in stackframe        */ \
-       SAVE_4GPRS(3, r1);              /* save r3 - r6 in stackframe   */ \
-       SAVE_2GPRS(7, r1);              /* save r7, r8 in stackframe    */ \
-       ld      r9,area+EX_R9(r13);     /* move r9, r10 to stackframe   */ \
-       ld      r10,area+EX_R10(r13);                                      \
-       std     r9,GPR9(r1);                                               \
-       std     r10,GPR10(r1);                                             \
-       ld      r9,area+EX_R11(r13);    /* move r11 - r13 to stackframe */ \
-       ld      r10,area+EX_R12(r13);                                      \
-       ld      r11,area+EX_R13(r13);                                      \
-       std     r9,GPR11(r1);                                              \
-       std     r10,GPR12(r1);                                             \
-       std     r11,GPR13(r1);                                             \
-       ld      r2,PACATOC(r13);        /* get kernel TOC into r2       */ \
-       mflr    r9;                     /* save LR in stackframe        */ \
-       std     r9,_LINK(r1);                                              \
-       mfctr   r10;                    /* save CTR in stackframe       */ \
-       std     r10,_CTR(r1);                                              \
-       mfspr   r11,SPRN_XER;           /* save XER in stackframe       */ \
-       std     r11,_XER(r1);                                              \
-       li      r9,(n)+1;                                                  \
-       std     r9,_TRAP(r1);           /* set trap number              */ \
-       li      r10,0;                                                     \
-       ld      r11,exception_marker@toc(r2);                              \
-       std     r10,RESULT(r1);         /* clear regs->result           */ \
-       std     r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame      */
-
-/*
- * Exception vectors.
- */
-#define STD_EXCEPTION_PSERIES(n, label)                        \
-       . = n;                                          \
-       .globl label##_pSeries;                         \
-label##_pSeries:                                       \
-       HMT_MEDIUM;                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
-       RUNLATCH_ON(r13);                               \
-       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
-
-#define STD_EXCEPTION_ISERIES(n, label, area)          \
-       .globl label##_iSeries;                         \
-label##_iSeries:                                       \
-       HMT_MEDIUM;                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
-       RUNLATCH_ON(r13);                               \
-       EXCEPTION_PROLOG_ISERIES_1(area);               \
-       EXCEPTION_PROLOG_ISERIES_2;                     \
-       b       label##_common
-
-#define MASKABLE_EXCEPTION_ISERIES(n, label)                           \
-       .globl label##_iSeries;                                         \
-label##_iSeries:                                                       \
-       HMT_MEDIUM;                                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
-       RUNLATCH_ON(r13);                                               \
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN);                         \
-       lbz     r10,PACAPROCENABLED(r13);                               \
-       cmpwi   0,r10,0;                                                \
-       beq-    label##_iSeries_masked;                                 \
-       EXCEPTION_PROLOG_ISERIES_2;                                     \
-       b       label##_common;                                         \
-
-#ifdef DO_SOFT_DISABLE
-#define DISABLE_INTS                           \
-       lbz     r10,PACAPROCENABLED(r13);       \
-       li      r11,0;                          \
-       std     r10,SOFTE(r1);                  \
-       mfmsr   r10;                            \
-       stb     r11,PACAPROCENABLED(r13);       \
-       ori     r10,r10,MSR_EE;                 \
-       mtmsrd  r10,1
-
-#define ENABLE_INTS                            \
-       lbz     r10,PACAPROCENABLED(r13);       \
-       mfmsr   r11;                            \
-       std     r10,SOFTE(r1);                  \
-       ori     r11,r11,MSR_EE;                 \
-       mtmsrd  r11,1
-
-#else  /* hard enable/disable interrupts */
-#define DISABLE_INTS
-
-#define ENABLE_INTS                            \
-       ld      r12,_MSR(r1);                   \
-       mfmsr   r11;                            \
-       rlwimi  r11,r12,0,MSR_EE;               \
-       mtmsrd  r11,1
-
-#endif
-
-#define STD_EXCEPTION_COMMON(trap, label, hdlr)                \
-       .align  7;                                      \
-       .globl label##_common;                          \
-label##_common:                                                \
-       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
-       DISABLE_INTS;                                   \
-       bl      .save_nvgprs;                           \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       bl      hdlr;                                   \
-       b       .ret_from_except
-
-#define STD_EXCEPTION_COMMON_LITE(trap, label, hdlr)   \
-       .align  7;                                      \
-       .globl label##_common;                          \
-label##_common:                                                \
-       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
-       DISABLE_INTS;                                   \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       bl      hdlr;                                   \
-       b       .ret_from_except_lite
-
-/*
- * Start of pSeries system interrupt routines
- */
-       . = 0x100
-       .globl __start_interrupts
-__start_interrupts:
-
-       STD_EXCEPTION_PSERIES(0x100, system_reset)
-
-       . = 0x200
-_machine_check_pSeries:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       RUNLATCH_ON(r13)
-       EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
-
-       . = 0x300
-       .globl data_access_pSeries
-data_access_pSeries:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13
-BEGIN_FTR_SECTION
-       mtspr   SPRN_SPRG2,r12
-       mfspr   r13,SPRN_DAR
-       mfspr   r12,SPRN_DSISR
-       srdi    r13,r13,60
-       rlwimi  r13,r12,16,0x20
-       mfcr    r12
-       cmpwi   r13,0x2c
-       beq     .do_stab_bolted_pSeries
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
-       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common)
-
-       . = 0x380
-       .globl data_access_slb_pSeries
-data_access_slb_pSeries:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13
-       RUNLATCH_ON(r13)
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       mfspr   r3,SPRN_DAR
-       std     r9,PACA_EXSLB+EX_R9(r13)        /* save r9 - r12 */
-       mfcr    r9
-#ifdef __DISABLED__
-       /* Keep that around for when we re-implement dynamic VSIDs */
-       cmpdi   r3,0
-       bge     slb_miss_user_pseries
-#endif /* __DISABLED__ */
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       mfspr   r12,SPRN_SRR1           /* and SRR1 */
-       b       .slb_miss_realmode      /* Rel. branch works in real mode */
-
-       STD_EXCEPTION_PSERIES(0x400, instruction_access)
-
-       . = 0x480
-       .globl instruction_access_slb_pSeries
-instruction_access_slb_pSeries:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13
-       RUNLATCH_ON(r13)
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       mfspr   r3,SPRN_SRR0            /* SRR0 is faulting address */
-       std     r9,PACA_EXSLB+EX_R9(r13)        /* save r9 - r12 */
-       mfcr    r9
-#ifdef __DISABLED__
-       /* Keep that around for when we re-implement dynamic VSIDs */
-       cmpdi   r3,0
-       bge     slb_miss_user_pseries
-#endif /* __DISABLED__ */
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       mfspr   r12,SPRN_SRR1           /* and SRR1 */
-       b       .slb_miss_realmode      /* Rel. branch works in real mode */
-
-       STD_EXCEPTION_PSERIES(0x500, hardware_interrupt)
-       STD_EXCEPTION_PSERIES(0x600, alignment)
-       STD_EXCEPTION_PSERIES(0x700, program_check)
-       STD_EXCEPTION_PSERIES(0x800, fp_unavailable)
-       STD_EXCEPTION_PSERIES(0x900, decrementer)
-       STD_EXCEPTION_PSERIES(0xa00, trap_0a)
-       STD_EXCEPTION_PSERIES(0xb00, trap_0b)
-
-       . = 0xc00
-       .globl  system_call_pSeries
-system_call_pSeries:
-       HMT_MEDIUM
-       RUNLATCH_ON(r9)
-       mr      r9,r13
-       mfmsr   r10
-       mfspr   r13,SPRN_SPRG3
-       mfspr   r11,SPRN_SRR0
-       clrrdi  r12,r13,32
-       oris    r12,r12,system_call_common@h
-       ori     r12,r12,system_call_common@l
-       mtspr   SPRN_SRR0,r12
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI
-       mfspr   r12,SPRN_SRR1
-       mtspr   SPRN_SRR1,r10
-       rfid
-       b       .       /* prevent speculative execution */
-
-       STD_EXCEPTION_PSERIES(0xd00, single_step)
-       STD_EXCEPTION_PSERIES(0xe00, trap_0e)
-
-       /* We need to deal with the Altivec unavailable exception
-        * here which is at 0xf20, thus in the middle of the
-        * prolog code of the PerformanceMonitor one. A little
-        * trickery is thus necessary
-        */
-       . = 0xf00
-       b       performance_monitor_pSeries
-
-       STD_EXCEPTION_PSERIES(0xf20, altivec_unavailable)
-
-       STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint)
-       STD_EXCEPTION_PSERIES(0x1700, altivec_assist)
-
-       . = 0x3000
-
-/*** pSeries interrupt support ***/
-
-       /* moved from 0xf00 */
-       STD_EXCEPTION_PSERIES(., performance_monitor)
-
-       .align  7
-_GLOBAL(do_stab_bolted_pSeries)
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-       EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted)
-
-/*
- * We have some room here  we use that to put
- * the peries slb miss user trampoline code so it's reasonably
- * away from slb_miss_user_common to avoid problems with rfid
- *
- * This is used for when the SLB miss handler has to go virtual,
- * which doesn't happen for now anymore but will once we re-implement
- * dynamic VSIDs for shared page tables
- */
-#ifdef __DISABLED__
-slb_miss_user_pseries:
-       std     r10,PACA_EXGEN+EX_R10(r13)
-       std     r11,PACA_EXGEN+EX_R11(r13)
-       std     r12,PACA_EXGEN+EX_R12(r13)
-       mfspr   r10,SPRG1
-       ld      r11,PACA_EXSLB+EX_R9(r13)
-       ld      r12,PACA_EXSLB+EX_R3(r13)
-       std     r10,PACA_EXGEN+EX_R13(r13)
-       std     r11,PACA_EXGEN+EX_R9(r13)
-       std     r12,PACA_EXGEN+EX_R3(r13)
-       clrrdi  r12,r13,32
-       mfmsr   r10
-       mfspr   r11,SRR0                        /* save SRR0 */
-       ori     r12,r12,slb_miss_user_common@l  /* virt addr of handler */
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI
-       mtspr   SRR0,r12
-       mfspr   r12,SRR1                        /* and SRR1 */
-       mtspr   SRR1,r10
-       rfid
-       b       .                               /* prevent spec. execution */
-#endif /* __DISABLED__ */
-
-/*
- * Vectors for the FWNMI option.  Share common code.
- */
-       .globl system_reset_fwnmi
-system_reset_fwnmi:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       RUNLATCH_ON(r13)
-       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)
-
-       .globl machine_check_fwnmi
-machine_check_fwnmi:
-       HMT_MEDIUM
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       RUNLATCH_ON(r13)
-       EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
-
-#ifdef CONFIG_PPC_ISERIES
-/***  ISeries-LPAR interrupt handlers ***/
-
-       STD_EXCEPTION_ISERIES(0x200, machine_check, PACA_EXMC)
-
-       .globl data_access_iSeries
-data_access_iSeries:
-       mtspr   SPRN_SPRG1,r13
-BEGIN_FTR_SECTION
-       mtspr   SPRN_SPRG2,r12
-       mfspr   r13,SPRN_DAR
-       mfspr   r12,SPRN_DSISR
-       srdi    r13,r13,60
-       rlwimi  r13,r12,16,0x20
-       mfcr    r12
-       cmpwi   r13,0x2c
-       beq     .do_stab_bolted_iSeries
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       data_access_common
-
-.do_stab_bolted_iSeries:
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXSLB)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       .do_stab_bolted
-
-       .globl  data_access_slb_iSeries
-data_access_slb_iSeries:
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       mfspr   r3,SPRN_DAR
-       std     r9,PACA_EXSLB+EX_R9(r13)
-       mfcr    r9
-#ifdef __DISABLED__
-       cmpdi   r3,0
-       bge     slb_miss_user_iseries
-#endif
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       ld      r12,PACALPPACA+LPPACASRR1(r13);
-       b       .slb_miss_realmode
-
-       STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN)
-
-       .globl  instruction_access_slb_iSeries
-instruction_access_slb_iSeries:
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       ld      r3,PACALPPACA+LPPACASRR0(r13)   /* get SRR0 value */
-       std     r9,PACA_EXSLB+EX_R9(r13)
-       mfcr    r9
-#ifdef __DISABLED__
-       cmpdi   r3,0
-       bge     .slb_miss_user_iseries
-#endif
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       ld      r12,PACALPPACA+LPPACASRR1(r13);
-       b       .slb_miss_realmode
-
-#ifdef __DISABLED__
-slb_miss_user_iseries:
-       std     r10,PACA_EXGEN+EX_R10(r13)
-       std     r11,PACA_EXGEN+EX_R11(r13)
-       std     r12,PACA_EXGEN+EX_R12(r13)
-       mfspr   r10,SPRG1
-       ld      r11,PACA_EXSLB+EX_R9(r13)
-       ld      r12,PACA_EXSLB+EX_R3(r13)
-       std     r10,PACA_EXGEN+EX_R13(r13)
-       std     r11,PACA_EXGEN+EX_R9(r13)
-       std     r12,PACA_EXGEN+EX_R3(r13)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       slb_miss_user_common
-#endif
-
-       MASKABLE_EXCEPTION_ISERIES(0x500, hardware_interrupt)
-       STD_EXCEPTION_ISERIES(0x600, alignment, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0x700, program_check, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0x800, fp_unavailable, PACA_EXGEN)
-       MASKABLE_EXCEPTION_ISERIES(0x900, decrementer)
-       STD_EXCEPTION_ISERIES(0xa00, trap_0a, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0xb00, trap_0b, PACA_EXGEN)
-
-       .globl  system_call_iSeries
-system_call_iSeries:
-       mr      r9,r13
-       mfspr   r13,SPRN_SPRG3
-       EXCEPTION_PROLOG_ISERIES_2
-       b       system_call_common
-
-       STD_EXCEPTION_ISERIES( 0xd00, single_step, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES( 0xe00, trap_0e, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES( 0xf00, performance_monitor, PACA_EXGEN)
-
-       .globl system_reset_iSeries
-system_reset_iSeries:
-       mfspr   r13,SPRN_SPRG3          /* Get paca address */
-       mfmsr   r24
-       ori     r24,r24,MSR_RI
-       mtmsrd  r24                     /* RI on */
-       lhz     r24,PACAPACAINDEX(r13)  /* Get processor # */
-       cmpwi   0,r24,0                 /* Are we processor 0? */
-       beq     .__start_initialization_iSeries /* Start up the first processor */
-       mfspr   r4,SPRN_CTRLF
-       li      r5,CTRL_RUNLATCH        /* Turn off the run light */
-       andc    r4,r4,r5
-       mtspr   SPRN_CTRLT,r4
-
-1:
-       HMT_LOW
-#ifdef CONFIG_SMP
-       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor
-                                        * should start */
-       sync
-       LOADADDR(r3,current_set)
-       sldi    r28,r24,3               /* get current_set[cpu#] */
-       ldx     r3,r3,r28
-       addi    r1,r3,THREAD_SIZE
-       subi    r1,r1,STACK_FRAME_OVERHEAD
-
-       cmpwi   0,r23,0
-       beq     iSeries_secondary_smp_loop      /* Loop until told to go */
-       bne     .__secondary_start              /* Loop until told to go */
-iSeries_secondary_smp_loop:
-       /* Let the Hypervisor know we are alive */
-       /* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */
-       lis     r3,0x8002
-       rldicr  r3,r3,32,15             /* r0 = (r3 << 32) & 0xffff000000000000 */
-#else /* CONFIG_SMP */
-       /* Yield the processor.  This is required for non-SMP kernels
-               which are running on multi-threaded machines. */
-       lis     r3,0x8000
-       rldicr  r3,r3,32,15             /* r3 = (r3 << 32) & 0xffff000000000000 */
-       addi    r3,r3,18                /* r3 = 0x8000000000000012 which is "yield" */
-       li      r4,0                    /* "yield timed" */
-       li      r5,-1                   /* "yield forever" */
-#endif /* CONFIG_SMP */
-       li      r0,-1                   /* r0=-1 indicates a Hypervisor call */
-       sc                              /* Invoke the hypervisor via a system call */
-       mfspr   r13,SPRN_SPRG3          /* Put r13 back ???? */
-       b       1b                      /* If SMP not configured, secondaries
-                                        * loop forever */
-
-       .globl decrementer_iSeries_masked
-decrementer_iSeries_masked:
-       li      r11,1
-       stb     r11,PACALPPACA+LPPACADECRINT(r13)
-       lwz     r12,PACADEFAULTDECR(r13)
-       mtspr   SPRN_DEC,r12
-       /* fall through */
-
-       .globl hardware_interrupt_iSeries_masked
-hardware_interrupt_iSeries_masked:
-       mtcrf   0x80,r9         /* Restore regs */
-       ld      r11,PACALPPACA+LPPACASRR0(r13)
-       ld      r12,PACALPPACA+LPPACASRR1(r13)
-       mtspr   SPRN_SRR0,r11
-       mtspr   SPRN_SRR1,r12
-       ld      r9,PACA_EXGEN+EX_R9(r13)
-       ld      r10,PACA_EXGEN+EX_R10(r13)
-       ld      r11,PACA_EXGEN+EX_R11(r13)
-       ld      r12,PACA_EXGEN+EX_R12(r13)
-       ld      r13,PACA_EXGEN+EX_R13(r13)
-       rfid
-       b       .       /* prevent speculative execution */
-#endif /* CONFIG_PPC_ISERIES */
-
-/*** Common interrupt handlers ***/
-
-       STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
-
-       /*
-        * Machine check is different because we use a different
-        * save area: PACA_EXMC instead of PACA_EXGEN.
-        */
-       .align  7
-       .globl machine_check_common
-machine_check_common:
-       EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
-       DISABLE_INTS
-       bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .machine_check_exception
-       b       .ret_from_except
-
-       STD_EXCEPTION_COMMON_LITE(0x900, decrementer, .timer_interrupt)
-       STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception)
-       STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
-       STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
-       STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
-       STD_EXCEPTION_COMMON(0xf00, performance_monitor, .performance_monitor_exception)
-       STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
-#ifdef CONFIG_ALTIVEC
-       STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
-#else
-       STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
-#endif
-
-/*
- * Here we have detected that the kernel stack pointer is bad.
- * R9 contains the saved CR, r13 points to the paca,
- * r10 contains the (bad) kernel stack pointer,
- * r11 and r12 contain the saved SRR0 and SRR1.
- * We switch to using an emergency stack, save the registers there,
- * and call kernel_bad_stack(), which panics.
- */
-bad_stack:
-       ld      r1,PACAEMERGSP(r13)
-       subi    r1,r1,64+INT_FRAME_SIZE
-       std     r9,_CCR(r1)
-       std     r10,GPR1(r1)
-       std     r11,_NIP(r1)
-       std     r12,_MSR(r1)
-       mfspr   r11,SPRN_DAR
-       mfspr   r12,SPRN_DSISR
-       std     r11,_DAR(r1)
-       std     r12,_DSISR(r1)
-       mflr    r10
-       mfctr   r11
-       mfxer   r12
-       std     r10,_LINK(r1)
-       std     r11,_CTR(r1)
-       std     r12,_XER(r1)
-       SAVE_GPR(0,r1)
-       SAVE_GPR(2,r1)
-       SAVE_4GPRS(3,r1)
-       SAVE_2GPRS(7,r1)
-       SAVE_10GPRS(12,r1)
-       SAVE_10GPRS(22,r1)
-       addi    r11,r1,INT_FRAME_SIZE
-       std     r11,0(r1)
-       li      r12,0
-       std     r12,0(r11)
-       ld      r2,PACATOC(r13)
-1:     addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .kernel_bad_stack
-       b       1b
-
-/*
- * Return from an exception with minimal checks.
- * The caller is assumed to have done EXCEPTION_PROLOG_COMMON.
- * If interrupts have been enabled, or anything has been
- * done that might have changed the scheduling status of
- * any task or sent any task a signal, you should use
- * ret_from_except or ret_from_except_lite instead of this.
- */
-       .globl  fast_exception_return
-fast_exception_return:
-       ld      r12,_MSR(r1)
-       ld      r11,_NIP(r1)
-       andi.   r3,r12,MSR_RI           /* check if RI is set */
-       beq-    unrecov_fer
-       ld      r3,_CCR(r1)
-       ld      r4,_LINK(r1)
-       ld      r5,_CTR(r1)
-       ld      r6,_XER(r1)
-       mtcr    r3
-       mtlr    r4
-       mtctr   r5
-       mtxer   r6
-       REST_GPR(0, r1)
-       REST_8GPRS(2, r1)
-
-       mfmsr   r10
-       clrrdi  r10,r10,2               /* clear RI (LE is 0 already) */
-       mtmsrd  r10,1
-
-       mtspr   SPRN_SRR1,r12
-       mtspr   SPRN_SRR0,r11
-       REST_4GPRS(10, r1)
-       ld      r1,GPR1(r1)
-       rfid
-       b       .       /* prevent speculative execution */
-
-unrecov_fer:
-       bl      .save_nvgprs
-1:     addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .unrecoverable_exception
-       b       1b
-
-/*
- * Here r13 points to the paca, r9 contains the saved CR,
- * SRR0 and SRR1 are saved in r11 and r12,
- * r9 - r13 are saved in paca->exgen.
- */
-       .align  7
-       .globl data_access_common
-data_access_common:
-       RUNLATCH_ON(r10)                /* It wont fit in the 0x300 handler */
-       mfspr   r10,SPRN_DAR
-       std     r10,PACA_EXGEN+EX_DAR(r13)
-       mfspr   r10,SPRN_DSISR
-       stw     r10,PACA_EXGEN+EX_DSISR(r13)
-       EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)
-       ld      r3,PACA_EXGEN+EX_DAR(r13)
-       lwz     r4,PACA_EXGEN+EX_DSISR(r13)
-       li      r5,0x300
-       b       .do_hash_page           /* Try to handle as hpte fault */
-
-       .align  7
-       .globl instruction_access_common
-instruction_access_common:
-       EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)
-       ld      r3,_NIP(r1)
-       andis.  r4,r12,0x5820
-       li      r5,0x400
-       b       .do_hash_page           /* Try to handle as hpte fault */
-
-/*
- * Here is the common SLB miss user that is used when going to virtual
- * mode for SLB misses, that is currently not used
- */
-#ifdef __DISABLED__
-       .align  7
-       .globl  slb_miss_user_common
-slb_miss_user_common:
-       mflr    r10
-       std     r3,PACA_EXGEN+EX_DAR(r13)
-       stw     r9,PACA_EXGEN+EX_CCR(r13)
-       std     r10,PACA_EXGEN+EX_LR(r13)
-       std     r11,PACA_EXGEN+EX_SRR0(r13)
-       bl      .slb_allocate_user
-
-       ld      r10,PACA_EXGEN+EX_LR(r13)
-       ld      r3,PACA_EXGEN+EX_R3(r13)
-       lwz     r9,PACA_EXGEN+EX_CCR(r13)
-       ld      r11,PACA_EXGEN+EX_SRR0(r13)
-       mtlr    r10
-       beq-    slb_miss_fault
-
-       andi.   r10,r12,MSR_RI          /* check for unrecoverable exception */
-       beq-    unrecov_user_slb
-       mfmsr   r10
-
-.machine push
-.machine "power4"
-       mtcrf   0x80,r9
-.machine pop
-
-       clrrdi  r10,r10,2               /* clear RI before setting SRR0/1 */
-       mtmsrd  r10,1
-
-       mtspr   SRR0,r11
-       mtspr   SRR1,r12
-
-       ld      r9,PACA_EXGEN+EX_R9(r13)
-       ld      r10,PACA_EXGEN+EX_R10(r13)
-       ld      r11,PACA_EXGEN+EX_R11(r13)
-       ld      r12,PACA_EXGEN+EX_R12(r13)
-       ld      r13,PACA_EXGEN+EX_R13(r13)
-       rfid
-       b       .
-
-slb_miss_fault:
-       EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
-       ld      r4,PACA_EXGEN+EX_DAR(r13)
-       li      r5,0
-       std     r4,_DAR(r1)
-       std     r5,_DSISR(r1)
-       b       .handle_page_fault
-
-unrecov_user_slb:
-       EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
-       DISABLE_INTS
-       bl      .save_nvgprs
-1:     addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .unrecoverable_exception
-       b       1b
-
-#endif /* __DISABLED__ */
-
-
-/*
- * r13 points to the PACA, r9 contains the saved CR,
- * r12 contain the saved SRR1, SRR0 is still ready for return
- * r3 has the faulting address
- * r9 - r13 are saved in paca->exslb.
- * r3 is saved in paca->slb_r3
- * We assume we aren't going to take any exceptions during this procedure.
- */
-_GLOBAL(slb_miss_realmode)
-       mflr    r10
-
-       stw     r9,PACA_EXSLB+EX_CCR(r13)       /* save CR in exc. frame */
-       std     r10,PACA_EXSLB+EX_LR(r13)       /* save LR */
-
-       bl      .slb_allocate_realmode
-
-       /* All done -- return from exception. */
-
-       ld      r10,PACA_EXSLB+EX_LR(r13)
-       ld      r3,PACA_EXSLB+EX_R3(r13)
-       lwz     r9,PACA_EXSLB+EX_CCR(r13)       /* get saved CR */
-#ifdef CONFIG_PPC_ISERIES
-       ld      r11,PACALPPACA+LPPACASRR0(r13)  /* get SRR0 value */
-#endif /* CONFIG_PPC_ISERIES */
-
-       mtlr    r10
-
-       andi.   r10,r12,MSR_RI  /* check for unrecoverable exception */
-       beq-    unrecov_slb
-
-.machine       push
-.machine       "power4"
-       mtcrf   0x80,r9
-       mtcrf   0x01,r9         /* slb_allocate uses cr0 and cr7 */
-.machine       pop
-
-#ifdef CONFIG_PPC_ISERIES
-       mtspr   SPRN_SRR0,r11
-       mtspr   SPRN_SRR1,r12
-#endif /* CONFIG_PPC_ISERIES */
-       ld      r9,PACA_EXSLB+EX_R9(r13)
-       ld      r10,PACA_EXSLB+EX_R10(r13)
-       ld      r11,PACA_EXSLB+EX_R11(r13)
-       ld      r12,PACA_EXSLB+EX_R12(r13)
-       ld      r13,PACA_EXSLB+EX_R13(r13)
-       rfid
-       b       .       /* prevent speculative execution */
-
-unrecov_slb:
-       EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
-       DISABLE_INTS
-       bl      .save_nvgprs
-1:     addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .unrecoverable_exception
-       b       1b
-
-       .align  7
-       .globl hardware_interrupt_common
-       .globl hardware_interrupt_entry
-hardware_interrupt_common:
-       EXCEPTION_PROLOG_COMMON(0x500, PACA_EXGEN)
-hardware_interrupt_entry:
-       DISABLE_INTS
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .do_IRQ
-       b       .ret_from_except_lite
-
-       .align  7
-       .globl alignment_common
-alignment_common:
-       mfspr   r10,SPRN_DAR
-       std     r10,PACA_EXGEN+EX_DAR(r13)
-       mfspr   r10,SPRN_DSISR
-       stw     r10,PACA_EXGEN+EX_DSISR(r13)
-       EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN)
-       ld      r3,PACA_EXGEN+EX_DAR(r13)
-       lwz     r4,PACA_EXGEN+EX_DSISR(r13)
-       std     r3,_DAR(r1)
-       std     r4,_DSISR(r1)
-       bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       ENABLE_INTS
-       bl      .alignment_exception
-       b       .ret_from_except
-
-       .align  7
-       .globl program_check_common
-program_check_common:
-       EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
-       bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       ENABLE_INTS
-       bl      .program_check_exception
-       b       .ret_from_except
-
-       .align  7
-       .globl fp_unavailable_common
-fp_unavailable_common:
-       EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
-       bne     .load_up_fpu            /* if from user, just load it up */
-       bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       ENABLE_INTS
-       bl      .kernel_fp_unavailable_exception
-       BUG_OPCODE
-
-       .align  7
-       .globl altivec_unavailable_common
-altivec_unavailable_common:
-       EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN)
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
-       bne     .load_up_altivec        /* if from user, just load it up */
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif
-       bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       ENABLE_INTS
-       bl      .altivec_unavailable_exception
-       b       .ret_from_except
-
-#ifdef CONFIG_ALTIVEC
-/*
- * load_up_altivec(unused, unused, tsk)
- * Disable VMX for the task which had it previously,
- * and save its vector registers in its thread_struct.
- * Enables the VMX for use in the kernel on return.
- * On SMP we know the VMX is free, since we give it up every
- * switch (ie, no lazy save of the vector registers).
- * On entry: r13 == 'current' && last_task_used_altivec != 'current'
- */
-_STATIC(load_up_altivec)
-       mfmsr   r5                      /* grab the current MSR */
-       oris    r5,r5,MSR_VEC@h
-       mtmsrd  r5                      /* enable use of VMX now */
-       isync
-
-/*
- * For SMP, we don't do lazy VMX switching because it just gets too
- * horrendously complex, especially when a task switches from one CPU
- * to another.  Instead we call giveup_altvec in switch_to.
- * VRSAVE isn't dealt with here, that is done in the normal context
- * switch code. Note that we could rely on vrsave value to eventually
- * avoid saving all of the VREGs here...
- */
-#ifndef CONFIG_SMP
-       ld      r3,last_task_used_altivec@got(r2)
-       ld      r4,0(r3)
-       cmpdi   0,r4,0
-       beq     1f
-       /* Save VMX state to last_task_used_altivec's THREAD struct */
-       addi    r4,r4,THREAD
-       SAVE_32VRS(0,r5,r4)
-       mfvscr  vr0
-       li      r10,THREAD_VSCR
-       stvx    vr0,r10,r4
-       /* Disable VMX for last_task_used_altivec */
-       ld      r5,PT_REGS(r4)
-       ld      r4,_MSR-STACK_FRAME_OVERHEAD(r5)
-       lis     r6,MSR_VEC@h
-       andc    r4,r4,r6
-       std     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
-1:
-#endif /* CONFIG_SMP */
-       /* Hack: if we get an altivec unavailable trap with VRSAVE
-        * set to all zeros, we assume this is a broken application
-        * that fails to set it properly, and thus we switch it to
-        * all 1's
-        */
-       mfspr   r4,SPRN_VRSAVE
-       cmpdi   0,r4,0
-       bne+    1f
-       li      r4,-1
-       mtspr   SPRN_VRSAVE,r4
-1:
-       /* enable use of VMX after return */
-       ld      r4,PACACURRENT(r13)
-       addi    r5,r4,THREAD            /* Get THREAD */
-       oris    r12,r12,MSR_VEC@h
-       std     r12,_MSR(r1)
-       li      r4,1
-       li      r10,THREAD_VSCR
-       stw     r4,THREAD_USED_VR(r5)
-       lvx     vr0,r10,r5
-       mtvscr  vr0
-       REST_32VRS(0,r4,r5)
-#ifndef CONFIG_SMP
-       /* Update last_task_used_math to 'current' */
-       subi    r4,r5,THREAD            /* Back to 'current' */
-       std     r4,0(r3)
-#endif /* CONFIG_SMP */
-       /* restore registers and return */
-       b       fast_exception_return
-#endif /* CONFIG_ALTIVEC */
-
-/*
- * Hash table stuff
- */
-       .align  7
-_GLOBAL(do_hash_page)
-       std     r3,_DAR(r1)
-       std     r4,_DSISR(r1)
-
-       andis.  r0,r4,0xa450            /* weird error? */
-       bne-    .handle_page_fault      /* if not, try to insert a HPTE */
-BEGIN_FTR_SECTION
-       andis.  r0,r4,0x0020            /* Is it a segment table fault? */
-       bne-    .do_ste_alloc           /* If so handle it */
-END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
-
-       /*
-        * We need to set the _PAGE_USER bit if MSR_PR is set or if we are
-        * accessing a userspace segment (even from the kernel). We assume
-        * kernel addresses always have the high bit set.
-        */
-       rlwinm  r4,r4,32-25+9,31-9,31-9 /* DSISR_STORE -> _PAGE_RW */
-       rotldi  r0,r3,15                /* Move high bit into MSR_PR posn */
-       orc     r0,r12,r0               /* MSR_PR | ~high_bit */
-       rlwimi  r4,r0,32-13,30,30       /* becomes _PAGE_USER access bit */
-       ori     r4,r4,1                 /* add _PAGE_PRESENT */
-       rlwimi  r4,r5,22+2,31-2,31-2    /* Set _PAGE_EXEC if trap is 0x400 */
-
-       /*
-        * On iSeries, we soft-disable interrupts here, then
-        * hard-enable interrupts so that the hash_page code can spin on
-        * the hash_table_lock without problems on a shared processor.
-        */
-       DISABLE_INTS
-
-       /*
-        * r3 contains the faulting address
-        * r4 contains the required access permissions
-        * r5 contains the trap number
-        *
-        * at return r3 = 0 for success
-        */
-       bl      .hash_page              /* build HPTE if possible */
-       cmpdi   r3,0                    /* see if hash_page succeeded */
-
-#ifdef DO_SOFT_DISABLE
-       /*
-        * If we had interrupts soft-enabled at the point where the
-        * DSI/ISI occurred, and an interrupt came in during hash_page,
-        * handle it now.
-        * We jump to ret_from_except_lite rather than fast_exception_return
-        * because ret_from_except_lite will check for and handle pending
-        * interrupts if necessary.
-        */
-       beq     .ret_from_except_lite
-       /* For a hash failure, we don't bother re-enabling interrupts */
-       ble-    12f
-
-       /*
-        * hash_page couldn't handle it, set soft interrupt enable back
-        * to what it was before the trap.  Note that .local_irq_restore
-        * handles any interrupts pending at this point.
-        */
-       ld      r3,SOFTE(r1)
-       bl      .local_irq_restore
-       b       11f
-#else
-       beq     fast_exception_return   /* Return from exception on success */
-       ble-    12f                     /* Failure return from hash_page */
-
-       /* fall through */
-#endif
-
-/* Here we have a page fault that hash_page can't handle. */
-_GLOBAL(handle_page_fault)
-       ENABLE_INTS
-11:    ld      r4,_DAR(r1)
-       ld      r5,_DSISR(r1)
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      .do_page_fault
-       cmpdi   r3,0
-       beq+    .ret_from_except_lite
-       bl      .save_nvgprs
-       mr      r5,r3
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       lwz     r4,_DAR(r1)
-       bl      .bad_page_fault
-       b       .ret_from_except
-
-/* We have a page fault that hash_page could handle but HV refused
- * the PTE insertion
- */
-12:    bl      .save_nvgprs
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       lwz     r4,_DAR(r1)
-       bl      .low_hash_fault
-       b       .ret_from_except
-
-       /* here we have a segment miss */
-_GLOBAL(do_ste_alloc)
-       bl      .ste_allocate           /* try to insert stab entry */
-       cmpdi   r3,0
-       beq+    fast_exception_return
-       b       .handle_page_fault
-
-/*
- * r13 points to the PACA, r9 contains the saved CR,
- * r11 and r12 contain the saved SRR0 and SRR1.
- * r9 - r13 are saved in paca->exslb.
- * We assume we aren't going to take any exceptions during this procedure.
- * We assume (DAR >> 60) == 0xc.
- */
-       .align  7
-_GLOBAL(do_stab_bolted)
-       stw     r9,PACA_EXSLB+EX_CCR(r13)       /* save CR in exc. frame */
-       std     r11,PACA_EXSLB+EX_SRR0(r13)     /* save SRR0 in exc. frame */
-
-       /* Hash to the primary group */
-       ld      r10,PACASTABVIRT(r13)
-       mfspr   r11,SPRN_DAR
-       srdi    r11,r11,28
-       rldimi  r10,r11,7,52    /* r10 = first ste of the group */
-
-       /* Calculate VSID */
-       /* This is a kernel address, so protovsid = ESID */
-       ASM_VSID_SCRAMBLE(r11, r9)
-       rldic   r9,r11,12,16    /* r9 = vsid << 12 */
-
-       /* Search the primary group for a free entry */
-1:     ld      r11,0(r10)      /* Test valid bit of the current ste    */
-       andi.   r11,r11,0x80
-       beq     2f
-       addi    r10,r10,16
-       andi.   r11,r10,0x70
-       bne     1b
-
-       /* Stick for only searching the primary group for now.          */
-       /* At least for now, we use a very simple random castout scheme */
-       /* Use the TB as a random number ;  OR in 1 to avoid entry 0    */
-       mftb    r11
-       rldic   r11,r11,4,57    /* r11 = (r11 << 4) & 0x70 */
-       ori     r11,r11,0x10
-
-       /* r10 currently points to an ste one past the group of interest */
-       /* make it point to the randomly selected entry                 */
-       subi    r10,r10,128
-       or      r10,r10,r11     /* r10 is the entry to invalidate       */
-
-       isync                   /* mark the entry invalid               */
-       ld      r11,0(r10)
-       rldicl  r11,r11,56,1    /* clear the valid bit */
-       rotldi  r11,r11,8
-       std     r11,0(r10)
-       sync
-
-       clrrdi  r11,r11,28      /* Get the esid part of the ste         */
-       slbie   r11
-
-2:     std     r9,8(r10)       /* Store the vsid part of the ste       */
-       eieio
-
-       mfspr   r11,SPRN_DAR            /* Get the new esid                     */
-       clrrdi  r11,r11,28      /* Permits a full 32b of ESID           */
-       ori     r11,r11,0x90    /* Turn on valid and kp                 */
-       std     r11,0(r10)      /* Put new entry back into the stab     */
-
-       sync
-
-       /* All done -- return from exception. */
-       lwz     r9,PACA_EXSLB+EX_CCR(r13)       /* get saved CR */
-       ld      r11,PACA_EXSLB+EX_SRR0(r13)     /* get saved SRR0 */
-
-       andi.   r10,r12,MSR_RI
-       beq-    unrecov_slb
-
-       mtcrf   0x80,r9                 /* restore CR */
-
-       mfmsr   r10
-       clrrdi  r10,r10,2
-       mtmsrd  r10,1
-
-       mtspr   SPRN_SRR0,r11
-       mtspr   SPRN_SRR1,r12
-       ld      r9,PACA_EXSLB+EX_R9(r13)
-       ld      r10,PACA_EXSLB+EX_R10(r13)
-       ld      r11,PACA_EXSLB+EX_R11(r13)
-       ld      r12,PACA_EXSLB+EX_R12(r13)
-       ld      r13,PACA_EXSLB+EX_R13(r13)
-       rfid
-       b       .       /* prevent speculative execution */
-
-/*
- * Space for CPU0's segment table.
- *
- * On iSeries, the hypervisor must fill in at least one entry before
- * we get control (with relocate on).  The address is give to the hv
- * as a page number (see xLparMap in lpardata.c), so this must be at a
- * fixed address (the linker can't compute (u64)&initial_stab >>
- * PAGE_SHIFT).
- */
-       . = STAB0_PHYS_ADDR     /* 0x6000 */
-       .globl initial_stab
-initial_stab:
-       .space  4096
-
-/*
- * Data area reserved for FWNMI option.
- * This address (0x7000) is fixed by the RPA.
- */
-       .= 0x7000
-       .globl fwnmi_data_area
-fwnmi_data_area:
-
-       /* iSeries does not use the FWNMI stuff, so it is safe to put
-        * this here, even if we later allow kernels that will boot on
-        * both pSeries and iSeries */
-#ifdef CONFIG_PPC_ISERIES
-        . = LPARMAP_PHYS
-#include "lparmap.s"
-/*
- * This ".text" is here for old compilers that generate a trailing
- * .note section when compiling .c files to .s
- */
-       .text
-#endif /* CONFIG_PPC_ISERIES */
-
-        . = 0x8000
-
-/*
- * On pSeries, secondary processors spin in the following code.
- * At entry, r3 = this processor's number (physical cpu id)
- */
-_GLOBAL(pSeries_secondary_smp_init)
-       mr      r24,r3
-       
-       /* turn on 64-bit mode */
-       bl      .enable_64b_mode
-       isync
-
-       /* Copy some CPU settings from CPU 0 */
-       bl      .__restore_cpu_setup
-
-       /* Set up a paca value for this processor. Since we have the
-        * physical cpu id in r24, we need to search the pacas to find
-        * which logical id maps to our physical one.
-        */
-       LOADADDR(r13, paca)             /* Get base vaddr of paca array  */
-       li      r5,0                    /* logical cpu id                */
-1:     lhz     r6,PACAHWCPUID(r13)     /* Load HW procid from paca      */
-       cmpw    r6,r24                  /* Compare to our id             */
-       beq     2f
-       addi    r13,r13,PACA_SIZE       /* Loop to next PACA on miss     */
-       addi    r5,r5,1
-       cmpwi   r5,NR_CPUS
-       blt     1b
-
-       mr      r3,r24                  /* not found, copy phys to r3    */
-       b       .kexec_wait             /* next kernel might do better   */
-
-2:     mtspr   SPRN_SPRG3,r13          /* Save vaddr of paca in SPRG3   */
-       /* From now on, r24 is expected to be logical cpuid */
-       mr      r24,r5
-3:     HMT_LOW
-       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor should */
-                                       /* start.                        */
-       sync
-
-       /* Create a temp kernel stack for use before relocation is on.  */
-       ld      r1,PACAEMERGSP(r13)
-       subi    r1,r1,STACK_FRAME_OVERHEAD
-
-       cmpwi   0,r23,0
-#ifdef CONFIG_SMP
-       bne     .__secondary_start
-#endif
-       b       3b                      /* Loop until told to go         */
-
-#ifdef CONFIG_PPC_ISERIES
-_STATIC(__start_initialization_iSeries)
-       /* Clear out the BSS */
-       LOADADDR(r11,__bss_stop)
-       LOADADDR(r8,__bss_start)
-       sub     r11,r11,r8              /* bss size                     */
-       addi    r11,r11,7               /* round up to an even double word */
-       rldicl. r11,r11,61,3            /* shift right by 3             */
-       beq     4f
-       addi    r8,r8,-8
-       li      r0,0
-       mtctr   r11                     /* zero this many doublewords   */
-3:     stdu    r0,8(r8)
-       bdnz    3b
-4:
-       LOADADDR(r1,init_thread_union)
-       addi    r1,r1,THREAD_SIZE
-       li      r0,0
-       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
-
-       LOADADDR(r3,cpu_specs)
-       LOADADDR(r4,cur_cpu_spec)
-       li      r5,0
-       bl      .identify_cpu
-
-       LOADADDR(r2,__toc_start)
-       addi    r2,r2,0x4000
-       addi    r2,r2,0x4000
-
-       bl      .iSeries_early_setup
-       bl      .early_setup
-
-       /* relocation is on at this point */
-
-       b       .start_here_common
-#endif /* CONFIG_PPC_ISERIES */
-
-#ifdef CONFIG_PPC_MULTIPLATFORM
-
-_STATIC(__mmu_off)
-       mfmsr   r3
-       andi.   r0,r3,MSR_IR|MSR_DR
-       beqlr
-       andc    r3,r3,r0
-       mtspr   SPRN_SRR0,r4
-       mtspr   SPRN_SRR1,r3
-       sync
-       rfid
-       b       .       /* prevent speculative execution */
-
-
-/*
- * Here is our main kernel entry point. We support currently 2 kind of entries
- * depending on the value of r5.
- *
- *   r5 != NULL -> OF entry, we go to prom_init, "legacy" parameter content
- *                 in r3...r7
- *   
- *   r5 == NULL -> kexec style entry. r3 is a physical pointer to the
- *                 DT block, r4 is a physical pointer to the kernel itself
- *
- */
-_GLOBAL(__start_initialization_multiplatform)
-       /*
-        * Are we booted from a PROM Of-type client-interface ?
-        */
-       cmpldi  cr0,r5,0
-       bne     .__boot_from_prom               /* yes -> prom */
-
-       /* Save parameters */
-       mr      r31,r3
-       mr      r30,r4
-
-       /* Make sure we are running in 64 bits mode */
-       bl      .enable_64b_mode
-
-       /* Setup some critical 970 SPRs before switching MMU off */
-       bl      .__970_cpu_preinit
-
-       /* cpu # */
-       li      r24,0
-
-       /* Switch off MMU if not already */
-       LOADADDR(r4, .__after_prom_start - KERNELBASE)
-       add     r4,r4,r30
-       bl      .__mmu_off
-       b       .__after_prom_start
-
-_STATIC(__boot_from_prom)
-       /* Save parameters */
-       mr      r31,r3
-       mr      r30,r4
-       mr      r29,r5
-       mr      r28,r6
-       mr      r27,r7
-
-       /* Make sure we are running in 64 bits mode */
-       bl      .enable_64b_mode
-
-       /* put a relocation offset into r3 */
-       bl      .reloc_offset
-
-       LOADADDR(r2,__toc_start)
-       addi    r2,r2,0x4000
-       addi    r2,r2,0x4000
-
-       /* Relocate the TOC from a virt addr to a real addr */
-       sub     r2,r2,r3
-
-       /* Restore parameters */
-       mr      r3,r31
-       mr      r4,r30
-       mr      r5,r29
-       mr      r6,r28
-       mr      r7,r27
-
-       /* Do all of the interaction with OF client interface */
-       bl      .prom_init
-       /* We never return */
-       trap
-
-/*
- * At this point, r3 contains the physical address we are running at,
- * returned by prom_init()
- */
-_STATIC(__after_prom_start)
-
-/*
- * We need to run with __start at physical address 0.
- * This will leave some code in the first 256B of
- * real memory, which are reserved for software use.
- * The remainder of the first page is loaded with the fixed
- * interrupt vectors.  The next two pages are filled with
- * unknown exception placeholders.
- *
- * Note: This process overwrites the OF exception vectors.
- *     r26 == relocation offset
- *     r27 == KERNELBASE
- */
-       bl      .reloc_offset
-       mr      r26,r3
-       SET_REG_TO_CONST(r27,KERNELBASE)
-
-       li      r3,0                    /* target addr */
-
-       // XXX FIXME: Use phys returned by OF (r30)
-       sub     r4,r27,r26              /* source addr                   */
-                                       /* current address of _start     */
-                                       /*   i.e. where we are running   */
-                                       /*      the source addr          */
-
-       LOADADDR(r5,copy_to_here)       /* # bytes of memory to copy     */
-       sub     r5,r5,r27
-
-       li      r6,0x100                /* Start offset, the first 0x100 */
-                                       /* bytes were copied earlier.    */
-
-       bl      .copy_and_flush         /* copy the first n bytes        */
-                                       /* this includes the code being  */
-                                       /* executed here.                */
-
-       LOADADDR(r0, 4f)                /* Jump to the copy of this code */
-       mtctr   r0                      /* that we just made/relocated   */
-       bctr
-
-4:     LOADADDR(r5,klimit)
-       sub     r5,r5,r26
-       ld      r5,0(r5)                /* get the value of klimit */
-       sub     r5,r5,r27
-       bl      .copy_and_flush         /* copy the rest */
-       b       .start_here_multiplatform
-
-#endif /* CONFIG_PPC_MULTIPLATFORM */
-
-/*
- * Copy routine used to copy the kernel to start at physical address 0
- * and flush and invalidate the caches as needed.
- * r3 = dest addr, r4 = source addr, r5 = copy limit, r6 = start offset
- * on exit, r3, r4, r5 are unchanged, r6 is updated to be >= r5.
- *
- * Note: this routine *only* clobbers r0, r6 and lr
- */
-_GLOBAL(copy_and_flush)
-       addi    r5,r5,-8
-       addi    r6,r6,-8
-4:     li      r0,16                   /* Use the least common         */
-                                       /* denominator cache line       */
-                                       /* size.  This results in       */
-                                       /* extra cache line flushes     */
-                                       /* but operation is correct.    */
-                                       /* Can't get cache line size    */
-                                       /* from NACA as it is being     */
-                                       /* moved too.                   */
-
-       mtctr   r0                      /* put # words/line in ctr      */
-3:     addi    r6,r6,8                 /* copy a cache line            */
-       ldx     r0,r6,r4
-       stdx    r0,r6,r3
-       bdnz    3b
-       dcbst   r6,r3                   /* write it to memory           */
-       sync
-       icbi    r6,r3                   /* flush the icache line        */
-       cmpld   0,r6,r5
-       blt     4b
-       sync
-       addi    r5,r5,8
-       addi    r6,r6,8
-       blr
-
-.align 8
-copy_to_here:
-
-#ifdef CONFIG_SMP
-#ifdef CONFIG_PPC_PMAC
-/*
- * On PowerMac, secondary processors starts from the reset vector, which
- * is temporarily turned into a call to one of the functions below.
- */
-       .section ".text";
-       .align 2 ;
-
-       .globl  __secondary_start_pmac_0
-__secondary_start_pmac_0:
-       /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */
-       li      r24,0
-       b       1f
-       li      r24,1
-       b       1f
-       li      r24,2
-       b       1f
-       li      r24,3
-1:
-       
-_GLOBAL(pmac_secondary_start)
-       /* turn on 64-bit mode */
-       bl      .enable_64b_mode
-       isync
-
-       /* Copy some CPU settings from CPU 0 */
-       bl      .__restore_cpu_setup
-
-       /* pSeries do that early though I don't think we really need it */
-       mfmsr   r3
-       ori     r3,r3,MSR_RI
-       mtmsrd  r3                      /* RI on */
-
-       /* Set up a paca value for this processor. */
-       LOADADDR(r4, paca)               /* Get base vaddr of paca array        */
-       mulli   r13,r24,PACA_SIZE        /* Calculate vaddr of right paca */
-       add     r13,r13,r4              /* for this processor.          */
-       mtspr   SPRN_SPRG3,r13           /* Save vaddr of paca in SPRG3 */
-
-       /* Create a temp kernel stack for use before relocation is on.  */
-       ld      r1,PACAEMERGSP(r13)
-       subi    r1,r1,STACK_FRAME_OVERHEAD
-
-       b       .__secondary_start
-
-#endif /* CONFIG_PPC_PMAC */
-
-/*
- * This function is called after the master CPU has released the
- * secondary processors.  The execution environment is relocation off.
- * The paca for this processor has the following fields initialized at
- * this point:
- *   1. Processor number
- *   2. Segment table pointer (virtual address)
- * On entry the following are set:
- *   r1        = stack pointer.  vaddr for iSeries, raddr (temp stack) for pSeries
- *   r24   = cpu# (in Linux terms)
- *   r13   = paca virtual address
- *   SPRG3 = paca virtual address
- */
-_GLOBAL(__secondary_start)
-
-       HMT_MEDIUM                      /* Set thread priority to MEDIUM */
-
-       ld      r2,PACATOC(r13)
-
-       /* Do early setup for that CPU */
-       bl      .early_setup_secondary
-
-       /* Initialize the kernel stack.  Just a repeat for iSeries.      */
-       LOADADDR(r3,current_set)
-       sldi    r28,r24,3               /* get current_set[cpu#]         */
-       ldx     r1,r3,r28
-       addi    r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
-       std     r1,PACAKSAVE(r13)
-
-       li      r7,0
-       mtlr    r7
-
-       /* enable MMU and jump to start_secondary */
-       LOADADDR(r3,.start_secondary_prolog)
-       SET_REG_TO_CONST(r4, MSR_KERNEL)
-#ifdef DO_SOFT_DISABLE
-       ori     r4,r4,MSR_EE
-#endif
-       mtspr   SPRN_SRR0,r3
-       mtspr   SPRN_SRR1,r4
-       rfid
-       b       .       /* prevent speculative execution */
-
-/* 
- * Running with relocation on at this point.  All we want to do is
- * zero the stack back-chain pointer before going into C code.
- */
-_GLOBAL(start_secondary_prolog)
-       li      r3,0
-       std     r3,0(r1)                /* Zero the stack frame pointer */
-       bl      .start_secondary
-#endif
-
-/*
- * This subroutine clobbers r11 and r12
- */
-_GLOBAL(enable_64b_mode)
-       mfmsr   r11                     /* grab the current MSR */
-       li      r12,1
-       rldicr  r12,r12,MSR_SF_LG,(63-MSR_SF_LG)
-       or      r11,r11,r12
-       li      r12,1
-       rldicr  r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG)
-       or      r11,r11,r12
-       mtmsrd  r11
-       isync
-       blr
-
-#ifdef CONFIG_PPC_MULTIPLATFORM
-/*
- * This is where the main kernel code starts.
- */
-_STATIC(start_here_multiplatform)
-       /* get a new offset, now that the kernel has moved. */
-       bl      .reloc_offset
-       mr      r26,r3
-
-       /* Clear out the BSS. It may have been done in prom_init,
-        * already but that's irrelevant since prom_init will soon
-        * be detached from the kernel completely. Besides, we need
-        * to clear it now for kexec-style entry.
-        */
-       LOADADDR(r11,__bss_stop)
-       LOADADDR(r8,__bss_start)
-       sub     r11,r11,r8              /* bss size                     */
-       addi    r11,r11,7               /* round up to an even double word */
-       rldicl. r11,r11,61,3            /* shift right by 3             */
-       beq     4f
-       addi    r8,r8,-8
-       li      r0,0
-       mtctr   r11                     /* zero this many doublewords   */
-3:     stdu    r0,8(r8)
-       bdnz    3b
-4:
-
-       mfmsr   r6
-       ori     r6,r6,MSR_RI
-       mtmsrd  r6                      /* RI on */
-
-#ifdef CONFIG_HMT
-       /* Start up the second thread on cpu 0 */
-       mfspr   r3,SPRN_PVR
-       srwi    r3,r3,16
-       cmpwi   r3,0x34                 /* Pulsar  */
-       beq     90f
-       cmpwi   r3,0x36                 /* Icestar */
-       beq     90f
-       cmpwi   r3,0x37                 /* SStar   */
-       beq     90f
-       b       91f                     /* HMT not supported */
-90:    li      r3,0
-       bl      .hmt_start_secondary
-91:
-#endif
-
-       /* The following gets the stack and TOC set up with the regs */
-       /* pointing to the real addr of the kernel stack.  This is   */
-       /* all done to support the C function call below which sets  */
-       /* up the htab.  This is done because we have relocated the  */
-       /* kernel but are still running in real mode. */
-
-       LOADADDR(r3,init_thread_union)
-       sub     r3,r3,r26
-
-       /* set up a stack pointer (physical address) */
-       addi    r1,r3,THREAD_SIZE
-       li      r0,0
-       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
-
-       /* set up the TOC (physical address) */
-       LOADADDR(r2,__toc_start)
-       addi    r2,r2,0x4000
-       addi    r2,r2,0x4000
-       sub     r2,r2,r26
-
-       LOADADDR(r3,cpu_specs)
-       sub     r3,r3,r26
-       LOADADDR(r4,cur_cpu_spec)
-       sub     r4,r4,r26
-       mr      r5,r26
-       bl      .identify_cpu
-
-       /* Save some low level config HIDs of CPU0 to be copied to
-        * other CPUs later on, or used for suspend/resume
-        */
-       bl      .__save_cpu_setup
-       sync
-
-       /* Setup a valid physical PACA pointer in SPRG3 for early_setup
-        * note that boot_cpuid can always be 0 nowadays since there is
-        * nowhere it can be initialized differently before we reach this
-        * code
-        */
-       LOADADDR(r27, boot_cpuid)
-       sub     r27,r27,r26
-       lwz     r27,0(r27)
-
-       LOADADDR(r24, paca)             /* Get base vaddr of paca array  */
-       mulli   r13,r27,PACA_SIZE       /* Calculate vaddr of right paca */
-       add     r13,r13,r24             /* for this processor.           */
-       sub     r13,r13,r26             /* convert to physical addr      */
-       mtspr   SPRN_SPRG3,r13          /* PPPBBB: Temp... -Peter */
-       
-       /* Do very early kernel initializations, including initial hash table,
-        * stab and slb setup before we turn on relocation.     */
-
-       /* Restore parameters passed from prom_init/kexec */
-       mr      r3,r31
-       bl      .early_setup
-
-       LOADADDR(r3,.start_here_common)
-       SET_REG_TO_CONST(r4, MSR_KERNEL)
-       mtspr   SPRN_SRR0,r3
-       mtspr   SPRN_SRR1,r4
-       rfid
-       b       .       /* prevent speculative execution */
-#endif /* CONFIG_PPC_MULTIPLATFORM */
-       
-       /* This is where all platforms converge execution */
-_STATIC(start_here_common)
-       /* relocation is on at this point */
-
-       /* The following code sets up the SP and TOC now that we are */
-       /* running with translation enabled. */
-
-       LOADADDR(r3,init_thread_union)
-
-       /* set up the stack */
-       addi    r1,r3,THREAD_SIZE
-       li      r0,0
-       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
-
-       /* Apply the CPUs-specific fixups (nop out sections not relevant
-        * to this CPU
-        */
-       li      r3,0
-       bl      .do_cpu_ftr_fixups
-
-       LOADADDR(r26, boot_cpuid)
-       lwz     r26,0(r26)
-
-       LOADADDR(r24, paca)             /* Get base vaddr of paca array  */
-       mulli   r13,r26,PACA_SIZE       /* Calculate vaddr of right paca */
-       add     r13,r13,r24             /* for this processor.           */
-       mtspr   SPRN_SPRG3,r13
-
-       /* ptr to current */
-       LOADADDR(r4,init_task)
-       std     r4,PACACURRENT(r13)
-
-       /* Load the TOC */
-       ld      r2,PACATOC(r13)
-       std     r1,PACAKSAVE(r13)
-
-       bl      .setup_system
-
-       /* Load up the kernel context */
-5:
-#ifdef DO_SOFT_DISABLE
-       li      r5,0
-       stb     r5,PACAPROCENABLED(r13) /* Soft Disabled */
-       mfmsr   r5
-       ori     r5,r5,MSR_EE            /* Hard Enabled */
-       mtmsrd  r5
-#endif
-
-       bl .start_kernel
-
-_GLOBAL(hmt_init)
-#ifdef CONFIG_HMT
-       LOADADDR(r5, hmt_thread_data)
-       mfspr   r7,SPRN_PVR
-       srwi    r7,r7,16
-       cmpwi   r7,0x34                 /* Pulsar  */
-       beq     90f
-       cmpwi   r7,0x36                 /* Icestar */
-       beq     91f
-       cmpwi   r7,0x37                 /* SStar   */
-       beq     91f
-       b       101f
-90:    mfspr   r6,SPRN_PIR
-       andi.   r6,r6,0x1f
-       b       92f
-91:    mfspr   r6,SPRN_PIR
-       andi.   r6,r6,0x3ff
-92:    sldi    r4,r24,3
-       stwx    r6,r5,r4
-       bl      .hmt_start_secondary
-       b       101f
-
-__hmt_secondary_hold:
-       LOADADDR(r5, hmt_thread_data)
-       clrldi  r5,r5,4
-       li      r7,0
-       mfspr   r6,SPRN_PIR
-       mfspr   r8,SPRN_PVR
-       srwi    r8,r8,16
-       cmpwi   r8,0x34
-       bne     93f
-       andi.   r6,r6,0x1f
-       b       103f
-93:    andi.   r6,r6,0x3f
-
-103:   lwzx    r8,r5,r7
-       cmpw    r8,r6
-       beq     104f
-       addi    r7,r7,8
-       b       103b
-
-104:   addi    r7,r7,4
-       lwzx    r9,r5,r7
-       mr      r24,r9
-101:
-#endif
-       mr      r3,r24
-       b       .pSeries_secondary_smp_init
-
-#ifdef CONFIG_HMT
-_GLOBAL(hmt_start_secondary)
-       LOADADDR(r4,__hmt_secondary_hold)
-       clrldi  r4,r4,4
-       mtspr   SPRN_NIADORM, r4
-       mfspr   r4, SPRN_MSRDORM
-       li      r5, -65
-       and     r4, r4, r5
-       mtspr   SPRN_MSRDORM, r4
-       lis     r4,0xffef
-       ori     r4,r4,0x7403
-       mtspr   SPRN_TSC, r4
-       li      r4,0x1f4
-       mtspr   SPRN_TST, r4
-       mfspr   r4, SPRN_HID0
-       ori     r4, r4, 0x1
-       mtspr   SPRN_HID0, r4
-       mfspr   r4, SPRN_CTRLF
-       oris    r4, r4, 0x40
-       mtspr   SPRN_CTRLT, r4
-       blr
-#endif
-
-/*
- * We put a few things here that have to be page-aligned.
- * This stuff goes at the beginning of the bss, which is page-aligned.
- */
-       .section ".bss"
-
-       .align  PAGE_SHIFT
-
-       .globl  empty_zero_page
-empty_zero_page:
-       .space  PAGE_SIZE
-
-       .globl  swapper_pg_dir
-swapper_pg_dir:
-       .space  PAGE_SIZE
-
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * Used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  COMMAND_LINE_SIZE
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S
deleted file mode 100644 (file)
index 492bca6..0000000
+++ /dev/null
@@ -1,939 +0,0 @@
-/*
- *  arch/ppc/kernel/misc.S
- *
- *  
- *
- * This file contains miscellaneous low-level functions.
- *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
- *
- * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
- * and Paul Mackerras.
- * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
- * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) 
- * 
- * 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/config.h>
-#include <linux/sys.h>
-#include <asm/unistd.h>
-#include <asm/errno.h>
-#include <asm/processor.h>
-#include <asm/page.h>
-#include <asm/cache.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/cputable.h>
-#include <asm/thread_info.h>
-
-       .text
-
-/*
- * Returns (address we were linked at) - (address we are running at)
- * for use before the text and data are mapped to KERNELBASE.
- */
-
-_GLOBAL(reloc_offset)
-       mflr    r0
-       bl      1f
-1:     mflr    r3
-       LOADADDR(r4,1b)
-       sub     r3,r4,r3
-       mtlr    r0
-       blr
-
-_GLOBAL(get_msr)
-       mfmsr   r3
-       blr
-
-_GLOBAL(get_dar)
-       mfdar   r3
-       blr
-
-_GLOBAL(get_srr0)
-       mfsrr0  r3
-       blr
-
-_GLOBAL(get_srr1)
-       mfsrr1  r3
-       blr
-       
-_GLOBAL(get_sp)
-       mr      r3,r1
-       blr
-
-#ifdef CONFIG_IRQSTACKS
-_GLOBAL(call_do_softirq)
-       mflr    r0
-       std     r0,16(r1)
-       stdu    r1,THREAD_SIZE-112(r3)
-       mr      r1,r3
-       bl      .__do_softirq
-       ld      r1,0(r1)
-       ld      r0,16(r1)
-       mtlr    r0
-       blr
-
-_GLOBAL(call___do_IRQ)
-       mflr    r0
-       std     r0,16(r1)
-       stdu    r1,THREAD_SIZE-112(r5)
-       mr      r1,r5
-       bl      .__do_IRQ
-       ld      r1,0(r1)
-       ld      r0,16(r1)
-       mtlr    r0
-       blr
-#endif /* CONFIG_IRQSTACKS */
-
-       /*
- * To be called by C code which needs to do some operations with MMU
- * disabled. Note that interrupts have to be disabled by the caller
- * prior to calling us. The code called _MUST_ be in the RMO of course
- * and part of the linear mapping as we don't attempt to translate the
- * stack pointer at all. The function is called with the stack switched
- * to this CPU emergency stack
- *
- * prototype is void *call_with_mmu_off(void *func, void *data);
- *
- * the called function is expected to be of the form
- *
- * void *called(void *data); 
- */
-_GLOBAL(call_with_mmu_off)
-       mflr    r0                      /* get link, save it on stackframe */
-       std     r0,16(r1)
-       mr      r1,r5                   /* save old stack ptr */
-       ld      r1,PACAEMERGSP(r13)     /* get emerg. stack */
-       subi    r1,r1,STACK_FRAME_OVERHEAD
-       std     r0,16(r1)               /* save link on emerg. stack */
-       std     r5,0(r1)                /* save old stack ptr in backchain */
-       ld      r3,0(r3)                /* get to real function ptr (assume same TOC) */
-       bl      2f                      /* we need LR to return, continue at label 2 */
-
-       ld      r0,16(r1)               /* we return here from the call, get LR and */
-       ld      r1,0(r1)                /* .. old stack ptr */
-       mtspr   SPRN_SRR0,r0            /* and get back to virtual mode with these */
-       mfmsr   r4
-       ori     r4,r4,MSR_IR|MSR_DR
-       mtspr   SPRN_SRR1,r4
-       rfid
-
-2:     mtspr   SPRN_SRR0,r3            /* coming from above, enter real mode */
-       mr      r3,r4                   /* get parameter */
-       mfmsr   r0
-       ori     r0,r0,MSR_IR|MSR_DR
-       xori    r0,r0,MSR_IR|MSR_DR
-       mtspr   SPRN_SRR1,r0
-       rfid
-
-
-       .section        ".toc","aw"
-PPC64_CACHES:
-       .tc             ppc64_caches[TC],ppc64_caches
-       .section        ".text"
-
-/*
- * Write any modified data cache blocks out to memory
- * and invalidate the corresponding instruction cache blocks.
- *
- * flush_icache_range(unsigned long start, unsigned long stop)
- *
- *   flush all bytes from start through stop-1 inclusive
- */
-
-_KPROBE(__flush_icache_range)
-
-/*
- * Flush the data cache to memory 
- * 
- * Different systems have different cache line sizes
- * and in some cases i-cache and d-cache line sizes differ from
- * each other.
- */
-       ld      r10,PPC64_CACHES@toc(r2)
-       lwz     r7,DCACHEL1LINESIZE(r10)/* Get cache line size */
-       addi    r5,r7,-1
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of cache line size */
-       srw.    r8,r8,r9                /* compute line count */
-       beqlr                           /* nothing to do? */
-       mtctr   r8
-1:     dcbst   0,r6
-       add     r6,r6,r7
-       bdnz    1b
-       sync
-
-/* Now invalidate the instruction cache */
-       
-       lwz     r7,ICACHEL1LINESIZE(r10)        /* Get Icache line size */
-       addi    r5,r7,-1
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5
-       lwz     r9,ICACHEL1LOGLINESIZE(r10)     /* Get log-2 of Icache line size */
-       srw.    r8,r8,r9                /* compute line count */
-       beqlr                           /* nothing to do? */
-       mtctr   r8
-2:     icbi    0,r6
-       add     r6,r6,r7
-       bdnz    2b
-       isync
-       blr
-       .previous .text
-/*
- * Like above, but only do the D-cache.
- *
- * flush_dcache_range(unsigned long start, unsigned long stop)
- *
- *    flush all bytes from start to stop-1 inclusive
- */
-_GLOBAL(flush_dcache_range)
-
-/*
- * Flush the data cache to memory 
- * 
- * Different systems have different cache line sizes
- */
-       ld      r10,PPC64_CACHES@toc(r2)
-       lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
-       addi    r5,r7,-1
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
-       srw.    r8,r8,r9                /* compute line count */
-       beqlr                           /* nothing to do? */
-       mtctr   r8
-0:     dcbst   0,r6
-       add     r6,r6,r7
-       bdnz    0b
-       sync
-       blr
-
-/*
- * Like above, but works on non-mapped physical addresses.
- * Use only for non-LPAR setups ! It also assumes real mode
- * is cacheable. Used for flushing out the DART before using
- * it as uncacheable memory 
- *
- * flush_dcache_phys_range(unsigned long start, unsigned long stop)
- *
- *    flush all bytes from start to stop-1 inclusive
- */
-_GLOBAL(flush_dcache_phys_range)
-       ld      r10,PPC64_CACHES@toc(r2)
-       lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
-       addi    r5,r7,-1
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
-       srw.    r8,r8,r9                /* compute line count */
-       beqlr                           /* nothing to do? */
-       mfmsr   r5                      /* Disable MMU Data Relocation */
-       ori     r0,r5,MSR_DR
-       xori    r0,r0,MSR_DR
-       sync
-       mtmsr   r0
-       sync
-       isync
-       mtctr   r8
-0:     dcbst   0,r6
-       add     r6,r6,r7
-       bdnz    0b
-       sync
-       isync
-       mtmsr   r5                      /* Re-enable MMU Data Relocation */
-       sync
-       isync
-       blr
-
-_GLOBAL(flush_inval_dcache_range)
-       ld      r10,PPC64_CACHES@toc(r2)
-       lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
-       addi    r5,r7,-1
-       andc    r6,r3,r5                /* round low to line bdy */
-       subf    r8,r6,r4                /* compute length */
-       add     r8,r8,r5                /* ensure we get enough */
-       lwz     r9,DCACHEL1LOGLINESIZE(r10)/* Get log-2 of dcache line size */
-       srw.    r8,r8,r9                /* compute line count */
-       beqlr                           /* nothing to do? */
-       sync
-       isync
-       mtctr   r8
-0:     dcbf    0,r6
-       add     r6,r6,r7
-       bdnz    0b
-       sync
-       isync
-       blr
-
-
-/*
- * Flush a particular page from the data cache to RAM.
- * Note: this is necessary because the instruction cache does *not*
- * snoop from the data cache.
- *
- *     void __flush_dcache_icache(void *page)
- */
-_GLOBAL(__flush_dcache_icache)
-/*
- * Flush the data cache to memory 
- * 
- * Different systems have different cache line sizes
- */
-
-/* Flush the dcache */
-       ld      r7,PPC64_CACHES@toc(r2)
-       clrrdi  r3,r3,PAGE_SHIFT                    /* Page align */
-       lwz     r4,DCACHEL1LINESPERPAGE(r7)     /* Get # dcache lines per page */
-       lwz     r5,DCACHEL1LINESIZE(r7)         /* Get dcache line size */
-       mr      r6,r3
-       mtctr   r4
-0:     dcbst   0,r6
-       add     r6,r6,r5
-       bdnz    0b
-       sync
-
-/* Now invalidate the icache */        
-
-       lwz     r4,ICACHEL1LINESPERPAGE(r7)     /* Get # icache lines per page */
-       lwz     r5,ICACHEL1LINESIZE(r7)         /* Get icache line size */
-       mtctr   r4
-1:     icbi    0,r3
-       add     r3,r3,r5
-       bdnz    1b
-       isync
-       blr
-       
-/*
- * I/O string operations
- *
- * insb(port, buf, len)
- * outsb(port, buf, len)
- * insw(port, buf, len)
- * outsw(port, buf, len)
- * insl(port, buf, len)
- * outsl(port, buf, len)
- * insw_ns(port, buf, len)
- * outsw_ns(port, buf, len)
- * insl_ns(port, buf, len)
- * outsl_ns(port, buf, len)
- *
- * The *_ns versions don't do byte-swapping.
- */
-_GLOBAL(_insb)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,1
-       blelr-
-00:    lbz     r5,0(r3)
-       eieio
-       stbu    r5,1(r4)
-       bdnz    00b
-       twi     0,r5,0
-       isync
-       blr
-
-_GLOBAL(_outsb)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,1
-       blelr-
-00:    lbzu    r5,1(r4)
-       stb     r5,0(r3)
-       bdnz    00b
-       sync
-       blr     
-
-_GLOBAL(_insw)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,2
-       blelr-
-00:    lhbrx   r5,0,r3
-       eieio
-       sthu    r5,2(r4)
-       bdnz    00b
-       twi     0,r5,0
-       isync
-       blr
-
-_GLOBAL(_outsw)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,2
-       blelr-
-00:    lhzu    r5,2(r4)
-       sthbrx  r5,0,r3 
-       bdnz    00b
-       sync
-       blr     
-
-_GLOBAL(_insl)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,4
-       blelr-
-00:    lwbrx   r5,0,r3
-       eieio
-       stwu    r5,4(r4)
-       bdnz    00b
-       twi     0,r5,0
-       isync
-       blr
-
-_GLOBAL(_outsl)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,4
-       blelr-
-00:    lwzu    r5,4(r4)
-       stwbrx  r5,0,r3
-       bdnz    00b
-       sync
-       blr     
-
-/* _GLOBAL(ide_insw) now in drivers/ide/ide-iops.c */
-_GLOBAL(_insw_ns)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,2
-       blelr-
-00:    lhz     r5,0(r3)
-       eieio
-       sthu    r5,2(r4)
-       bdnz    00b
-       twi     0,r5,0
-       isync
-       blr
-
-/* _GLOBAL(ide_outsw) now in drivers/ide/ide-iops.c */
-_GLOBAL(_outsw_ns)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,2
-       blelr-
-00:    lhzu    r5,2(r4)
-       sth     r5,0(r3)
-       bdnz    00b
-       sync
-       blr     
-
-_GLOBAL(_insl_ns)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,4
-       blelr-
-00:    lwz     r5,0(r3)
-       eieio
-       stwu    r5,4(r4)
-       bdnz    00b
-       twi     0,r5,0
-       isync
-       blr
-
-_GLOBAL(_outsl_ns)
-       cmpwi   0,r5,0
-       mtctr   r5
-       subi    r4,r4,4
-       blelr-
-00:    lwzu    r5,4(r4)
-       stw     r5,0(r3)
-       bdnz    00b
-       sync
-       blr     
-
-/*
- * identify_cpu and calls setup_cpu
- * In: r3 = base of the cpu_specs array
- *     r4 = address of cur_cpu_spec
- *     r5 = relocation offset
- */
-_GLOBAL(identify_cpu)
-       mfpvr   r7
-1:
-       lwz     r8,CPU_SPEC_PVR_MASK(r3)
-       and     r8,r8,r7
-       lwz     r9,CPU_SPEC_PVR_VALUE(r3)
-       cmplw   0,r9,r8
-       beq     1f
-       addi    r3,r3,CPU_SPEC_ENTRY_SIZE
-       b       1b
-1:
-       add     r0,r3,r5
-       std     r0,0(r4)
-       ld      r4,CPU_SPEC_SETUP(r3)
-       sub     r4,r4,r5
-       ld      r4,0(r4)
-       sub     r4,r4,r5
-       mtctr   r4
-       /* Calling convention for cpu setup is r3=offset, r4=cur_cpu_spec */
-       mr      r4,r3
-       mr      r3,r5
-       bctr
-
-/*
- * do_cpu_ftr_fixups - goes through the list of CPU feature fixups
- * and writes nop's over sections of code that don't apply for this cpu.
- * r3 = data offset (not changed)
- */
-_GLOBAL(do_cpu_ftr_fixups)
-       /* Get CPU 0 features */
-       LOADADDR(r6,cur_cpu_spec)
-       sub     r6,r6,r3
-       ld      r4,0(r6)
-       sub     r4,r4,r3
-       ld      r4,CPU_SPEC_FEATURES(r4)
-       /* Get the fixup table */
-       LOADADDR(r6,__start___ftr_fixup)
-       sub     r6,r6,r3
-       LOADADDR(r7,__stop___ftr_fixup)
-       sub     r7,r7,r3
-       /* Do the fixup */
-1:     cmpld   r6,r7
-       bgelr
-       addi    r6,r6,32
-       ld      r8,-32(r6)      /* mask */
-       and     r8,r8,r4
-       ld      r9,-24(r6)      /* value */
-       cmpld   r8,r9
-       beq     1b
-       ld      r8,-16(r6)      /* section begin */
-       ld      r9,-8(r6)       /* section end */
-       subf.   r9,r8,r9
-       beq     1b
-       /* write nops over the section of code */
-       /* todo: if large section, add a branch at the start of it */
-       srwi    r9,r9,2
-       mtctr   r9
-       sub     r8,r8,r3
-       lis     r0,0x60000000@h /* nop */
-3:     stw     r0,0(r8)
-       andi.   r10,r4,CPU_FTR_SPLIT_ID_CACHE@l
-       beq     2f
-       dcbst   0,r8            /* suboptimal, but simpler */
-       sync
-       icbi    0,r8
-2:     addi    r8,r8,4
-       bdnz    3b
-       sync                    /* additional sync needed on g4 */
-       isync
-       b       1b
-
-#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
-/*
- * Do an IO access in real mode
- */
-_GLOBAL(real_readb)
-       mfmsr   r7
-       ori     r0,r7,MSR_DR
-       xori    r0,r0,MSR_DR
-       sync
-       mtmsrd  r0
-       sync
-       isync
-       mfspr   r6,SPRN_HID4
-       rldicl  r5,r6,32,0
-       ori     r5,r5,0x100
-       rldicl  r5,r5,32,0
-       sync
-       mtspr   SPRN_HID4,r5
-       isync
-       slbia
-       isync
-       lbz     r3,0(r3)
-       sync
-       mtspr   SPRN_HID4,r6
-       isync
-       slbia
-       isync
-       mtmsrd  r7
-       sync
-       isync
-       blr
-
-/*
- * Do an IO access in real mode
- */
-_GLOBAL(real_writeb)
-       mfmsr   r7
-       ori     r0,r7,MSR_DR
-       xori    r0,r0,MSR_DR
-       sync
-       mtmsrd  r0
-       sync
-       isync
-       mfspr   r6,SPRN_HID4
-       rldicl  r5,r6,32,0
-       ori     r5,r5,0x100
-       rldicl  r5,r5,32,0
-       sync
-       mtspr   SPRN_HID4,r5
-       isync
-       slbia
-       isync
-       stb     r3,0(r4)
-       sync
-       mtspr   SPRN_HID4,r6
-       isync
-       slbia
-       isync
-       mtmsrd  r7
-       sync
-       isync
-       blr
-#endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
-
-/*
- * SCOM access functions for 970 (FX only for now)
- *
- * unsigned long scom970_read(unsigned int address);
- * void scom970_write(unsigned int address, unsigned long value);
- *
- * The address passed in is the 24 bits register address. This code
- * is 970 specific and will not check the status bits, so you should
- * know what you are doing.
- */
-_GLOBAL(scom970_read)
-       /* interrupts off */
-       mfmsr   r4
-       ori     r0,r4,MSR_EE
-       xori    r0,r0,MSR_EE
-       mtmsrd  r0,1
-
-       /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
-        * (including parity). On current CPUs they must be 0'd,
-        * and finally or in RW bit
-        */
-       rlwinm  r3,r3,8,0,15
-       ori     r3,r3,0x8000
-
-       /* do the actual scom read */
-       sync
-       mtspr   SPRN_SCOMC,r3
-       isync
-       mfspr   r3,SPRN_SCOMD
-       isync
-       mfspr   r0,SPRN_SCOMC
-       isync
-
-       /* XXX: fixup result on some buggy 970's (ouch ! we lost a bit, bah
-        * that's the best we can do). Not implemented yet as we don't use
-        * the scom on any of the bogus CPUs yet, but may have to be done
-        * ultimately
-        */
-
-       /* restore interrupts */
-       mtmsrd  r4,1
-       blr
-
-
-_GLOBAL(scom970_write)
-       /* interrupts off */
-       mfmsr   r5
-       ori     r0,r5,MSR_EE
-       xori    r0,r0,MSR_EE
-       mtmsrd  r0,1
-
-       /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
-        * (including parity). On current CPUs they must be 0'd.
-        */
-
-       rlwinm  r3,r3,8,0,15
-
-       sync
-       mtspr   SPRN_SCOMD,r4      /* write data */
-       isync
-       mtspr   SPRN_SCOMC,r3      /* write command */
-       isync
-       mfspr   3,SPRN_SCOMC
-       isync
-
-       /* restore interrupts */
-       mtmsrd  r5,1
-       blr
-
-
-/*
- * Create a kernel thread
- *   kernel_thread(fn, arg, flags)
- */
-_GLOBAL(kernel_thread)
-       std     r29,-24(r1)
-       std     r30,-16(r1)
-       stdu    r1,-STACK_FRAME_OVERHEAD(r1)
-       mr      r29,r3
-       mr      r30,r4
-       ori     r3,r5,CLONE_VM  /* flags */
-       oris    r3,r3,(CLONE_UNTRACED>>16)
-       li      r4,0            /* new sp (unused) */
-       li      r0,__NR_clone
-       sc
-       cmpdi   0,r3,0          /* parent or child? */
-       bne     1f              /* return if parent */
-       li      r0,0
-       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
-       ld      r2,8(r29)
-       ld      r29,0(r29)
-       mtlr    r29              /* fn addr in lr */
-       mr      r3,r30          /* load arg and call fn */
-       blrl
-       li      r0,__NR_exit    /* exit after child exits */
-        li     r3,0
-       sc
-1:     addi    r1,r1,STACK_FRAME_OVERHEAD      
-       ld      r29,-24(r1)
-       ld      r30,-16(r1)
-       blr
-
-/*
- * disable_kernel_fp()
- * Disable the FPU.
- */
-_GLOBAL(disable_kernel_fp)
-       mfmsr   r3
-       rldicl  r0,r3,(63-MSR_FP_LG),1
-       rldicl  r3,r0,(MSR_FP_LG+1),0
-       mtmsrd  r3                      /* disable use of fpu now */
-       isync
-       blr
-
-#ifdef CONFIG_ALTIVEC
-
-#if 0 /* this has no callers for now */
-/*
- * disable_kernel_altivec()
- * Disable the VMX.
- */
-_GLOBAL(disable_kernel_altivec)
-       mfmsr   r3
-       rldicl  r0,r3,(63-MSR_VEC_LG),1
-       rldicl  r3,r0,(MSR_VEC_LG+1),0
-       mtmsrd  r3                      /* disable use of VMX now */
-       isync
-       blr
-#endif /* 0 */
-
-/*
- * giveup_altivec(tsk)
- * Disable VMX for the task given as the argument,
- * and save the vector registers in its thread_struct.
- * Enables the VMX for use in the kernel on return.
- */
-_GLOBAL(giveup_altivec)
-       mfmsr   r5
-       oris    r5,r5,MSR_VEC@h
-       mtmsrd  r5                      /* enable use of VMX now */
-       isync
-       cmpdi   0,r3,0
-       beqlr-                          /* if no previous owner, done */
-       addi    r3,r3,THREAD            /* want THREAD of task */
-       ld      r5,PT_REGS(r3)
-       cmpdi   0,r5,0
-       SAVE_32VRS(0,r4,r3)
-       mfvscr  vr0
-       li      r4,THREAD_VSCR
-       stvx    vr0,r4,r3
-       beq     1f
-       ld      r4,_MSR-STACK_FRAME_OVERHEAD(r5)
-       lis     r3,MSR_VEC@h
-       andc    r4,r4,r3                /* disable FP for previous task */
-       std     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
-1:
-#ifndef CONFIG_SMP
-       li      r5,0
-       ld      r4,last_task_used_altivec@got(r2)
-       std     r5,0(r4)
-#endif /* CONFIG_SMP */
-       blr
-
-#endif /* CONFIG_ALTIVEC */
-
-_GLOBAL(__setup_cpu_power3)
-       blr
-
-_GLOBAL(execve)
-       li      r0,__NR_execve
-       sc
-       bnslr
-       neg     r3,r3
-       blr
-
-/* kexec_wait(phys_cpu)
- *
- * wait for the flag to change, indicating this kernel is going away but
- * the slave code for the next one is at addresses 0 to 100.
- *
- * This is used by all slaves.
- *
- * Physical (hardware) cpu id should be in r3.
- */
-_GLOBAL(kexec_wait)
-       bl      1f
-1:     mflr    r5
-       addi    r5,r5,kexec_flag-1b
-
-99:    HMT_LOW
-#ifdef CONFIG_KEXEC            /* use no memory without kexec */
-       lwz     r4,0(r5)
-       cmpwi   0,r4,0
-       bnea    0x60
-#endif
-       b       99b
-
-/* this can be in text because we won't change it until we are
- * running in real anyways
- */
-kexec_flag:
-       .long   0
-
-
-#ifdef CONFIG_KEXEC
-
-/* kexec_smp_wait(void)
- *
- * call with interrupts off
- * note: this is a terminal routine, it does not save lr
- *
- * get phys id from paca
- * set paca id to -1 to say we got here
- * switch to real mode
- * join other cpus in kexec_wait(phys_id)
- */
-_GLOBAL(kexec_smp_wait)
-       lhz     r3,PACAHWCPUID(r13)
-       li      r4,-1
-       sth     r4,PACAHWCPUID(r13)     /* let others know we left */
-       bl      real_mode
-       b       .kexec_wait
-
-/*
- * switch to real mode (turn mmu off)
- * we use the early kernel trick that the hardware ignores bits
- * 0 and 1 (big endian) of the effective address in real mode
- *
- * don't overwrite r3 here, it is live for kexec_wait above.
- */
-real_mode:     /* assume normal blr return */
-1:     li      r9,MSR_RI
-       li      r10,MSR_DR|MSR_IR
-       mflr    r11             /* return address to SRR0 */
-       mfmsr   r12
-       andc    r9,r12,r9
-       andc    r10,r12,r10
-
-       mtmsrd  r9,1
-       mtspr   SPRN_SRR1,r10
-       mtspr   SPRN_SRR0,r11
-       rfid
-
-
-/*
- * kexec_sequence(newstack, start, image, control, clear_all())
- *
- * does the grungy work with stack switching and real mode switches
- * also does simple calls to other code
- */
-
-_GLOBAL(kexec_sequence)
-       mflr    r0
-       std     r0,16(r1)
-
-       /* switch stacks to newstack -- &kexec_stack.stack */
-       stdu    r1,THREAD_SIZE-112(r3)
-       mr      r1,r3
-
-       li      r0,0
-       std     r0,16(r1)
-
-       /* save regs for local vars on new stack.
-        * yes, we won't go back, but ...
-        */
-       std     r31,-8(r1)
-       std     r30,-16(r1)
-       std     r29,-24(r1)
-       std     r28,-32(r1)
-       std     r27,-40(r1)
-       std     r26,-48(r1)
-       std     r25,-56(r1)
-
-       stdu    r1,-112-64(r1)
-
-       /* save args into preserved regs */
-       mr      r31,r3                  /* newstack (both) */
-       mr      r30,r4                  /* start (real) */
-       mr      r29,r5                  /* image (virt) */
-       mr      r28,r6                  /* control, unused */
-       mr      r27,r7                  /* clear_all() fn desc */
-       mr      r26,r8                  /* spare */
-       lhz     r25,PACAHWCPUID(r13)    /* get our phys cpu from paca */
-
-       /* disable interrupts, we are overwriting kernel data next */
-       mfmsr   r3
-       rlwinm  r3,r3,0,17,15
-       mtmsrd  r3,1
-
-       /* copy dest pages, flush whole dest image */
-       mr      r3,r29
-       bl      .kexec_copy_flush       /* (image) */
-
-       /* turn off mmu */
-       bl      real_mode
-
-       /* clear out hardware hash page table and tlb */
-       ld      r5,0(r27)               /* deref function descriptor */
-       mtctr   r5
-       bctrl                           /* ppc_md.hash_clear_all(void); */
-
-/*
- *   kexec image calling is:
- *      the first 0x100 bytes of the entry point are copied to 0
- *
- *      all slaves branch to slave = 0x60 (absolute)
- *              slave(phys_cpu_id);
- *
- *      master goes to start = entry point
- *              start(phys_cpu_id, start, 0);
- *
- *
- *   a wrapper is needed to call existing kernels, here is an approximate
- *   description of one method:
- *
- * v2: (2.6.10)
- *   start will be near the boot_block (maybe 0x100 bytes before it?)
- *   it will have a 0x60, which will b to boot_block, where it will wait
- *   and 0 will store phys into struct boot-block and load r3 from there,
- *   copy kernel 0-0x100 and tell slaves to back down to 0x60 again
- *
- * v1: (2.6.9)
- *    boot block will have all cpus scanning device tree to see if they
- *    are the boot cpu ?????
- *    other device tree differences (prop sizes, va vs pa, etc)...
- */
-
-       /* copy  0x100 bytes starting at start to 0 */
-       li      r3,0
-       mr      r4,r30
-       li      r5,0x100
-       li      r6,0
-       bl      .copy_and_flush /* (dest, src, copy limit, start offset) */
-1:     /* assume normal blr return */
-
-       /* release other cpus to the new kernel secondary start at 0x60 */
-       mflr    r5
-       li      r6,1
-       stw     r6,kexec_flag-1b(5)
-       mr      r3,r25  # my phys cpu
-       mr      r4,r30  # start, aka phys mem offset
-       mtlr    4
-       li      r5,0
-       blr     /* image->start(physid, image->start, 0); */
-#endif /* CONFIG_KEXEC */
diff --git a/arch/ppc64/kernel/ppc_ksyms.c b/arch/ppc64/kernel/ppc_ksyms.c
deleted file mode 100644 (file)
index 84006e2..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/* 
- * c 2001 PPC 64 Team, IBM Corp
- *
- *      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/config.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/console.h>
-#include <net/checksum.h>
-
-#include <asm/processor.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/hw_irq.h>
-#include <asm/abs_addr.h>
-#include <asm/cacheflush.h>
-
-EXPORT_SYMBOL(strcpy);
-EXPORT_SYMBOL(strncpy);
-EXPORT_SYMBOL(strcat);
-EXPORT_SYMBOL(strncat);
-EXPORT_SYMBOL(strchr);
-EXPORT_SYMBOL(strrchr);
-EXPORT_SYMBOL(strpbrk);
-EXPORT_SYMBOL(strstr);
-EXPORT_SYMBOL(strlen);
-EXPORT_SYMBOL(strnlen);
-EXPORT_SYMBOL(strcmp);
-EXPORT_SYMBOL(strncmp);
-
-EXPORT_SYMBOL(csum_partial);
-EXPORT_SYMBOL(csum_partial_copy_generic);
-EXPORT_SYMBOL(ip_fast_csum);
-EXPORT_SYMBOL(csum_tcpudp_magic);
-
-EXPORT_SYMBOL(__copy_tofrom_user);
-EXPORT_SYMBOL(__clear_user);
-EXPORT_SYMBOL(__strncpy_from_user);
-EXPORT_SYMBOL(__strnlen_user);
-
-EXPORT_SYMBOL(reloc_offset);
-
-EXPORT_SYMBOL(_insb);
-EXPORT_SYMBOL(_outsb);
-EXPORT_SYMBOL(_insw);
-EXPORT_SYMBOL(_outsw);
-EXPORT_SYMBOL(_insl);
-EXPORT_SYMBOL(_outsl);
-EXPORT_SYMBOL(_insw_ns);
-EXPORT_SYMBOL(_outsw_ns);
-EXPORT_SYMBOL(_insl_ns);
-EXPORT_SYMBOL(_outsl_ns);
-
-EXPORT_SYMBOL(kernel_thread);
-
-EXPORT_SYMBOL(giveup_fpu);
-#ifdef CONFIG_ALTIVEC
-EXPORT_SYMBOL(giveup_altivec);
-#endif
-EXPORT_SYMBOL(__flush_icache_range);
-EXPORT_SYMBOL(flush_dcache_range);
-
-EXPORT_SYMBOL(memcpy);
-EXPORT_SYMBOL(memset);
-EXPORT_SYMBOL(memmove);
-EXPORT_SYMBOL(memscan);
-EXPORT_SYMBOL(memcmp);
-EXPORT_SYMBOL(memchr);
-
-EXPORT_SYMBOL(timer_interrupt);
-EXPORT_SYMBOL(console_drivers);
diff --git a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
deleted file mode 100644 (file)
index fbad2c3..0000000
+++ /dev/null
@@ -1,1954 +0,0 @@
-/*
- * 
- *
- * Procedures for interfacing to Open Firmware.
- *
- * Paul Mackerras      August 1996.
- * Copyright (C) 1996 Paul Mackerras.
- * 
- *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
- *    {engebret|bergner}@us.ibm.com 
- *
- *      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.
- */
-
-#undef DEBUG
-
-#include <stdarg.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/spinlock.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/stringify.h>
-#include <linux/delay.h>
-#include <linux/initrd.h>
-#include <linux/bitops.h>
-#include <linux/module.h>
-#include <linux/module.h>
-
-#include <asm/prom.h>
-#include <asm/rtas.h>
-#include <asm/lmb.h>
-#include <asm/abs_addr.h>
-#include <asm/page.h>
-#include <asm/processor.h>
-#include <asm/irq.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/system.h>
-#include <asm/mmu.h>
-#include <asm/pgtable.h>
-#include <asm/pci.h>
-#include <asm/iommu.h>
-#include <asm/btext.h>
-#include <asm/sections.h>
-#include <asm/machdep.h>
-#include <asm/pSeries_reconfig.h>
-
-#ifdef DEBUG
-#define DBG(fmt...) udbg_printf(fmt)
-#else
-#define DBG(fmt...)
-#endif
-
-struct pci_reg_property {
-       struct pci_address addr;
-       u32 size_hi;
-       u32 size_lo;
-};
-
-struct isa_reg_property {
-       u32 space;
-       u32 address;
-       u32 size;
-};
-
-
-typedef int interpret_func(struct device_node *, unsigned long *,
-                          int, int, int);
-
-extern struct rtas_t rtas;
-extern struct lmb lmb;
-extern unsigned long klimit;
-extern unsigned long memory_limit;
-
-static int __initdata dt_root_addr_cells;
-static int __initdata dt_root_size_cells;
-static int __initdata iommu_is_off;
-int __initdata iommu_force_on;
-unsigned long tce_alloc_start, tce_alloc_end;
-
-typedef u32 cell_t;
-
-#if 0
-static struct boot_param_header *initial_boot_params __initdata;
-#else
-struct boot_param_header *initial_boot_params;
-#endif
-
-static struct device_node *allnodes = NULL;
-
-/* use when traversing tree through the allnext, child, sibling,
- * or parent members of struct device_node.
- */
-static DEFINE_RWLOCK(devtree_lock);
-
-/* export that to outside world */
-struct device_node *of_chosen;
-
-/*
- * Wrapper for allocating memory for various data that needs to be
- * attached to device nodes as they are processed at boot or when
- * added to the device tree later (e.g. DLPAR).  At boot there is
- * already a region reserved so we just increment *mem_start by size;
- * otherwise we call kmalloc.
- */
-static void * prom_alloc(unsigned long size, unsigned long *mem_start)
-{
-       unsigned long tmp;
-
-       if (!mem_start)
-               return kmalloc(size, GFP_KERNEL);
-
-       tmp = *mem_start;
-       *mem_start += size;
-       return (void *)tmp;
-}
-
-/*
- * Find the device_node with a given phandle.
- */
-static struct device_node * find_phandle(phandle ph)
-{
-       struct device_node *np;
-
-       for (np = allnodes; np != 0; np = np->allnext)
-               if (np->linux_phandle == ph)
-                       return np;
-       return NULL;
-}
-
-/*
- * Find the interrupt parent of a node.
- */
-static struct device_node * __devinit intr_parent(struct device_node *p)
-{
-       phandle *parp;
-
-       parp = (phandle *) get_property(p, "interrupt-parent", NULL);
-       if (parp == NULL)
-               return p->parent;
-       return find_phandle(*parp);
-}
-
-/*
- * Find out the size of each entry of the interrupts property
- * for a node.
- */
-int __devinit prom_n_intr_cells(struct device_node *np)
-{
-       struct device_node *p;
-       unsigned int *icp;
-
-       for (p = np; (p = intr_parent(p)) != NULL; ) {
-               icp = (unsigned int *)
-                       get_property(p, "#interrupt-cells", NULL);
-               if (icp != NULL)
-                       return *icp;
-               if (get_property(p, "interrupt-controller", NULL) != NULL
-                   || get_property(p, "interrupt-map", NULL) != NULL) {
-                       printk("oops, node %s doesn't have #interrupt-cells\n",
-                              p->full_name);
-                       return 1;
-               }
-       }
-#ifdef DEBUG_IRQ
-       printk("prom_n_intr_cells failed for %s\n", np->full_name);
-#endif
-       return 1;
-}
-
-/*
- * Map an interrupt from a device up to the platform interrupt
- * descriptor.
- */
-static int __devinit map_interrupt(unsigned int **irq, struct device_node **ictrler,
-                                  struct device_node *np, unsigned int *ints,
-                                  int nintrc)
-{
-       struct device_node *p, *ipar;
-       unsigned int *imap, *imask, *ip;
-       int i, imaplen, match;
-       int newintrc = 0, newaddrc = 0;
-       unsigned int *reg;
-       int naddrc;
-
-       reg = (unsigned int *) get_property(np, "reg", NULL);
-       naddrc = prom_n_addr_cells(np);
-       p = intr_parent(np);
-       while (p != NULL) {
-               if (get_property(p, "interrupt-controller", NULL) != NULL)
-                       /* this node is an interrupt controller, stop here */
-                       break;
-               imap = (unsigned int *)
-                       get_property(p, "interrupt-map", &imaplen);
-               if (imap == NULL) {
-                       p = intr_parent(p);
-                       continue;
-               }
-               imask = (unsigned int *)
-                       get_property(p, "interrupt-map-mask", NULL);
-               if (imask == NULL) {
-                       printk("oops, %s has interrupt-map but no mask\n",
-                              p->full_name);
-                       return 0;
-               }
-               imaplen /= sizeof(unsigned int);
-               match = 0;
-               ipar = NULL;
-               while (imaplen > 0 && !match) {
-                       /* check the child-interrupt field */
-                       match = 1;
-                       for (i = 0; i < naddrc && match; ++i)
-                               match = ((reg[i] ^ imap[i]) & imask[i]) == 0;
-                       for (; i < naddrc + nintrc && match; ++i)
-                               match = ((ints[i-naddrc] ^ imap[i]) & imask[i]) == 0;
-                       imap += naddrc + nintrc;
-                       imaplen -= naddrc + nintrc;
-                       /* grab the interrupt parent */
-                       ipar = find_phandle((phandle) *imap++);
-                       --imaplen;
-                       if (ipar == NULL) {
-                               printk("oops, no int parent %x in map of %s\n",
-                                      imap[-1], p->full_name);
-                               return 0;
-                       }
-                       /* find the parent's # addr and intr cells */
-                       ip = (unsigned int *)
-                               get_property(ipar, "#interrupt-cells", NULL);
-                       if (ip == NULL) {
-                               printk("oops, no #interrupt-cells on %s\n",
-                                      ipar->full_name);
-                               return 0;
-                       }
-                       newintrc = *ip;
-                       ip = (unsigned int *)
-                               get_property(ipar, "#address-cells", NULL);
-                       newaddrc = (ip == NULL)? 0: *ip;
-                       imap += newaddrc + newintrc;
-                       imaplen -= newaddrc + newintrc;
-               }
-               if (imaplen < 0) {
-                       printk("oops, error decoding int-map on %s, len=%d\n",
-                              p->full_name, imaplen);
-                       return 0;
-               }
-               if (!match) {
-#ifdef DEBUG_IRQ
-                       printk("oops, no match in %s int-map for %s\n",
-                              p->full_name, np->full_name);
-#endif
-                       return 0;
-               }
-               p = ipar;
-               naddrc = newaddrc;
-               nintrc = newintrc;
-               ints = imap - nintrc;
-               reg = ints - naddrc;
-       }
-       if (p == NULL) {
-#ifdef DEBUG_IRQ
-               printk("hmmm, int tree for %s doesn't have ctrler\n",
-                      np->full_name);
-#endif
-               return 0;
-       }
-       *irq = ints;
-       *ictrler = p;
-       return nintrc;
-}
-
-static int __devinit finish_node_interrupts(struct device_node *np,
-                                           unsigned long *mem_start,
-                                           int measure_only)
-{
-       unsigned int *ints;
-       int intlen, intrcells, intrcount;
-       int i, j, n;
-       unsigned int *irq, virq;
-       struct device_node *ic;
-
-       ints = (unsigned int *) get_property(np, "interrupts", &intlen);
-       if (ints == NULL)
-               return 0;
-       intrcells = prom_n_intr_cells(np);
-       intlen /= intrcells * sizeof(unsigned int);
-
-       np->intrs = prom_alloc(intlen * sizeof(*(np->intrs)), mem_start);
-       if (!np->intrs)
-               return -ENOMEM;
-
-       if (measure_only)
-               return 0;
-
-       intrcount = 0;
-       for (i = 0; i < intlen; ++i, ints += intrcells) {
-               n = map_interrupt(&irq, &ic, np, ints, intrcells);
-               if (n <= 0)
-                       continue;
-
-               /* don't map IRQ numbers under a cascaded 8259 controller */
-               if (ic && device_is_compatible(ic, "chrp,iic")) {
-                       np->intrs[intrcount].line = irq[0];
-               } else {
-                       virq = virt_irq_create_mapping(irq[0]);
-                       if (virq == NO_IRQ) {
-                               printk(KERN_CRIT "Could not allocate interrupt"
-                                      " number for %s\n", np->full_name);
-                               continue;
-                       }
-                       np->intrs[intrcount].line = irq_offset_up(virq);
-               }
-
-               /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */
-               if (_machine == PLATFORM_POWERMAC && ic && ic->parent) {
-                       char *name = get_property(ic->parent, "name", NULL);
-                       if (name && !strcmp(name, "u3"))
-                               np->intrs[intrcount].line += 128;
-                       else if (!(name && !strcmp(name, "mac-io")))
-                               /* ignore other cascaded controllers, such as
-                                  the k2-sata-root */
-                               break;
-               }
-               np->intrs[intrcount].sense = 1;
-               if (n > 1)
-                       np->intrs[intrcount].sense = irq[1];
-               if (n > 2) {
-                       printk("hmmm, got %d intr cells for %s:", n,
-                              np->full_name);
-                       for (j = 0; j < n; ++j)
-                               printk(" %d", irq[j]);
-                       printk("\n");
-               }
-               ++intrcount;
-       }
-       np->n_intrs = intrcount;
-
-       return 0;
-}
-
-static int __devinit interpret_pci_props(struct device_node *np,
-                                        unsigned long *mem_start,
-                                        int naddrc, int nsizec,
-                                        int measure_only)
-{
-       struct address_range *adr;
-       struct pci_reg_property *pci_addrs;
-       int i, l, n_addrs;
-
-       pci_addrs = (struct pci_reg_property *)
-               get_property(np, "assigned-addresses", &l);
-       if (!pci_addrs)
-               return 0;
-
-       n_addrs = l / sizeof(*pci_addrs);
-
-       adr = prom_alloc(n_addrs * sizeof(*adr), mem_start);
-       if (!adr)
-               return -ENOMEM;
-
-       if (measure_only)
-               return 0;
-
-       np->addrs = adr;
-       np->n_addrs = n_addrs;
-
-       for (i = 0; i < n_addrs; i++) {
-               adr[i].space = pci_addrs[i].addr.a_hi;
-               adr[i].address = pci_addrs[i].addr.a_lo |
-                       ((u64)pci_addrs[i].addr.a_mid << 32);
-               adr[i].size = pci_addrs[i].size_lo;
-       }
-
-       return 0;
-}
-
-static int __init interpret_dbdma_props(struct device_node *np,
-                                       unsigned long *mem_start,
-                                       int naddrc, int nsizec,
-                                       int measure_only)
-{
-       struct reg_property32 *rp;
-       struct address_range *adr;
-       unsigned long base_address;
-       int i, l;
-       struct device_node *db;
-
-       base_address = 0;
-       if (!measure_only) {
-               for (db = np->parent; db != NULL; db = db->parent) {
-                       if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) {
-                               base_address = db->addrs[0].address;
-                               break;
-                       }
-               }
-       }
-
-       rp = (struct reg_property32 *) get_property(np, "reg", &l);
-       if (rp != 0 && l >= sizeof(struct reg_property32)) {
-               i = 0;
-               adr = (struct address_range *) (*mem_start);
-               while ((l -= sizeof(struct reg_property32)) >= 0) {
-                       if (!measure_only) {
-                               adr[i].space = 2;
-                               adr[i].address = rp[i].address + base_address;
-                               adr[i].size = rp[i].size;
-                       }
-                       ++i;
-               }
-               np->addrs = adr;
-               np->n_addrs = i;
-               (*mem_start) += i * sizeof(struct address_range);
-       }
-
-       return 0;
-}
-
-static int __init interpret_macio_props(struct device_node *np,
-                                       unsigned long *mem_start,
-                                       int naddrc, int nsizec,
-                                       int measure_only)
-{
-       struct reg_property32 *rp;
-       struct address_range *adr;
-       unsigned long base_address;
-       int i, l;
-       struct device_node *db;
-
-       base_address = 0;
-       if (!measure_only) {
-               for (db = np->parent; db != NULL; db = db->parent) {
-                       if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) {
-                               base_address = db->addrs[0].address;
-                               break;
-                       }
-               }
-       }
-
-       rp = (struct reg_property32 *) get_property(np, "reg", &l);
-       if (rp != 0 && l >= sizeof(struct reg_property32)) {
-               i = 0;
-               adr = (struct address_range *) (*mem_start);
-               while ((l -= sizeof(struct reg_property32)) >= 0) {
-                       if (!measure_only) {
-                               adr[i].space = 2;
-                               adr[i].address = rp[i].address + base_address;
-                               adr[i].size = rp[i].size;
-                       }
-                       ++i;
-               }
-               np->addrs = adr;
-               np->n_addrs = i;
-               (*mem_start) += i * sizeof(struct address_range);
-       }
-
-       return 0;
-}
-
-static int __init interpret_isa_props(struct device_node *np,
-                                     unsigned long *mem_start,
-                                     int naddrc, int nsizec,
-                                     int measure_only)
-{
-       struct isa_reg_property *rp;
-       struct address_range *adr;
-       int i, l;
-
-       rp = (struct isa_reg_property *) get_property(np, "reg", &l);
-       if (rp != 0 && l >= sizeof(struct isa_reg_property)) {
-               i = 0;
-               adr = (struct address_range *) (*mem_start);
-               while ((l -= sizeof(struct isa_reg_property)) >= 0) {
-                       if (!measure_only) {
-                               adr[i].space = rp[i].space;
-                               adr[i].address = rp[i].address;
-                               adr[i].size = rp[i].size;
-                       }
-                       ++i;
-               }
-               np->addrs = adr;
-               np->n_addrs = i;
-               (*mem_start) += i * sizeof(struct address_range);
-       }
-
-       return 0;
-}
-
-static int __init interpret_root_props(struct device_node *np,
-                                      unsigned long *mem_start,
-                                      int naddrc, int nsizec,
-                                      int measure_only)
-{
-       struct address_range *adr;
-       int i, l;
-       unsigned int *rp;
-       int rpsize = (naddrc + nsizec) * sizeof(unsigned int);
-
-       rp = (unsigned int *) get_property(np, "reg", &l);
-       if (rp != 0 && l >= rpsize) {
-               i = 0;
-               adr = (struct address_range *) (*mem_start);
-               while ((l -= rpsize) >= 0) {
-                       if (!measure_only) {
-                               adr[i].space = 0;
-                               adr[i].address = rp[naddrc - 1];
-                               adr[i].size = rp[naddrc + nsizec - 1];
-                       }
-                       ++i;
-                       rp += naddrc + nsizec;
-               }
-               np->addrs = adr;
-               np->n_addrs = i;
-               (*mem_start) += i * sizeof(struct address_range);
-       }
-
-       return 0;
-}
-
-static int __devinit finish_node(struct device_node *np,
-                                unsigned long *mem_start,
-                                interpret_func *ifunc,
-                                int naddrc, int nsizec,
-                                int measure_only)
-{
-       struct device_node *child;
-       int *ip, rc = 0;
-
-       /* get the device addresses and interrupts */
-       if (ifunc != NULL)
-               rc = ifunc(np, mem_start, naddrc, nsizec, measure_only);
-       if (rc)
-               goto out;
-
-       rc = finish_node_interrupts(np, mem_start, measure_only);
-       if (rc)
-               goto out;
-
-       /* Look for #address-cells and #size-cells properties. */
-       ip = (int *) get_property(np, "#address-cells", NULL);
-       if (ip != NULL)
-               naddrc = *ip;
-       ip = (int *) get_property(np, "#size-cells", NULL);
-       if (ip != NULL)
-               nsizec = *ip;
-
-       if (!strcmp(np->name, "device-tree") || np->parent == NULL)
-               ifunc = interpret_root_props;
-       else if (np->type == 0)
-               ifunc = NULL;
-       else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci"))
-               ifunc = interpret_pci_props;
-       else if (!strcmp(np->type, "dbdma"))
-               ifunc = interpret_dbdma_props;
-       else if (!strcmp(np->type, "mac-io") || ifunc == interpret_macio_props)
-               ifunc = interpret_macio_props;
-       else if (!strcmp(np->type, "isa"))
-               ifunc = interpret_isa_props;
-       else if (!strcmp(np->name, "uni-n") || !strcmp(np->name, "u3"))
-               ifunc = interpret_root_props;
-       else if (!((ifunc == interpret_dbdma_props
-                   || ifunc == interpret_macio_props)
-                  && (!strcmp(np->type, "escc")
-                      || !strcmp(np->type, "media-bay"))))
-               ifunc = NULL;
-
-       for (child = np->child; child != NULL; child = child->sibling) {
-               rc = finish_node(child, mem_start, ifunc,
-                                naddrc, nsizec, measure_only);
-               if (rc)
-                       goto out;
-       }
-out:
-       return rc;
-}
-
-/**
- * finish_device_tree is called once things are running normally
- * (i.e. with text and data mapped to the address they were linked at).
- * It traverses the device tree and fills in some of the additional,
- * fields in each node like {n_}addrs and {n_}intrs, the virt interrupt
- * mapping is also initialized at this point.
- */
-void __init finish_device_tree(void)
-{
-       unsigned long start, end, size = 0;
-
-       DBG(" -> finish_device_tree\n");
-
-       if (ppc64_interrupt_controller == IC_INVALID) {
-               DBG("failed to configure interrupt controller type\n");
-               panic("failed to configure interrupt controller type\n");
-       }
-       
-       /* Initialize virtual IRQ map */
-       virt_irq_init();
-
-       /*
-        * Finish device-tree (pre-parsing some properties etc...)
-        * We do this in 2 passes. One with "measure_only" set, which
-        * will only measure the amount of memory needed, then we can
-        * allocate that memory, and call finish_node again. However,
-        * we must be careful as most routines will fail nowadays when
-        * prom_alloc() returns 0, so we must make sure our first pass
-        * doesn't start at 0. We pre-initialize size to 16 for that
-        * reason and then remove those additional 16 bytes
-        */
-       size = 16;
-       finish_node(allnodes, &size, NULL, 0, 0, 1);
-       size -= 16;
-       end = start = (unsigned long)abs_to_virt(lmb_alloc(size, 128));
-       finish_node(allnodes, &end, NULL, 0, 0, 0);
-       BUG_ON(end != start + size);
-
-       DBG(" <- finish_device_tree\n");
-}
-
-#ifdef DEBUG
-#define printk udbg_printf
-#endif
-
-static inline char *find_flat_dt_string(u32 offset)
-{
-       return ((char *)initial_boot_params) +
-               initial_boot_params->off_dt_strings + offset;
-}
-
-/**
- * This function is used to scan the flattened device-tree, it is
- * used to extract the memory informations at boot before we can
- * unflatten the tree
- */
-int __init of_scan_flat_dt(int (*it)(unsigned long node,
-                                    const char *uname, int depth,
-                                    void *data),
-                          void *data)
-{
-       unsigned long p = ((unsigned long)initial_boot_params) +
-               initial_boot_params->off_dt_struct;
-       int rc = 0;
-       int depth = -1;
-
-       do {
-               u32 tag = *((u32 *)p);
-               char *pathp;
-               
-               p += 4;
-               if (tag == OF_DT_END_NODE) {
-                       depth --;
-                       continue;
-               }
-               if (tag == OF_DT_NOP)
-                       continue;
-               if (tag == OF_DT_END)
-                       break;
-               if (tag == OF_DT_PROP) {
-                       u32 sz = *((u32 *)p);
-                       p += 8;
-                       if (initial_boot_params->version < 0x10)
-                               p = _ALIGN(p, sz >= 8 ? 8 : 4);
-                       p += sz;
-                       p = _ALIGN(p, 4);
-                       continue;
-               }
-               if (tag != OF_DT_BEGIN_NODE) {
-                       printk(KERN_WARNING "Invalid tag %x scanning flattened"
-                              " device tree !\n", tag);
-                       return -EINVAL;
-               }
-               depth++;
-               pathp = (char *)p;
-               p = _ALIGN(p + strlen(pathp) + 1, 4);
-               if ((*pathp) == '/') {
-                       char *lp, *np;
-                       for (lp = NULL, np = pathp; *np; np++)
-                               if ((*np) == '/')
-                                       lp = np+1;
-                       if (lp != NULL)
-                               pathp = lp;
-               }
-               rc = it(p, pathp, depth, data);
-               if (rc != 0)
-                       break;          
-       } while(1);
-
-       return rc;
-}
-
-/**
- * This  function can be used within scan_flattened_dt callback to get
- * access to properties
- */
-void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
-                                unsigned long *size)
-{
-       unsigned long p = node;
-
-       do {
-               u32 tag = *((u32 *)p);
-               u32 sz, noff;
-               const char *nstr;
-
-               p += 4;
-               if (tag == OF_DT_NOP)
-                       continue;
-               if (tag != OF_DT_PROP)
-                       return NULL;
-
-               sz = *((u32 *)p);
-               noff = *((u32 *)(p + 4));
-               p += 8;
-               if (initial_boot_params->version < 0x10)
-                       p = _ALIGN(p, sz >= 8 ? 8 : 4);
-
-               nstr = find_flat_dt_string(noff);
-               if (nstr == NULL) {
-                       printk(KERN_WARNING "Can't find property index"
-                              " name !\n");
-                       return NULL;
-               }
-               if (strcmp(name, nstr) == 0) {
-                       if (size)
-                               *size = sz;
-                       return (void *)p;
-               }
-               p += sz;
-               p = _ALIGN(p, 4);
-       } while(1);
-}
-
-static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size,
-                                      unsigned long align)
-{
-       void *res;
-
-       *mem = _ALIGN(*mem, align);
-       res = (void *)*mem;
-       *mem += size;
-
-       return res;
-}
-
-static unsigned long __init unflatten_dt_node(unsigned long mem,
-                                             unsigned long *p,
-                                             struct device_node *dad,
-                                             struct device_node ***allnextpp,
-                                             unsigned long fpsize)
-{
-       struct device_node *np;
-       struct property *pp, **prev_pp = NULL;
-       char *pathp;
-       u32 tag;
-       unsigned int l, allocl;
-       int has_name = 0;
-       int new_format = 0;
-
-       tag = *((u32 *)(*p));
-       if (tag != OF_DT_BEGIN_NODE) {
-               printk("Weird tag at start of node: %x\n", tag);
-               return mem;
-       }
-       *p += 4;
-       pathp = (char *)*p;
-       l = allocl = strlen(pathp) + 1;
-       *p = _ALIGN(*p + l, 4);
-
-       /* version 0x10 has a more compact unit name here instead of the full
-        * path. we accumulate the full path size using "fpsize", we'll rebuild
-        * it later. We detect this because the first character of the name is
-        * not '/'.
-        */
-       if ((*pathp) != '/') {
-               new_format = 1;
-               if (fpsize == 0) {
-                       /* root node: special case. fpsize accounts for path
-                        * plus terminating zero. root node only has '/', so
-                        * fpsize should be 2, but we want to avoid the first
-                        * level nodes to have two '/' so we use fpsize 1 here
-                        */
-                       fpsize = 1;
-                       allocl = 2;
-               } else {
-                       /* account for '/' and path size minus terminal 0
-                        * already in 'l'
-                        */
-                       fpsize += l;
-                       allocl = fpsize;
-               }
-       }
-
-
-       np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
-                               __alignof__(struct device_node));
-       if (allnextpp) {
-               memset(np, 0, sizeof(*np));
-               np->full_name = ((char*)np) + sizeof(struct device_node);
-               if (new_format) {
-                       char *p = np->full_name;
-                       /* rebuild full path for new format */
-                       if (dad && dad->parent) {
-                               strcpy(p, dad->full_name);
-#ifdef DEBUG
-                               if ((strlen(p) + l + 1) != allocl) {
-                                       DBG("%s: p: %d, l: %d, a: %d\n",
-                                           pathp, strlen(p), l, allocl);
-                               }
-#endif
-                               p += strlen(p);
-                       }
-                       *(p++) = '/';
-                       memcpy(p, pathp, l);
-               } else
-                       memcpy(np->full_name, pathp, l);
-               prev_pp = &np->properties;
-               **allnextpp = np;
-               *allnextpp = &np->allnext;
-               if (dad != NULL) {
-                       np->parent = dad;
-                       /* we temporarily use the next field as `last_child'*/
-                       if (dad->next == 0)
-                               dad->child = np;
-                       else
-                               dad->next->sibling = np;
-                       dad->next = np;
-               }
-               kref_init(&np->kref);
-       }
-       while(1) {
-               u32 sz, noff;
-               char *pname;
-
-               tag = *((u32 *)(*p));
-               if (tag == OF_DT_NOP) {
-                       *p += 4;
-                       continue;
-               }
-               if (tag != OF_DT_PROP)
-                       break;
-               *p += 4;
-               sz = *((u32 *)(*p));
-               noff = *((u32 *)((*p) + 4));
-               *p += 8;
-               if (initial_boot_params->version < 0x10)
-                       *p = _ALIGN(*p, sz >= 8 ? 8 : 4);
-
-               pname = find_flat_dt_string(noff);
-               if (pname == NULL) {
-                       printk("Can't find property name in list !\n");
-                       break;
-               }
-               if (strcmp(pname, "name") == 0)
-                       has_name = 1;
-               l = strlen(pname) + 1;
-               pp = unflatten_dt_alloc(&mem, sizeof(struct property),
-                                       __alignof__(struct property));
-               if (allnextpp) {
-                       if (strcmp(pname, "linux,phandle") == 0) {
-                               np->node = *((u32 *)*p);
-                               if (np->linux_phandle == 0)
-                                       np->linux_phandle = np->node;
-                       }
-                       if (strcmp(pname, "ibm,phandle") == 0)
-                               np->linux_phandle = *((u32 *)*p);
-                       pp->name = pname;
-                       pp->length = sz;
-                       pp->value = (void *)*p;
-                       *prev_pp = pp;
-                       prev_pp = &pp->next;
-               }
-               *p = _ALIGN((*p) + sz, 4);
-       }
-       /* with version 0x10 we may not have the name property, recreate
-        * it here from the unit name if absent
-        */
-       if (!has_name) {
-               char *p = pathp, *ps = pathp, *pa = NULL;
-               int sz;
-
-               while (*p) {
-                       if ((*p) == '@')
-                               pa = p;
-                       if ((*p) == '/')
-                               ps = p + 1;
-                       p++;
-               }
-               if (pa < ps)
-                       pa = p;
-               sz = (pa - ps) + 1;
-               pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz,
-                                       __alignof__(struct property));
-               if (allnextpp) {
-                       pp->name = "name";
-                       pp->length = sz;
-                       pp->value = (unsigned char *)(pp + 1);
-                       *prev_pp = pp;
-                       prev_pp = &pp->next;
-                       memcpy(pp->value, ps, sz - 1);
-                       ((char *)pp->value)[sz - 1] = 0;
-                       DBG("fixed up name for %s -> %s\n", pathp, pp->value);
-               }
-       }
-       if (allnextpp) {
-               *prev_pp = NULL;
-               np->name = get_property(np, "name", NULL);
-               np->type = get_property(np, "device_type", NULL);
-
-               if (!np->name)
-                       np->name = "<NULL>";
-               if (!np->type)
-                       np->type = "<NULL>";
-       }
-       while (tag == OF_DT_BEGIN_NODE) {
-               mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize);
-               tag = *((u32 *)(*p));
-       }
-       if (tag != OF_DT_END_NODE) {
-               printk("Weird tag at end of node: %x\n", tag);
-               return mem;
-       }
-       *p += 4;
-       return mem;
-}
-
-
-/**
- * unflattens the device-tree passed by the firmware, creating the
- * tree of struct device_node. It also fills the "name" and "type"
- * pointers of the nodes so the normal device-tree walking functions
- * can be used (this used to be done by finish_device_tree)
- */
-void __init unflatten_device_tree(void)
-{
-       unsigned long start, mem, size;
-       struct device_node **allnextp = &allnodes;
-       char *p = NULL;
-       int l = 0;
-
-       DBG(" -> unflatten_device_tree()\n");
-
-       /* First pass, scan for size */
-       start = ((unsigned long)initial_boot_params) +
-               initial_boot_params->off_dt_struct;
-       size = unflatten_dt_node(0, &start, NULL, NULL, 0);
-       size = (size | 3) + 1;
-
-       DBG("  size is %lx, allocating...\n", size);
-
-       /* Allocate memory for the expanded device tree */
-       mem = lmb_alloc(size + 4, __alignof__(struct device_node));
-       if (!mem) {
-               DBG("Couldn't allocate memory with lmb_alloc()!\n");
-               panic("Couldn't allocate memory with lmb_alloc()!\n");
-       }
-       mem = (unsigned long)abs_to_virt(mem);
-
-       ((u32 *)mem)[size / 4] = 0xdeadbeef;
-
-       DBG("  unflattening...\n", mem);
-
-       /* Second pass, do actual unflattening */
-       start = ((unsigned long)initial_boot_params) +
-               initial_boot_params->off_dt_struct;
-       unflatten_dt_node(mem, &start, NULL, &allnextp, 0);
-       if (*((u32 *)start) != OF_DT_END)
-               printk(KERN_WARNING "Weird tag at end of tree: %08x\n", *((u32 *)start));
-       if (((u32 *)mem)[size / 4] != 0xdeadbeef)
-               printk(KERN_WARNING "End of tree marker overwritten: %08x\n",
-                      ((u32 *)mem)[size / 4] );
-       *allnextp = NULL;
-
-       /* Get pointer to OF "/chosen" node for use everywhere */
-       of_chosen = of_find_node_by_path("/chosen");
-
-       /* Retreive command line */
-       if (of_chosen != NULL) {
-               p = (char *)get_property(of_chosen, "bootargs", &l);
-               if (p != NULL && l > 0)
-                       strlcpy(cmd_line, p, min(l, COMMAND_LINE_SIZE));
-       }
-#ifdef CONFIG_CMDLINE
-       if (l == 0 || (l == 1 && (*p) == 0))
-               strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-#endif /* CONFIG_CMDLINE */
-
-       DBG("Command line is: %s\n", cmd_line);
-
-       DBG(" <- unflatten_device_tree()\n");
-}
-
-
-static int __init early_init_dt_scan_cpus(unsigned long node,
-                                         const char *uname, int depth, void *data)
-{
-       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
-       u32 *prop;
-       unsigned long size;
-
-       /* We are scanning "cpu" nodes only */
-       if (type == NULL || strcmp(type, "cpu") != 0)
-               return 0;
-
-       if (initial_boot_params && initial_boot_params->version >= 2) {
-               /* version 2 of the kexec param format adds the phys cpuid
-                * of booted proc.
-                */
-               boot_cpuid_phys = initial_boot_params->boot_cpuid_phys;
-               boot_cpuid = 0;
-       } else {
-               /* Check if it's the boot-cpu, set it's hw index in paca now */
-               if (of_get_flat_dt_prop(node, "linux,boot-cpu", NULL)
-                   != NULL) {
-                       u32 *prop = of_get_flat_dt_prop(node, "reg", NULL);
-                       set_hard_smp_processor_id(0, prop == NULL ? 0 : *prop);
-                       boot_cpuid_phys = get_hard_smp_processor_id(0);
-               }
-       }
-
-#ifdef CONFIG_ALTIVEC
-       /* Check if we have a VMX and eventually update CPU features */
-       prop = (u32 *)of_get_flat_dt_prop(node, "ibm,vmx", NULL);
-       if (prop && (*prop) > 0) {
-               cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC;
-               cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC;
-       }
-
-       /* Same goes for Apple's "altivec" property */
-       prop = (u32 *)of_get_flat_dt_prop(node, "altivec", NULL);
-       if (prop) {
-               cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC;
-               cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC;
-       }
-#endif /* CONFIG_ALTIVEC */
-
-       /*
-        * Check for an SMT capable CPU and set the CPU feature. We do
-        * this by looking at the size of the ibm,ppc-interrupt-server#s
-        * property
-        */
-       prop = (u32 *)of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s",
-                                      &size);
-       cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
-       if (prop && ((size / sizeof(u32)) > 1))
-               cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
-
-       return 0;
-}
-
-static int __init early_init_dt_scan_chosen(unsigned long node,
-                                           const char *uname, int depth, void *data)
-{
-       u32 *prop;
-       u64 *prop64;
-
-       DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
-
-       if (depth != 1 || strcmp(uname, "chosen") != 0)
-               return 0;
-
-       /* get platform type */
-       prop = (u32 *)of_get_flat_dt_prop(node, "linux,platform", NULL);
-       if (prop == NULL)
-               return 0;
-       _machine = *prop;
-
-       /* check if iommu is forced on or off */
-       if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
-               iommu_is_off = 1;
-       if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL)
-               iommu_force_on = 1;
-
-       prop64 = (u64*)of_get_flat_dt_prop(node, "linux,memory-limit", NULL);
-       if (prop64)
-               memory_limit = *prop64;
-
-       prop64 = (u64*)of_get_flat_dt_prop(node, "linux,tce-alloc-start",NULL);
-       if (prop64)
-               tce_alloc_start = *prop64;
-
-       prop64 = (u64*)of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL);
-       if (prop64)
-               tce_alloc_end = *prop64;
-
-#ifdef CONFIG_PPC_RTAS
-       /* To help early debugging via the front panel, we retreive a minimal
-        * set of RTAS infos now if available
-        */
-       {
-               u64 *basep, *entryp;
-
-               basep = (u64*)of_get_flat_dt_prop(node,
-                                                 "linux,rtas-base", NULL);
-               entryp = (u64*)of_get_flat_dt_prop(node,
-                                                  "linux,rtas-entry", NULL);
-               prop = (u32*)of_get_flat_dt_prop(node,
-                                                "linux,rtas-size", NULL);
-               if (basep && entryp && prop) {
-                       rtas.base = *basep;
-                       rtas.entry = *entryp;
-                       rtas.size = *prop;
-               }
-       }
-#endif /* CONFIG_PPC_RTAS */
-
-       /* break now */
-       return 1;
-}
-
-static int __init early_init_dt_scan_root(unsigned long node,
-                                         const char *uname, int depth, void *data)
-{
-       u32 *prop;
-
-       if (depth != 0)
-               return 0;
-
-       prop = (u32 *)of_get_flat_dt_prop(node, "#size-cells", NULL);
-       dt_root_size_cells = (prop == NULL) ? 1 : *prop;
-       DBG("dt_root_size_cells = %x\n", dt_root_size_cells);
-
-       prop = (u32 *)of_get_flat_dt_prop(node, "#address-cells", NULL);
-       dt_root_addr_cells = (prop == NULL) ? 2 : *prop;
-       DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells);
-       
-       /* break now */
-       return 1;
-}
-
-static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp)
-{
-       cell_t *p = *cellp;
-       unsigned long r = 0;
-
-       /* Ignore more than 2 cells */
-       while (s > 2) {
-               p++;
-               s--;
-       }
-       while (s) {
-               r <<= 32;
-               r |= *(p++);
-               s--;
-       }
-
-       *cellp = p;
-       return r;
-}
-
-
-static int __init early_init_dt_scan_memory(unsigned long node,
-                                           const char *uname, int depth, void *data)
-{
-       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
-       cell_t *reg, *endp;
-       unsigned long l;
-
-       /* We are scanning "memory" nodes only */
-       if (type == NULL || strcmp(type, "memory") != 0)
-               return 0;
-
-       reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l);
-       if (reg == NULL)
-               return 0;
-
-       endp = reg + (l / sizeof(cell_t));
-
-       DBG("memory scan node %s ..., reg size %ld, data: %x %x %x %x, ...\n",
-           uname, l, reg[0], reg[1], reg[2], reg[3]);
-
-       while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
-               unsigned long base, size;
-
-               base = dt_mem_next_cell(dt_root_addr_cells, &reg);
-               size = dt_mem_next_cell(dt_root_size_cells, &reg);
-
-               if (size == 0)
-                       continue;
-               DBG(" - %lx ,  %lx\n", base, size);
-               if (iommu_is_off) {
-                       if (base >= 0x80000000ul)
-                               continue;
-                       if ((base + size) > 0x80000000ul)
-                               size = 0x80000000ul - base;
-               }
-               lmb_add(base, size);
-       }
-       return 0;
-}
-
-static void __init early_reserve_mem(void)
-{
-       u64 base, size;
-       u64 *reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
-                                  initial_boot_params->off_mem_rsvmap);
-       while (1) {
-               base = *(reserve_map++);
-               size = *(reserve_map++);
-               if (size == 0)
-                       break;
-               DBG("reserving: %lx -> %lx\n", base, size);
-               lmb_reserve(base, size);
-       }
-
-#if 0
-       DBG("memory reserved, lmbs :\n");
-       lmb_dump_all();
-#endif
-}
-
-void __init early_init_devtree(void *params)
-{
-       DBG(" -> early_init_devtree()\n");
-
-       /* Setup flat device-tree pointer */
-       initial_boot_params = params;
-
-       /* Retreive various informations from the /chosen node of the
-        * device-tree, including the platform type, initrd location and
-        * size, TCE reserve, and more ...
-        */
-       of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
-
-       /* Scan memory nodes and rebuild LMBs */
-       lmb_init();
-       of_scan_flat_dt(early_init_dt_scan_root, NULL);
-       of_scan_flat_dt(early_init_dt_scan_memory, NULL);
-       lmb_enforce_memory_limit(memory_limit);
-       lmb_analyze();
-       lmb_reserve(0, __pa(klimit));
-
-       /* Reserve LMB regions used by kernel, initrd, dt, etc... */
-       early_reserve_mem();
-
-       DBG("Scanning CPUs ...\n");
-
-       /* Retreive hash table size from flattened tree plus other
-        * CPU related informations (altivec support, boot CPU ID, ...)
-        */
-       of_scan_flat_dt(early_init_dt_scan_cpus, NULL);
-
-       DBG(" <- early_init_devtree()\n");
-}
-
-#undef printk
-
-int
-prom_n_addr_cells(struct device_node* np)
-{
-       int* ip;
-       do {
-               if (np->parent)
-                       np = np->parent;
-               ip = (int *) get_property(np, "#address-cells", NULL);
-               if (ip != NULL)
-                       return *ip;
-       } while (np->parent);
-       /* No #address-cells property for the root node, default to 1 */
-       return 1;
-}
-
-int
-prom_n_size_cells(struct device_node* np)
-{
-       int* ip;
-       do {
-               if (np->parent)
-                       np = np->parent;
-               ip = (int *) get_property(np, "#size-cells", NULL);
-               if (ip != NULL)
-                       return *ip;
-       } while (np->parent);
-       /* No #size-cells property for the root node, default to 1 */
-       return 1;
-}
-
-/**
- * Work out the sense (active-low level / active-high edge)
- * of each interrupt from the device tree.
- */
-void __init prom_get_irq_senses(unsigned char *senses, int off, int max)
-{
-       struct device_node *np;
-       int i, j;
-
-       /* default to level-triggered */
-       memset(senses, 1, max - off);
-
-       for (np = allnodes; np != 0; np = np->allnext) {
-               for (j = 0; j < np->n_intrs; j++) {
-                       i = np->intrs[j].line;
-                       if (i >= off && i < max)
-                               senses[i-off] = np->intrs[j].sense ?
-                                       IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE :
-                                       IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE;
-               }
-       }
-}
-
-/**
- * Construct and return a list of the device_nodes with a given name.
- */
-struct device_node *
-find_devices(const char *name)
-{
-       struct device_node *head, **prevp, *np;
-
-       prevp = &head;
-       for (np = allnodes; np != 0; np = np->allnext) {
-               if (np->name != 0 && strcasecmp(np->name, name) == 0) {
-                       *prevp = np;
-                       prevp = &np->next;
-               }
-       }
-       *prevp = NULL;
-       return head;
-}
-EXPORT_SYMBOL(find_devices);
-
-/**
- * Construct and return a list of the device_nodes with a given type.
- */
-struct device_node *
-find_type_devices(const char *type)
-{
-       struct device_node *head, **prevp, *np;
-
-       prevp = &head;
-       for (np = allnodes; np != 0; np = np->allnext) {
-               if (np->type != 0 && strcasecmp(np->type, type) == 0) {
-                       *prevp = np;
-                       prevp = &np->next;
-               }
-       }
-       *prevp = NULL;
-       return head;
-}
-EXPORT_SYMBOL(find_type_devices);
-
-/**
- * Returns all nodes linked together
- */
-struct device_node *
-find_all_nodes(void)
-{
-       struct device_node *head, **prevp, *np;
-
-       prevp = &head;
-       for (np = allnodes; np != 0; np = np->allnext) {
-               *prevp = np;
-               prevp = &np->next;
-       }
-       *prevp = NULL;
-       return head;
-}
-EXPORT_SYMBOL(find_all_nodes);
-
-/** Checks if the given "compat" string matches one of the strings in
- * the device's "compatible" property
- */
-int
-device_is_compatible(struct device_node *device, const char *compat)
-{
-       const char* cp;
-       int cplen, l;
-
-       cp = (char *) get_property(device, "compatible", &cplen);
-       if (cp == NULL)
-               return 0;
-       while (cplen > 0) {
-               if (strncasecmp(cp, compat, strlen(compat)) == 0)
-                       return 1;
-               l = strlen(cp) + 1;
-               cp += l;
-               cplen -= l;
-       }
-
-       return 0;
-}
-EXPORT_SYMBOL(device_is_compatible);
-
-
-/**
- * Indicates whether the root node has a given value in its
- * compatible property.
- */
-int
-machine_is_compatible(const char *compat)
-{
-       struct device_node *root;
-       int rc = 0;
-
-       root = of_find_node_by_path("/");
-       if (root) {
-               rc = device_is_compatible(root, compat);
-               of_node_put(root);
-       }
-       return rc;
-}
-EXPORT_SYMBOL(machine_is_compatible);
-
-/**
- * Construct and return a list of the device_nodes with a given type
- * and compatible property.
- */
-struct device_node *
-find_compatible_devices(const char *type, const char *compat)
-{
-       struct device_node *head, **prevp, *np;
-
-       prevp = &head;
-       for (np = allnodes; np != 0; np = np->allnext) {
-               if (type != NULL
-                   && !(np->type != 0 && strcasecmp(np->type, type) == 0))
-                       continue;
-               if (device_is_compatible(np, compat)) {
-                       *prevp = np;
-                       prevp = &np->next;
-               }
-       }
-       *prevp = NULL;
-       return head;
-}
-EXPORT_SYMBOL(find_compatible_devices);
-
-/**
- * Find the device_node with a given full_name.
- */
-struct device_node *
-find_path_device(const char *path)
-{
-       struct device_node *np;
-
-       for (np = allnodes; np != 0; np = np->allnext)
-               if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0)
-                       return np;
-       return NULL;
-}
-EXPORT_SYMBOL(find_path_device);
-
-/*******
- *
- * New implementation of the OF "find" APIs, return a refcounted
- * object, call of_node_put() when done.  The device tree and list
- * are protected by a rw_lock.
- *
- * Note that property management will need some locking as well,
- * this isn't dealt with yet.
- *
- *******/
-
-/**
- *     of_find_node_by_name - Find a node by its "name" property
- *     @from:  The node to start searching from or NULL, the node
- *             you pass will not be searched, only the next one
- *             will; typically, you pass what the previous call
- *             returned. of_node_put() will be called on it
- *     @name:  The name string to match against
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_node_by_name(struct device_node *from,
-       const char *name)
-{
-       struct device_node *np;
-
-       read_lock(&devtree_lock);
-       np = from ? from->allnext : allnodes;
-       for (; np != 0; np = np->allnext)
-               if (np->name != 0 && strcasecmp(np->name, name) == 0
-                   && of_node_get(np))
-                       break;
-       if (from)
-               of_node_put(from);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_node_by_name);
-
-/**
- *     of_find_node_by_type - Find a node by its "device_type" property
- *     @from:  The node to start searching from or NULL, the node
- *             you pass will not be searched, only the next one
- *             will; typically, you pass what the previous call
- *             returned. of_node_put() will be called on it
- *     @name:  The type string to match against
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_node_by_type(struct device_node *from,
-       const char *type)
-{
-       struct device_node *np;
-
-       read_lock(&devtree_lock);
-       np = from ? from->allnext : allnodes;
-       for (; np != 0; np = np->allnext)
-               if (np->type != 0 && strcasecmp(np->type, type) == 0
-                   && of_node_get(np))
-                       break;
-       if (from)
-               of_node_put(from);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_node_by_type);
-
-/**
- *     of_find_compatible_node - Find a node based on type and one of the
- *                                tokens in its "compatible" property
- *     @from:          The node to start searching from or NULL, the node
- *                     you pass will not be searched, only the next one
- *                     will; typically, you pass what the previous call
- *                     returned. of_node_put() will be called on it
- *     @type:          The type string to match "device_type" or NULL to ignore
- *     @compatible:    The string to match to one of the tokens in the device
- *                     "compatible" list.
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_compatible_node(struct device_node *from,
-       const char *type, const char *compatible)
-{
-       struct device_node *np;
-
-       read_lock(&devtree_lock);
-       np = from ? from->allnext : allnodes;
-       for (; np != 0; np = np->allnext) {
-               if (type != NULL
-                   && !(np->type != 0 && strcasecmp(np->type, type) == 0))
-                       continue;
-               if (device_is_compatible(np, compatible) && of_node_get(np))
-                       break;
-       }
-       if (from)
-               of_node_put(from);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_compatible_node);
-
-/**
- *     of_find_node_by_path - Find a node matching a full OF path
- *     @path:  The full path to match
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_node_by_path(const char *path)
-{
-       struct device_node *np = allnodes;
-
-       read_lock(&devtree_lock);
-       for (; np != 0; np = np->allnext) {
-               if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0
-                   && of_node_get(np))
-                       break;
-       }
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_node_by_path);
-
-/**
- *     of_find_node_by_phandle - Find a node given a phandle
- *     @handle:        phandle of the node to find
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_node_by_phandle(phandle handle)
-{
-       struct device_node *np;
-
-       read_lock(&devtree_lock);
-       for (np = allnodes; np != 0; np = np->allnext)
-               if (np->linux_phandle == handle)
-                       break;
-       if (np)
-               of_node_get(np);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_node_by_phandle);
-
-/**
- *     of_find_all_nodes - Get next node in global list
- *     @prev:  Previous node or NULL to start iteration
- *             of_node_put() will be called on it
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_find_all_nodes(struct device_node *prev)
-{
-       struct device_node *np;
-
-       read_lock(&devtree_lock);
-       np = prev ? prev->allnext : allnodes;
-       for (; np != 0; np = np->allnext)
-               if (of_node_get(np))
-                       break;
-       if (prev)
-               of_node_put(prev);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_find_all_nodes);
-
-/**
- *     of_get_parent - Get a node's parent if any
- *     @node:  Node to get parent
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_get_parent(const struct device_node *node)
-{
-       struct device_node *np;
-
-       if (!node)
-               return NULL;
-
-       read_lock(&devtree_lock);
-       np = of_node_get(node->parent);
-       read_unlock(&devtree_lock);
-       return np;
-}
-EXPORT_SYMBOL(of_get_parent);
-
-/**
- *     of_get_next_child - Iterate a node childs
- *     @node:  parent node
- *     @prev:  previous child of the parent node, or NULL to get first
- *
- *     Returns a node pointer with refcount incremented, use
- *     of_node_put() on it when done.
- */
-struct device_node *of_get_next_child(const struct device_node *node,
-       struct device_node *prev)
-{
-       struct device_node *next;
-
-       read_lock(&devtree_lock);
-       next = prev ? prev->sibling : node->child;
-       for (; next != 0; next = next->sibling)
-               if (of_node_get(next))
-                       break;
-       if (prev)
-               of_node_put(prev);
-       read_unlock(&devtree_lock);
-       return next;
-}
-EXPORT_SYMBOL(of_get_next_child);
-
-/**
- *     of_node_get - Increment refcount of a node
- *     @node:  Node to inc refcount, NULL is supported to
- *             simplify writing of callers
- *
- *     Returns node.
- */
-struct device_node *of_node_get(struct device_node *node)
-{
-       if (node)
-               kref_get(&node->kref);
-       return node;
-}
-EXPORT_SYMBOL(of_node_get);
-
-static inline struct device_node * kref_to_device_node(struct kref *kref)
-{
-       return container_of(kref, struct device_node, kref);
-}
-
-/**
- *     of_node_release - release a dynamically allocated node
- *     @kref:  kref element of the node to be released
- *
- *     In of_node_put() this function is passed to kref_put()
- *     as the destructor.
- */
-static void of_node_release(struct kref *kref)
-{
-       struct device_node *node = kref_to_device_node(kref);
-       struct property *prop = node->properties;
-
-       if (!OF_IS_DYNAMIC(node))
-               return;
-       while (prop) {
-               struct property *next = prop->next;
-               kfree(prop->name);
-               kfree(prop->value);
-               kfree(prop);
-               prop = next;
-       }
-       kfree(node->intrs);
-       kfree(node->addrs);
-       kfree(node->full_name);
-       kfree(node->data);
-       kfree(node);
-}
-
-/**
- *     of_node_put - Decrement refcount of a node
- *     @node:  Node to dec refcount, NULL is supported to
- *             simplify writing of callers
- *
- */
-void of_node_put(struct device_node *node)
-{
-       if (node)
-               kref_put(&node->kref, of_node_release);
-}
-EXPORT_SYMBOL(of_node_put);
-
-/*
- * Fix up the uninitialized fields in a new device node:
- * name, type, n_addrs, addrs, n_intrs, intrs, and pci-specific fields
- *
- * A lot of boot-time code is duplicated here, because functions such
- * as finish_node_interrupts, interpret_pci_props, etc. cannot use the
- * slab allocator.
- *
- * This should probably be split up into smaller chunks.
- */
-
-static int of_finish_dynamic_node(struct device_node *node,
-                                 unsigned long *unused1, int unused2,
-                                 int unused3, int unused4)
-{
-       struct device_node *parent = of_get_parent(node);
-       int err = 0;
-       phandle *ibm_phandle;
-
-       node->name = get_property(node, "name", NULL);
-       node->type = get_property(node, "device_type", NULL);
-
-       if (!parent) {
-               err = -ENODEV;
-               goto out;
-       }
-
-       /* We don't support that function on PowerMac, at least
-        * not yet
-        */
-       if (_machine == PLATFORM_POWERMAC)
-               return -ENODEV;
-
-       /* fix up new node's linux_phandle field */
-       if ((ibm_phandle = (unsigned int *)get_property(node, "ibm,phandle", NULL)))
-               node->linux_phandle = *ibm_phandle;
-
-out:
-       of_node_put(parent);
-       return err;
-}
-
-/*
- * Plug a device node into the tree and global list.
- */
-void of_attach_node(struct device_node *np)
-{
-       write_lock(&devtree_lock);
-       np->sibling = np->parent->child;
-       np->allnext = allnodes;
-       np->parent->child = np;
-       allnodes = np;
-       write_unlock(&devtree_lock);
-}
-
-/*
- * "Unplug" a node from the device tree.  The caller must hold
- * a reference to the node.  The memory associated with the node
- * is not freed until its refcount goes to zero.
- */
-void of_detach_node(const struct device_node *np)
-{
-       struct device_node *parent;
-
-       write_lock(&devtree_lock);
-
-       parent = np->parent;
-
-       if (allnodes == np)
-               allnodes = np->allnext;
-       else {
-               struct device_node *prev;
-               for (prev = allnodes;
-                    prev->allnext != np;
-                    prev = prev->allnext)
-                       ;
-               prev->allnext = np->allnext;
-       }
-
-       if (parent->child == np)
-               parent->child = np->sibling;
-       else {
-               struct device_node *prevsib;
-               for (prevsib = np->parent->child;
-                    prevsib->sibling != np;
-                    prevsib = prevsib->sibling)
-                       ;
-               prevsib->sibling = np->sibling;
-       }
-
-       write_unlock(&devtree_lock);
-}
-
-static int prom_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
-{
-       int err;
-
-       switch (action) {
-       case PSERIES_RECONFIG_ADD:
-               err = finish_node(node, NULL, of_finish_dynamic_node, 0, 0, 0);
-               if (err < 0) {
-                       printk(KERN_ERR "finish_node returned %d\n", err);
-                       err = NOTIFY_BAD;
-               }
-               break;
-       default:
-               err = NOTIFY_DONE;
-               break;
-       }
-       return err;
-}
-
-static struct notifier_block prom_reconfig_nb = {
-       .notifier_call = prom_reconfig_notifier,
-       .priority = 10, /* This one needs to run first */
-};
-
-static int __init prom_reconfig_setup(void)
-{
-       return pSeries_reconfig_notifier_register(&prom_reconfig_nb);
-}
-__initcall(prom_reconfig_setup);
-
-/*
- * Find a property with a given name for a given node
- * and return the value.
- */
-unsigned char *
-get_property(struct device_node *np, const char *name, int *lenp)
-{
-       struct property *pp;
-
-       for (pp = np->properties; pp != 0; pp = pp->next)
-               if (strcmp(pp->name, name) == 0) {
-                       if (lenp != 0)
-                               *lenp = pp->length;
-                       return pp->value;
-               }
-       return NULL;
-}
-EXPORT_SYMBOL(get_property);
-
-/*
- * Add a property to a node.
- */
-int
-prom_add_property(struct device_node* np, struct property* prop)
-{
-       struct property **next;
-
-       prop->next = NULL;      
-       write_lock(&devtree_lock);
-       next = &np->properties;
-       while (*next) {
-               if (strcmp(prop->name, (*next)->name) == 0) {
-                       /* duplicate ! don't insert it */
-                       write_unlock(&devtree_lock);
-                       return -1;
-               }
-               next = &(*next)->next;
-       }
-       *next = prop;
-       write_unlock(&devtree_lock);
-
-       /* try to add to proc as well if it was initialized */
-       if (np->pde)
-               proc_device_tree_add_prop(np->pde, prop);
-
-       return 0;
-}
-
-#if 0
-void
-print_properties(struct device_node *np)
-{
-       struct property *pp;
-       char *cp;
-       int i, n;
-
-       for (pp = np->properties; pp != 0; pp = pp->next) {
-               printk(KERN_INFO "%s", pp->name);
-               for (i = strlen(pp->name); i < 16; ++i)
-                       printk(" ");
-               cp = (char *) pp->value;
-               for (i = pp->length; i > 0; --i, ++cp)
-                       if ((i > 1 && (*cp < 0x20 || *cp > 0x7e))
-                           || (i == 1 && *cp != 0))
-                               break;
-               if (i == 0 && pp->length > 1) {
-                       /* looks like a string */
-                       printk(" %s\n", (char *) pp->value);
-               } else {
-                       /* dump it in hex */
-                       n = pp->length;
-                       if (n > 64)
-                               n = 64;
-                       if (pp->length % 4 == 0) {
-                               unsigned int *p = (unsigned int *) pp->value;
-
-                               n /= 4;
-                               for (i = 0; i < n; ++i) {
-                                       if (i != 0 && (i % 4) == 0)
-                                               printk("\n                ");
-                                       printk(" %08x", *p++);
-                               }
-                       } else {
-                               unsigned char *bp = pp->value;
-
-                               for (i = 0; i < n; ++i) {
-                                       if (i != 0 && (i % 16) == 0)
-                                               printk("\n                ");
-                                       printk(" %02x", *bp++);
-                               }
-                       }
-                       printk("\n");
-                       if (pp->length > 64)
-                               printk("                 ... (length = %d)\n",
-                                      pp->length);
-               }
-       }
-}
-#endif
-
-
-
-
-
-
-
-
-
-
diff --git a/arch/ppc64/kernel/prom_init.c b/arch/ppc64/kernel/prom_init.c
deleted file mode 100644 (file)
index 6375f40..0000000
+++ /dev/null
@@ -1,2051 +0,0 @@
-/*
- * 
- *
- * Procedures for interfacing to Open Firmware.
- *
- * Paul Mackerras      August 1996.
- * Copyright (C) 1996 Paul Mackerras.
- * 
- *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
- *    {engebret|bergner}@us.ibm.com 
- *
- *      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.
- */
-
-#undef DEBUG_PROM
-
-#include <stdarg.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/spinlock.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-#include <linux/stringify.h>
-#include <linux/delay.h>
-#include <linux/initrd.h>
-#include <linux/bitops.h>
-#include <asm/prom.h>
-#include <asm/rtas.h>
-#include <asm/abs_addr.h>
-#include <asm/page.h>
-#include <asm/processor.h>
-#include <asm/irq.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/system.h>
-#include <asm/mmu.h>
-#include <asm/pgtable.h>
-#include <asm/pci.h>
-#include <asm/iommu.h>
-#include <asm/btext.h>
-#include <asm/sections.h>
-#include <asm/machdep.h>
-
-#ifdef CONFIG_LOGO_LINUX_CLUT224
-#include <linux/linux_logo.h>
-extern const struct linux_logo logo_linux_clut224;
-#endif
-
-/*
- * Properties whose value is longer than this get excluded from our
- * copy of the device tree. This value does need to be big enough to
- * ensure that we don't lose things like the interrupt-map property
- * on a PCI-PCI bridge.
- */
-#define MAX_PROPERTY_LENGTH    (1UL * 1024 * 1024)
-
-/*
- * Eventually bump that one up
- */
-#define DEVTREE_CHUNK_SIZE     0x100000
-
-/*
- * This is the size of the local memory reserve map that gets copied
- * into the boot params passed to the kernel. That size is totally
- * flexible as the kernel just reads the list until it encounters an
- * entry with size 0, so it can be changed without breaking binary
- * compatibility
- */
-#define MEM_RESERVE_MAP_SIZE   8
-
-/*
- * prom_init() is called very early on, before the kernel text
- * and data have been mapped to KERNELBASE.  At this point the code
- * is running at whatever address it has been loaded at, so
- * references to extern and static variables must be relocated
- * explicitly.  The procedure reloc_offset() returns the address
- * we're currently running at minus the address we were linked at.
- * (Note that strings count as static variables.)
- *
- * Because OF may have mapped I/O devices into the area starting at
- * KERNELBASE, particularly on CHRP machines, we can't safely call
- * OF once the kernel has been mapped to KERNELBASE.  Therefore all
- * OF calls should be done within prom_init(), and prom_init()
- * and all routines called within it must be careful to relocate
- * references as necessary.
- *
- * Note that the bss is cleared *after* prom_init runs, so we have
- * to make sure that any static or extern variables it accesses
- * are put in the data segment.
- */
-
-
-#define PROM_BUG() do {                                                \
-        prom_printf("kernel BUG at %s line 0x%x!\n",           \
-                   RELOC(__FILE__), __LINE__);                 \
-        __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR);      \
-} while (0)
-
-#ifdef DEBUG_PROM
-#define prom_debug(x...)       prom_printf(x)
-#else
-#define prom_debug(x...)
-#endif
-
-
-typedef u32 prom_arg_t;
-
-struct prom_args {
-        u32 service;
-        u32 nargs;
-        u32 nret;
-        prom_arg_t args[10];
-        prom_arg_t *rets;     /* Pointer to return values in args[16]. */
-};
-
-struct prom_t {
-       unsigned long entry;
-       ihandle root;
-       ihandle chosen;
-       int cpu;
-       ihandle stdout;
-       ihandle disp_node;
-       struct prom_args args;
-       unsigned long version;
-       unsigned long root_size_cells;
-       unsigned long root_addr_cells;
-};
-
-struct pci_reg_property {
-       struct pci_address addr;
-       u32 size_hi;
-       u32 size_lo;
-};
-
-struct mem_map_entry {
-       u64     base;
-       u64     size;
-};
-
-typedef u32 cell_t;
-
-extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
-
-extern void enter_prom(struct prom_args *args, unsigned long entry);
-extern void copy_and_flush(unsigned long dest, unsigned long src,
-                          unsigned long size, unsigned long offset);
-
-extern unsigned long klimit;
-
-/* prom structure */
-static struct prom_t __initdata prom;
-
-#define PROM_SCRATCH_SIZE 256
-
-static char __initdata of_stdout_device[256];
-static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
-
-static unsigned long __initdata dt_header_start;
-static unsigned long __initdata dt_struct_start, dt_struct_end;
-static unsigned long __initdata dt_string_start, dt_string_end;
-
-static unsigned long __initdata prom_initrd_start, prom_initrd_end;
-
-static int __initdata iommu_force_on;
-static int __initdata ppc64_iommu_off;
-static int __initdata of_platform;
-
-static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
-
-static unsigned long __initdata prom_memory_limit;
-static unsigned long __initdata prom_tce_alloc_start;
-static unsigned long __initdata prom_tce_alloc_end;
-
-static unsigned long __initdata alloc_top;
-static unsigned long __initdata alloc_top_high;
-static unsigned long __initdata alloc_bottom;
-static unsigned long __initdata rmo_top;
-static unsigned long __initdata ram_top;
-
-static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
-static int __initdata mem_reserve_cnt;
-
-static cell_t __initdata regbuf[1024];
-
-
-#define MAX_CPU_THREADS 2
-
-/* TO GO */
-#ifdef CONFIG_HMT
-struct {
-       unsigned int pir;
-       unsigned int threadid;
-} hmt_thread_data[NR_CPUS];
-#endif /* CONFIG_HMT */
-
-/*
- * This are used in calls to call_prom.  The 4th and following
- * arguments to call_prom should be 32-bit values.  64 bit values
- * are truncated to 32 bits (and fortunately don't get interpreted
- * as two arguments).
- */
-#define ADDR(x)                (u32) ((unsigned long)(x) - offset)
-
-/*
- * Error results ... some OF calls will return "-1" on error, some
- * will return 0, some will return either. To simplify, here are
- * macros to use with any ihandle or phandle return value to check if
- * it is valid
- */
-
-#define PROM_ERROR             (-1u)
-#define PHANDLE_VALID(p)       ((p) != 0 && (p) != PROM_ERROR)
-#define IHANDLE_VALID(i)       ((i) != 0 && (i) != PROM_ERROR)
-
-
-/* This is the one and *ONLY* place where we actually call open
- * firmware from, since we need to make sure we're running in 32b
- * mode when we do.  We switch back to 64b mode upon return.
- */
-
-static int __init call_prom(const char *service, int nargs, int nret, ...)
-{
-       int i;
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       va_list list;
-
-       _prom->args.service = ADDR(service);
-       _prom->args.nargs = nargs;
-       _prom->args.nret = nret;
-       _prom->args.rets = (prom_arg_t *)&(_prom->args.args[nargs]);
-
-       va_start(list, nret);
-       for (i=0; i < nargs; i++)
-               _prom->args.args[i] = va_arg(list, prom_arg_t);
-       va_end(list);
-
-       for (i=0; i < nret ;i++)
-               _prom->args.rets[i] = 0;
-
-       enter_prom(&_prom->args, _prom->entry);
-
-       return (nret > 0) ? _prom->args.rets[0] : 0;
-}
-
-
-static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
-                               unsigned long align)
-{
-       return (unsigned int)call_prom("claim", 3, 1,
-                                      (prom_arg_t)virt, (prom_arg_t)size,
-                                      (prom_arg_t)align);
-}
-
-static void __init prom_print(const char *msg)
-{
-       const char *p, *q;
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       if (_prom->stdout == 0)
-               return;
-
-       for (p = msg; *p != 0; p = q) {
-               for (q = p; *q != 0 && *q != '\n'; ++q)
-                       ;
-               if (q > p)
-                       call_prom("write", 3, 1, _prom->stdout, p, q - p);
-               if (*q == 0)
-                       break;
-               ++q;
-               call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2);
-       }
-}
-
-
-static void __init prom_print_hex(unsigned long val)
-{
-       unsigned long offset = reloc_offset();
-       int i, nibbles = sizeof(val)*2;
-       char buf[sizeof(val)*2+1];
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       for (i = nibbles-1;  i >= 0;  i--) {
-               buf[i] = (val & 0xf) + '0';
-               if (buf[i] > '9')
-                       buf[i] += ('a'-'0'-10);
-               val >>= 4;
-       }
-       buf[nibbles] = '\0';
-       call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
-}
-
-
-static void __init prom_printf(const char *format, ...)
-{
-       unsigned long offset = reloc_offset();
-       const char *p, *q, *s;
-       va_list args;
-       unsigned long v;
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       va_start(args, format);
-       for (p = PTRRELOC(format); *p != 0; p = q) {
-               for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
-                       ;
-               if (q > p)
-                       call_prom("write", 3, 1, _prom->stdout, p, q - p);
-               if (*q == 0)
-                       break;
-               if (*q == '\n') {
-                       ++q;
-                       call_prom("write", 3, 1, _prom->stdout,
-                                 ADDR("\r\n"), 2);
-                       continue;
-               }
-               ++q;
-               if (*q == 0)
-                       break;
-               switch (*q) {
-               case 's':
-                       ++q;
-                       s = va_arg(args, const char *);
-                       prom_print(s);
-                       break;
-               case 'x':
-                       ++q;
-                       v = va_arg(args, unsigned long);
-                       prom_print_hex(v);
-                       break;
-               }
-       }
-}
-
-
-static void __init __attribute__((noreturn)) prom_panic(const char *reason)
-{
-       unsigned long offset = reloc_offset();
-
-       prom_print(PTRRELOC(reason));
-       /* ToDo: should put up an SRC here */
-       call_prom("exit", 0, 0);
-
-       for (;;)                        /* should never get here */
-               ;
-}
-
-
-static int __init prom_next_node(phandle *nodep)
-{
-       phandle node;
-
-       if ((node = *nodep) != 0
-           && (*nodep = call_prom("child", 1, 1, node)) != 0)
-               return 1;
-       if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
-               return 1;
-       for (;;) {
-               if ((node = call_prom("parent", 1, 1, node)) == 0)
-                       return 0;
-               if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
-                       return 1;
-       }
-}
-
-static int __init prom_getprop(phandle node, const char *pname,
-                              void *value, size_t valuelen)
-{
-       unsigned long offset = reloc_offset();
-
-       return call_prom("getprop", 4, 1, node, ADDR(pname),
-                        (u32)(unsigned long) value, (u32) valuelen);
-}
-
-static int __init prom_getproplen(phandle node, const char *pname)
-{
-       unsigned long offset = reloc_offset();
-
-       return call_prom("getproplen", 2, 1, node, ADDR(pname));
-}
-
-static int __init prom_setprop(phandle node, const char *pname,
-                              void *value, size_t valuelen)
-{
-       unsigned long offset = reloc_offset();
-
-       return call_prom("setprop", 4, 1, node, ADDR(pname),
-                        (u32)(unsigned long) value, (u32) valuelen);
-}
-
-/* We can't use the standard versions because of RELOC headaches. */
-#define isxdigit(c)    (('0' <= (c) && (c) <= '9') \
-                        || ('a' <= (c) && (c) <= 'f') \
-                        || ('A' <= (c) && (c) <= 'F'))
-
-#define isdigit(c)     ('0' <= (c) && (c) <= '9')
-#define islower(c)     ('a' <= (c) && (c) <= 'z')
-#define toupper(c)     (islower(c) ? ((c) - 'a' + 'A') : (c))
-
-unsigned long prom_strtoul(const char *cp, const char **endp)
-{
-       unsigned long result = 0, base = 10, value;
-
-       if (*cp == '0') {
-               base = 8;
-               cp++;
-               if (toupper(*cp) == 'X') {
-                       cp++;
-                       base = 16;
-               }
-       }
-
-       while (isxdigit(*cp) &&
-              (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
-               result = result * base + value;
-               cp++;
-       }
-
-       if (endp)
-               *endp = cp;
-
-       return result;
-}
-
-unsigned long prom_memparse(const char *ptr, const char **retptr)
-{
-       unsigned long ret = prom_strtoul(ptr, retptr);
-       int shift = 0;
-
-       /*
-        * We can't use a switch here because GCC *may* generate a
-        * jump table which won't work, because we're not running at
-        * the address we're linked at.
-        */
-       if ('G' == **retptr || 'g' == **retptr)
-               shift = 30;
-
-       if ('M' == **retptr || 'm' == **retptr)
-               shift = 20;
-
-       if ('K' == **retptr || 'k' == **retptr)
-               shift = 10;
-
-       if (shift) {
-               ret <<= shift;
-               (*retptr)++;
-       }
-
-       return ret;
-}
-
-/*
- * Early parsing of the command line passed to the kernel, used for
- * "mem=x" and the options that affect the iommu
- */
-static void __init early_cmdline_parse(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       char *opt, *p;
-       int l = 0;
-
-       RELOC(prom_cmd_line[0]) = 0;
-       p = RELOC(prom_cmd_line);
-       if ((long)_prom->chosen > 0)
-               l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
-#ifdef CONFIG_CMDLINE
-       if (l == 0) /* dbl check */
-               strlcpy(RELOC(prom_cmd_line),
-                       RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
-#endif /* CONFIG_CMDLINE */
-       prom_printf("command line: %s\n", RELOC(prom_cmd_line));
-
-       opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
-       if (opt) {
-               prom_printf("iommu opt is: %s\n", opt);
-               opt += 6;
-               while (*opt && *opt == ' ')
-                       opt++;
-               if (!strncmp(opt, RELOC("off"), 3))
-                       RELOC(ppc64_iommu_off) = 1;
-               else if (!strncmp(opt, RELOC("force"), 5))
-                       RELOC(iommu_force_on) = 1;
-       }
-
-       opt = strstr(RELOC(prom_cmd_line), RELOC("mem="));
-       if (opt) {
-               opt += 4;
-               RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt);
-               /* Align to 16 MB == size of large page */
-               RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000);
-       }
-}
-
-/*
- * To tell the firmware what our capabilities are, we have to pass
- * it a fake 32-bit ELF header containing a couple of PT_NOTE sections
- * that contain structures that contain the actual values.
- */
-static struct fake_elf {
-       Elf32_Ehdr      elfhdr;
-       Elf32_Phdr      phdr[2];
-       struct chrpnote {
-               u32     namesz;
-               u32     descsz;
-               u32     type;
-               char    name[8];        /* "PowerPC" */
-               struct chrpdesc {
-                       u32     real_mode;
-                       u32     real_base;
-                       u32     real_size;
-                       u32     virt_base;
-                       u32     virt_size;
-                       u32     load_base;
-               } chrpdesc;
-       } chrpnote;
-       struct rpanote {
-               u32     namesz;
-               u32     descsz;
-               u32     type;
-               char    name[24];       /* "IBM,RPA-Client-Config" */
-               struct rpadesc {
-                       u32     lpar_affinity;
-                       u32     min_rmo_size;
-                       u32     min_rmo_percent;
-                       u32     max_pft_size;
-                       u32     splpar;
-                       u32     min_load;
-                       u32     new_mem_def;
-                       u32     ignore_me;
-               } rpadesc;
-       } rpanote;
-} fake_elf = {
-       .elfhdr = {
-               .e_ident = { 0x7f, 'E', 'L', 'F',
-                            ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
-               .e_type = ET_EXEC,      /* yeah right */
-               .e_machine = EM_PPC,
-               .e_version = EV_CURRENT,
-               .e_phoff = offsetof(struct fake_elf, phdr),
-               .e_phentsize = sizeof(Elf32_Phdr),
-               .e_phnum = 2
-       },
-       .phdr = {
-               [0] = {
-                       .p_type = PT_NOTE,
-                       .p_offset = offsetof(struct fake_elf, chrpnote),
-                       .p_filesz = sizeof(struct chrpnote)
-               }, [1] = {
-                       .p_type = PT_NOTE,
-                       .p_offset = offsetof(struct fake_elf, rpanote),
-                       .p_filesz = sizeof(struct rpanote)
-               }
-       },
-       .chrpnote = {
-               .namesz = sizeof("PowerPC"),
-               .descsz = sizeof(struct chrpdesc),
-               .type = 0x1275,
-               .name = "PowerPC",
-               .chrpdesc = {
-                       .real_mode = ~0U,       /* ~0 means "don't care" */
-                       .real_base = ~0U,
-                       .real_size = ~0U,
-                       .virt_base = ~0U,
-                       .virt_size = ~0U,
-                       .load_base = ~0U
-               },
-       },
-       .rpanote = {
-               .namesz = sizeof("IBM,RPA-Client-Config"),
-               .descsz = sizeof(struct rpadesc),
-               .type = 0x12759999,
-               .name = "IBM,RPA-Client-Config",
-               .rpadesc = {
-                       .lpar_affinity = 0,
-                       .min_rmo_size = 64,     /* in megabytes */
-                       .min_rmo_percent = 0,
-                       .max_pft_size = 48,     /* 2^48 bytes max PFT size */
-                       .splpar = 1,
-                       .min_load = ~0U,
-                       .new_mem_def = 0
-               }
-       }
-};
-
-static void __init prom_send_capabilities(void)
-{
-       unsigned long offset = reloc_offset();
-       ihandle elfloader;
-
-       elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
-       if (elfloader == 0) {
-               prom_printf("couldn't open /packages/elf-loader\n");
-               return;
-       }
-       call_prom("call-method", 3, 1, ADDR("process-elf-header"),
-                       elfloader, ADDR(&fake_elf));
-       call_prom("close", 1, 0, elfloader);
-}
-
-/*
- * Memory allocation strategy... our layout is normally:
- *
- *  at 14Mb or more we vmlinux, then a gap and initrd. In some rare cases, initrd
- *  might end up beeing before the kernel though. We assume this won't override
- *  the final kernel at 0, we have no provision to handle that in this version,
- *  but it should hopefully never happen.
- *
- *  alloc_top is set to the top of RMO, eventually shrink down if the TCEs overlap
- *  alloc_bottom is set to the top of kernel/initrd
- *
- *  from there, allocations are done that way : rtas is allocated topmost, and
- *  the device-tree is allocated from the bottom. We try to grow the device-tree
- *  allocation as we progress. If we can't, then we fail, we don't currently have
- *  a facility to restart elsewhere, but that shouldn't be necessary neither
- *
- *  Note that calls to reserve_mem have to be done explicitely, memory allocated
- *  with either alloc_up or alloc_down isn't automatically reserved.
- */
-
-
-/*
- * Allocates memory in the RMO upward from the kernel/initrd
- *
- * When align is 0, this is a special case, it means to allocate in place
- * at the current location of alloc_bottom or fail (that is basically
- * extending the previous allocation). Used for the device-tree flattening
- */
-static unsigned long __init alloc_up(unsigned long size, unsigned long align)
-{
-       unsigned long offset = reloc_offset();
-       unsigned long base = _ALIGN_UP(RELOC(alloc_bottom), align);
-       unsigned long addr = 0;
-
-       prom_debug("alloc_up(%x, %x)\n", size, align);
-       if (RELOC(ram_top) == 0)
-               prom_panic("alloc_up() called with mem not initialized\n");
-
-       if (align)
-               base = _ALIGN_UP(RELOC(alloc_bottom), align);
-       else
-               base = RELOC(alloc_bottom);
-
-       for(; (base + size) <= RELOC(alloc_top); 
-           base = _ALIGN_UP(base + 0x100000, align)) {
-               prom_debug("    trying: 0x%x\n\r", base);
-               addr = (unsigned long)prom_claim(base, size, 0);
-               if (addr != PROM_ERROR)
-                       break;
-               addr = 0;
-               if (align == 0)
-                       break;
-       }
-       if (addr == 0)
-               return 0;
-       RELOC(alloc_bottom) = addr;
-
-       prom_debug(" -> %x\n", addr);
-       prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
-       prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
-       prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
-       prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
-       prom_debug("  ram_top      : %x\n", RELOC(ram_top));
-
-       return addr;
-}
-
-/*
- * Allocates memory downard, either from top of RMO, or if highmem
- * is set, from the top of RAM. Note that this one doesn't handle
- * failures. In does claim memory if highmem is not set.
- */
-static unsigned long __init alloc_down(unsigned long size, unsigned long align,
-                                      int highmem)
-{
-       unsigned long offset = reloc_offset();
-       unsigned long base, addr = 0;
-
-       prom_debug("alloc_down(%x, %x, %s)\n", size, align,
-                  highmem ? RELOC("(high)") : RELOC("(low)"));
-       if (RELOC(ram_top) == 0)
-               prom_panic("alloc_down() called with mem not initialized\n");
-
-       if (highmem) {
-               /* Carve out storage for the TCE table. */
-               addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
-               if (addr <= RELOC(alloc_bottom))
-                       return 0;
-               else {
-                       /* Will we bump into the RMO ? If yes, check out that we
-                        * didn't overlap existing allocations there, if we did,
-                        * we are dead, we must be the first in town !
-                        */
-                       if (addr < RELOC(rmo_top)) {
-                               /* Good, we are first */
-                               if (RELOC(alloc_top) == RELOC(rmo_top))
-                                       RELOC(alloc_top) = RELOC(rmo_top) = addr;
-                               else
-                                       return 0;
-                       }
-                       RELOC(alloc_top_high) = addr;
-               }
-               goto bail;
-       }
-
-       base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
-       for(; base > RELOC(alloc_bottom); base = _ALIGN_DOWN(base - 0x100000, align))  {
-               prom_debug("    trying: 0x%x\n\r", base);
-               addr = (unsigned long)prom_claim(base, size, 0);
-               if (addr != PROM_ERROR)
-                       break;
-               addr = 0;
-       }
-       if (addr == 0)
-               return 0;
-       RELOC(alloc_top) = addr;
-
- bail:
-       prom_debug(" -> %x\n", addr);
-       prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
-       prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
-       prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
-       prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
-       prom_debug("  ram_top      : %x\n", RELOC(ram_top));
-
-       return addr;
-}
-
-/*
- * Parse a "reg" cell
- */
-static unsigned long __init prom_next_cell(int s, cell_t **cellp)
-{
-       cell_t *p = *cellp;
-       unsigned long r = 0;
-
-       /* Ignore more than 2 cells */
-       while (s > 2) {
-               p++;
-               s--;
-       }
-       while (s) {
-               r <<= 32;
-               r |= *(p++);
-               s--;
-       }
-
-       *cellp = p;
-       return r;
-}
-
-/*
- * Very dumb function for adding to the memory reserve list, but
- * we don't need anything smarter at this point
- *
- * XXX Eventually check for collisions. They should NEVER happen
- * if problems seem to show up, it would be a good start to track
- * them down.
- */
-static void reserve_mem(unsigned long base, unsigned long size)
-{
-       unsigned long offset = reloc_offset();
-       unsigned long top = base + size;
-       unsigned long cnt = RELOC(mem_reserve_cnt);
-
-       if (size == 0)
-               return;
-
-       /* We need to always keep one empty entry so that we
-        * have our terminator with "size" set to 0 since we are
-        * dumb and just copy this entire array to the boot params
-        */
-       base = _ALIGN_DOWN(base, PAGE_SIZE);
-       top = _ALIGN_UP(top, PAGE_SIZE);
-       size = top - base;
-
-       if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
-               prom_panic("Memory reserve map exhausted !\n");
-       RELOC(mem_reserve_map)[cnt].base = base;
-       RELOC(mem_reserve_map)[cnt].size = size;
-       RELOC(mem_reserve_cnt) = cnt + 1;
-}
-
-/*
- * Initialize memory allocation mecanism, parse "memory" nodes and
- * obtain that way the top of memory and RMO to setup out local allocator
- */
-static void __init prom_init_mem(void)
-{
-       phandle node;
-       char *path, type[64];
-       unsigned int plen;
-       cell_t *p, *endp;
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       /*
-        * We iterate the memory nodes to find
-        * 1) top of RMO (first node)
-        * 2) top of memory
-        */
-       prom_debug("root_addr_cells: %x\n", (long)_prom->root_addr_cells);
-       prom_debug("root_size_cells: %x\n", (long)_prom->root_size_cells);
-
-       prom_debug("scanning memory:\n");
-       path = RELOC(prom_scratch);
-
-       for (node = 0; prom_next_node(&node); ) {
-               type[0] = 0;
-               prom_getprop(node, "device_type", type, sizeof(type));
-
-               if (strcmp(type, RELOC("memory")))
-                       continue;
-       
-               plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
-               if (plen > sizeof(regbuf)) {
-                       prom_printf("memory node too large for buffer !\n");
-                       plen = sizeof(regbuf);
-               }
-               p = RELOC(regbuf);
-               endp = p + (plen / sizeof(cell_t));
-
-#ifdef DEBUG_PROM
-               memset(path, 0, PROM_SCRATCH_SIZE);
-               call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
-               prom_debug("  node %s :\n", path);
-#endif /* DEBUG_PROM */
-
-               while ((endp - p) >= (_prom->root_addr_cells + _prom->root_size_cells)) {
-                       unsigned long base, size;
-
-                       base = prom_next_cell(_prom->root_addr_cells, &p);
-                       size = prom_next_cell(_prom->root_size_cells, &p);
-
-                       if (size == 0)
-                               continue;
-                       prom_debug("    %x %x\n", base, size);
-                       if (base == 0)
-                               RELOC(rmo_top) = size;
-                       if ((base + size) > RELOC(ram_top))
-                               RELOC(ram_top) = base + size;
-               }
-       }
-
-       RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(klimit) - offset + 0x4000);
-
-       /* Check if we have an initrd after the kernel, if we do move our bottom
-        * point to after it
-        */
-       if (RELOC(prom_initrd_start)) {
-               if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
-                       RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
-       }
-
-       /*
-        * If prom_memory_limit is set we reduce the upper limits *except* for
-        * alloc_top_high. This must be the real top of RAM so we can put
-        * TCE's up there.
-        */
-
-       RELOC(alloc_top_high) = RELOC(ram_top);
-
-       if (RELOC(prom_memory_limit)) {
-               if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) {
-                       prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
-                               RELOC(prom_memory_limit));
-                       RELOC(prom_memory_limit) = 0;
-               } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) {
-                       prom_printf("Ignoring mem=%x >= ram_top.\n",
-                               RELOC(prom_memory_limit));
-                       RELOC(prom_memory_limit) = 0;
-               } else {
-                       RELOC(ram_top) = RELOC(prom_memory_limit);
-                       RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit));
-               }
-       }
-
-       /*
-        * Setup our top alloc point, that is top of RMO or top of
-        * segment 0 when running non-LPAR.
-        */
-       if ( RELOC(of_platform) == PLATFORM_PSERIES_LPAR )
-               RELOC(alloc_top) = RELOC(rmo_top);
-       else
-               /* Some RS64 machines have buggy firmware where claims up at 1GB
-                * fails. Cap at 768MB as a workaround. Still plenty of room.
-                */
-               RELOC(alloc_top) = RELOC(rmo_top) = min(0x30000000ul, RELOC(ram_top));
-
-       prom_printf("memory layout at init:\n");
-       prom_printf("  memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
-       prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
-       prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
-       prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
-       prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
-       prom_printf("  ram_top      : %x\n", RELOC(ram_top));
-}
-
-
-/*
- * Allocate room for and instanciate RTAS
- */
-static void __init prom_instantiate_rtas(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       phandle rtas_node;
-       ihandle rtas_inst;
-       u32 base, entry = 0;
-       u32 size = 0;
-
-       prom_debug("prom_instantiate_rtas: start...\n");
-
-       rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
-       prom_debug("rtas_node: %x\n", rtas_node);
-       if (!PHANDLE_VALID(rtas_node))
-               return;
-
-       prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
-       if (size == 0)
-               return;
-
-       base = alloc_down(size, PAGE_SIZE, 0);
-       if (base == 0) {
-               prom_printf("RTAS allocation failed !\n");
-               return;
-       }
-
-       rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
-       if (!IHANDLE_VALID(rtas_inst)) {
-               prom_printf("opening rtas package failed");
-               return;
-       }
-
-       prom_printf("instantiating rtas at 0x%x ...", base);
-
-       if (call_prom("call-method", 3, 2,
-                     ADDR("instantiate-rtas"),
-                     rtas_inst, base) != PROM_ERROR) {
-               entry = (long)_prom->args.rets[1];
-       }
-       if (entry == 0) {
-               prom_printf(" failed\n");
-               return;
-       }
-       prom_printf(" done\n");
-
-       reserve_mem(base, size);
-
-       prom_setprop(rtas_node, "linux,rtas-base", &base, sizeof(base));
-       prom_setprop(rtas_node, "linux,rtas-entry", &entry, sizeof(entry));
-
-       prom_debug("rtas base     = 0x%x\n", base);
-       prom_debug("rtas entry    = 0x%x\n", entry);
-       prom_debug("rtas size     = 0x%x\n", (long)size);
-
-       prom_debug("prom_instantiate_rtas: end...\n");
-}
-
-
-/*
- * Allocate room for and initialize TCE tables
- */
-static void __init prom_initialize_tce_table(void)
-{
-       phandle node;
-       ihandle phb_node;
-       unsigned long offset = reloc_offset();
-       char compatible[64], type[64], model[64];
-       char *path = RELOC(prom_scratch);
-       u64 base, align;
-       u32 minalign, minsize;
-       u64 tce_entry, *tce_entryp;
-       u64 local_alloc_top, local_alloc_bottom;
-       u64 i;
-
-       if (RELOC(ppc64_iommu_off))
-               return;
-
-       prom_debug("starting prom_initialize_tce_table\n");
-
-       /* Cache current top of allocs so we reserve a single block */
-       local_alloc_top = RELOC(alloc_top_high);
-       local_alloc_bottom = local_alloc_top;
-
-       /* Search all nodes looking for PHBs. */
-       for (node = 0; prom_next_node(&node); ) {
-               compatible[0] = 0;
-               type[0] = 0;
-               model[0] = 0;
-               prom_getprop(node, "compatible",
-                            compatible, sizeof(compatible));
-               prom_getprop(node, "device_type", type, sizeof(type));
-               prom_getprop(node, "model", model, sizeof(model));
-
-               if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
-                       continue;
-
-               /* Keep the old logic in tack to avoid regression. */
-               if (compatible[0] != 0) {
-                       if ((strstr(compatible, RELOC("python")) == NULL) &&
-                           (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
-                           (strstr(compatible, RELOC("Winnipeg")) == NULL))
-                               continue;
-               } else if (model[0] != 0) {
-                       if ((strstr(model, RELOC("ython")) == NULL) &&
-                           (strstr(model, RELOC("peedwagon")) == NULL) &&
-                           (strstr(model, RELOC("innipeg")) == NULL))
-                               continue;
-               }
-
-               if (prom_getprop(node, "tce-table-minalign", &minalign,
-                                sizeof(minalign)) == PROM_ERROR)
-                       minalign = 0;
-               if (prom_getprop(node, "tce-table-minsize", &minsize,
-                                sizeof(minsize)) == PROM_ERROR)
-                       minsize = 4UL << 20;
-
-               /*
-                * Even though we read what OF wants, we just set the table
-                * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
-                * By doing this, we avoid the pitfalls of trying to DMA to
-                * MMIO space and the DMA alias hole.
-                *
-                * On POWER4, firmware sets the TCE region by assuming
-                * each TCE table is 8MB. Using this memory for anything
-                * else will impact performance, so we always allocate 8MB.
-                * Anton
-                */
-               if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
-                       minsize = 8UL << 20;
-               else
-                       minsize = 4UL << 20;
-
-               /* Align to the greater of the align or size */
-               align = max(minalign, minsize);
-               base = alloc_down(minsize, align, 1);
-               if (base == 0)
-                       prom_panic("ERROR, cannot find space for TCE table.\n");
-               if (base < local_alloc_bottom)
-                       local_alloc_bottom = base;
-
-               /* Save away the TCE table attributes for later use. */
-               prom_setprop(node, "linux,tce-base", &base, sizeof(base));
-               prom_setprop(node, "linux,tce-size", &minsize, sizeof(minsize));
-
-               /* It seems OF doesn't null-terminate the path :-( */
-               memset(path, 0, sizeof(path));
-               /* Call OF to setup the TCE hardware */
-               if (call_prom("package-to-path", 3, 1, node,
-                             path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
-                       prom_printf("package-to-path failed\n");
-               }
-
-               prom_debug("TCE table: %s\n", path);
-               prom_debug("\tnode = 0x%x\n", node);
-               prom_debug("\tbase = 0x%x\n", base);
-               prom_debug("\tsize = 0x%x\n", minsize);
-
-               /* Initialize the table to have a one-to-one mapping
-                * over the allocated size.
-                */
-               tce_entryp = (unsigned long *)base;
-               for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
-                       tce_entry = (i << PAGE_SHIFT);
-                       tce_entry |= 0x3;
-                       *tce_entryp = tce_entry;
-               }
-
-               prom_printf("opening PHB %s", path);
-               phb_node = call_prom("open", 1, 1, path);
-               if (phb_node == 0)
-                       prom_printf("... failed\n");
-               else
-                       prom_printf("... done\n");
-
-               call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
-                         phb_node, -1, minsize,
-                         (u32) base, (u32) (base >> 32));
-               call_prom("close", 1, 0, phb_node);
-       }
-
-       reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
-
-       if (RELOC(prom_memory_limit)) {
-               /*
-                * We align the start to a 16MB boundary so we can map the TCE area
-                * using large pages if possible. The end should be the top of RAM
-                * so no need to align it.
-                */
-               RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom, 0x1000000);
-               RELOC(prom_tce_alloc_end) = local_alloc_top;
-       }
-
-       /* Flag the first invalid entry */
-       prom_debug("ending prom_initialize_tce_table\n");
-}
-
-/*
- * With CHRP SMP we need to use the OF to start the other
- * processors so we can't wait until smp_boot_cpus (the OF is
- * trashed by then) so we have to put the processors into
- * a holding pattern controlled by the kernel (not OF) before
- * we destroy the OF.
- *
- * This uses a chunk of low memory, puts some holding pattern
- * code there and sends the other processors off to there until
- * smp_boot_cpus tells them to do something.  The holding pattern
- * checks that address until its cpu # is there, when it is that
- * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
- * of setting those values.
- *
- * We also use physical address 0x4 here to tell when a cpu
- * is in its holding pattern code.
- *
- * Fixup comment... DRENG / PPPBBB - Peter
- *
- * -- Cort
- */
-static void __init prom_hold_cpus(void)
-{
-       unsigned long i;
-       unsigned int reg;
-       phandle node;
-       unsigned long offset = reloc_offset();
-       char type[64];
-       int cpuid = 0;
-       unsigned int interrupt_server[MAX_CPU_THREADS];
-       unsigned int cpu_threads, hw_cpu_num;
-       int propsize;
-       extern void __secondary_hold(void);
-       extern unsigned long __secondary_hold_spinloop;
-       extern unsigned long __secondary_hold_acknowledge;
-       unsigned long *spinloop
-               = (void *)virt_to_abs(&__secondary_hold_spinloop);
-       unsigned long *acknowledge
-               = (void *)virt_to_abs(&__secondary_hold_acknowledge);
-       unsigned long secondary_hold
-               = virt_to_abs(*PTRRELOC((unsigned long *)__secondary_hold));
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       prom_debug("prom_hold_cpus: start...\n");
-       prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
-       prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
-       prom_debug("    1) acknowledge    = 0x%x\n",
-                  (unsigned long)acknowledge);
-       prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
-       prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
-
-       /* Set the common spinloop variable, so all of the secondary cpus
-        * will block when they are awakened from their OF spinloop.
-        * This must occur for both SMP and non SMP kernels, since OF will
-        * be trashed when we move the kernel.
-        */
-       *spinloop = 0;
-
-#ifdef CONFIG_HMT
-       for (i=0; i < NR_CPUS; i++) {
-               RELOC(hmt_thread_data)[i].pir = 0xdeadbeef;
-       }
-#endif
-       /* look for cpus */
-       for (node = 0; prom_next_node(&node); ) {
-               type[0] = 0;
-               prom_getprop(node, "device_type", type, sizeof(type));
-               if (strcmp(type, RELOC("cpu")) != 0)
-                       continue;
-
-               /* Skip non-configured cpus. */
-               if (prom_getprop(node, "status", type, sizeof(type)) > 0)
-                       if (strcmp(type, RELOC("okay")) != 0)
-                               continue;
-
-               reg = -1;
-               prom_getprop(node, "reg", &reg, sizeof(reg));
-
-               prom_debug("\ncpuid        = 0x%x\n", cpuid);
-               prom_debug("cpu hw idx   = 0x%x\n", reg);
-
-               /* Init the acknowledge var which will be reset by
-                * the secondary cpu when it awakens from its OF
-                * spinloop.
-                */
-               *acknowledge = (unsigned long)-1;
-
-               propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
-                                       &interrupt_server,
-                                       sizeof(interrupt_server));
-               if (propsize < 0) {
-                       /* no property.  old hardware has no SMT */
-                       cpu_threads = 1;
-                       interrupt_server[0] = reg; /* fake it with phys id */
-               } else {
-                       /* We have a threaded processor */
-                       cpu_threads = propsize / sizeof(u32);
-                       if (cpu_threads > MAX_CPU_THREADS) {
-                               prom_printf("SMT: too many threads!\n"
-                                           "SMT: found %x, max is %x\n",
-                                           cpu_threads, MAX_CPU_THREADS);
-                               cpu_threads = 1; /* ToDo: panic? */
-                       }
-               }
-
-               hw_cpu_num = interrupt_server[0];
-               if (hw_cpu_num != _prom->cpu) {
-                       /* Primary Thread of non-boot cpu */
-                       prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
-                       call_prom("start-cpu", 3, 0, node,
-                                 secondary_hold, reg);
-
-                       for ( i = 0 ; (i < 100000000) && 
-                             (*acknowledge == ((unsigned long)-1)); i++ )
-                               mb();
-
-                       if (*acknowledge == reg) {
-                               prom_printf("done\n");
-                               /* We have to get every CPU out of OF,
-                                * even if we never start it. */
-                               if (cpuid >= NR_CPUS)
-                                       goto next;
-                       } else {
-                               prom_printf("failed: %x\n", *acknowledge);
-                       }
-               }
-#ifdef CONFIG_SMP
-               else
-                       prom_printf("%x : boot cpu     %x\n", cpuid, reg);
-#endif
-next:
-#ifdef CONFIG_SMP
-               /* Init paca for secondary threads.   They start later. */
-               for (i=1; i < cpu_threads; i++) {
-                       cpuid++;
-                       if (cpuid >= NR_CPUS)
-                               continue;
-               }
-#endif /* CONFIG_SMP */
-               cpuid++;
-       }
-#ifdef CONFIG_HMT
-       /* Only enable HMT on processors that provide support. */
-       if (__is_processor(PV_PULSAR) || 
-           __is_processor(PV_ICESTAR) ||
-           __is_processor(PV_SSTAR)) {
-               prom_printf("    starting secondary threads\n");
-
-               for (i = 0; i < NR_CPUS; i += 2) {
-                       if (!cpu_online(i))
-                               continue;
-
-                       if (i == 0) {
-                               unsigned long pir = mfspr(SPRN_PIR);
-                               if (__is_processor(PV_PULSAR)) {
-                                       RELOC(hmt_thread_data)[i].pir = 
-                                               pir & 0x1f;
-                               } else {
-                                       RELOC(hmt_thread_data)[i].pir = 
-                                               pir & 0x3ff;
-                               }
-                       }
-               }
-       } else {
-               prom_printf("Processor is not HMT capable\n");
-       }
-#endif
-
-       if (cpuid > NR_CPUS)
-               prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
-                           ") exceeded: ignoring extras\n");
-
-       prom_debug("prom_hold_cpus: end...\n");
-}
-
-
-static void __init prom_init_client_services(unsigned long pp)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-
-       /* Get a handle to the prom entry point before anything else */
-       _prom->entry = pp;
-
-       /* Init default value for phys size */
-       _prom->root_size_cells = 1;
-       _prom->root_addr_cells = 2;
-
-       /* get a handle for the stdout device */
-       _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
-       if (!PHANDLE_VALID(_prom->chosen))
-               prom_panic("cannot find chosen"); /* msg won't be printed :( */
-
-       /* get device tree root */
-       _prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
-       if (!PHANDLE_VALID(_prom->root))
-               prom_panic("cannot find device tree root"); /* msg won't be printed :( */
-}
-
-static void __init prom_init_stdout(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       char *path = RELOC(of_stdout_device);
-       char type[16];
-       u32 val;
-
-       if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
-               prom_panic("cannot find stdout");
-
-       _prom->stdout = val;
-
-       /* Get the full OF pathname of the stdout device */
-       memset(path, 0, 256);
-       call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
-       val = call_prom("instance-to-package", 1, 1, _prom->stdout);
-       prom_setprop(_prom->chosen, "linux,stdout-package", &val, sizeof(val));
-       prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
-       prom_setprop(_prom->chosen, "linux,stdout-path",
-                    RELOC(of_stdout_device), strlen(RELOC(of_stdout_device))+1);
-
-       /* If it's a display, note it */
-       memset(type, 0, sizeof(type));
-       prom_getprop(val, "device_type", type, sizeof(type));
-       if (strcmp(type, RELOC("display")) == 0) {
-               _prom->disp_node = val;
-               prom_setprop(val, "linux,boot-display", NULL, 0);
-       }
-}
-
-static void __init prom_close_stdin(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       ihandle val;
-
-       if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
-               call_prom("close", 1, 0, val);
-}
-
-static int __init prom_find_machine_type(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       char compat[256];
-       int len, i = 0;
-       phandle rtas;
-
-       len = prom_getprop(_prom->root, "compatible",
-                          compat, sizeof(compat)-1);
-       if (len > 0) {
-               compat[len] = 0;
-               while (i < len) {
-                       char *p = &compat[i];
-                       int sl = strlen(p);
-                       if (sl == 0)
-                               break;
-                       if (strstr(p, RELOC("Power Macintosh")) ||
-                           strstr(p, RELOC("MacRISC4")))
-                               return PLATFORM_POWERMAC;
-                       if (strstr(p, RELOC("Momentum,Maple")))
-                               return PLATFORM_MAPLE;
-                       i += sl + 1;
-               }
-       }
-       /* Default to pSeries. We need to know if we are running LPAR */
-       rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
-       if (PHANDLE_VALID(rtas)) {
-               int x = prom_getproplen(rtas, "ibm,hypertas-functions");
-               if (x != PROM_ERROR) {
-                       prom_printf("Hypertas detected, assuming LPAR !\n");
-                       return PLATFORM_PSERIES_LPAR;
-               }
-       }
-       return PLATFORM_PSERIES;
-}
-
-static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
-{
-       unsigned long offset = reloc_offset();
-
-       return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
-}
-
-/*
- * If we have a display that we don't know how to drive,
- * we will want to try to execute OF's open method for it
- * later.  However, OF will probably fall over if we do that
- * we've taken over the MMU.
- * So we check whether we will need to open the display,
- * and if so, open it now.
- */
-static void __init prom_check_displays(void)
-{
-       unsigned long offset = reloc_offset();
-       struct prom_t *_prom = PTRRELOC(&prom);
-       char type[16], *path;
-       phandle node;
-       ihandle ih;
-       int i;
-
-       static unsigned char default_colors[] = {
-               0x00, 0x00, 0x00,
-               0x00, 0x00, 0xaa,
-               0x00, 0xaa, 0x00,
-               0x00, 0xaa, 0xaa,
-               0xaa, 0x00, 0x00,
-               0xaa, 0x00, 0xaa,
-               0xaa, 0xaa, 0x00,
-               0xaa, 0xaa, 0xaa,
-               0x55, 0x55, 0x55,
-               0x55, 0x55, 0xff,
-               0x55, 0xff, 0x55,
-               0x55, 0xff, 0xff,
-               0xff, 0x55, 0x55,
-               0xff, 0x55, 0xff,
-               0xff, 0xff, 0x55,
-               0xff, 0xff, 0xff
-       };
-       const unsigned char *clut;
-
-       prom_printf("Looking for displays\n");
-       for (node = 0; prom_next_node(&node); ) {
-               memset(type, 0, sizeof(type));
-               prom_getprop(node, "device_type", type, sizeof(type));
-               if (strcmp(type, RELOC("display")) != 0)
-                       continue;
-
-               /* It seems OF doesn't null-terminate the path :-( */
-               path = RELOC(prom_scratch);
-               memset(path, 0, PROM_SCRATCH_SIZE);
-
-               /*
-                * leave some room at the end of the path for appending extra
-                * arguments
-                */
-               if (call_prom("package-to-path", 3, 1, node, path,
-                             PROM_SCRATCH_SIZE-10) == PROM_ERROR)
-                       continue;
-               prom_printf("found display   : %s, opening ... ", path);
-               
-               ih = call_prom("open", 1, 1, path);
-               if (ih == 0) {
-                       prom_printf("failed\n");
-                       continue;
-               }
-
-               /* Success */
-               prom_printf("done\n");
-               prom_setprop(node, "linux,opened", NULL, 0);
-
-               /*
-                * stdout wasn't a display node, pick the first we can find
-                * for btext
-                */
-               if (_prom->disp_node == 0)
-                       _prom->disp_node = node;
-
-               /* Setup a useable color table when the appropriate
-                * method is available. Should update this to set-colors */
-               clut = RELOC(default_colors);
-               for (i = 0; i < 32; i++, clut += 3)
-                       if (prom_set_color(ih, i, clut[0], clut[1],
-                                          clut[2]) != 0)
-                               break;
-
-#ifdef CONFIG_LOGO_LINUX_CLUT224
-               clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
-               for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
-                       if (prom_set_color(ih, i + 32, clut[0], clut[1],
-                                          clut[2]) != 0)
-                               break;
-#endif /* CONFIG_LOGO_LINUX_CLUT224 */
-       }
-}
-
-
-/* Return (relocated) pointer to this much memory: moves initrd if reqd. */
-static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
-                             unsigned long needed, unsigned long align)
-{
-       unsigned long offset = reloc_offset();
-       void *ret;
-
-       *mem_start = _ALIGN(*mem_start, align);
-       while ((*mem_start + needed) > *mem_end) {
-               unsigned long room, chunk;
-
-               prom_debug("Chunk exhausted, claiming more at %x...\n",
-                          RELOC(alloc_bottom));
-               room = RELOC(alloc_top) - RELOC(alloc_bottom);
-               if (room > DEVTREE_CHUNK_SIZE)
-                       room = DEVTREE_CHUNK_SIZE;
-               if (room < PAGE_SIZE)
-                       prom_panic("No memory for flatten_device_tree (no room)");
-               chunk = alloc_up(room, 0);
-               if (chunk == 0)
-                       prom_panic("No memory for flatten_device_tree (claim failed)");
-               *mem_end = RELOC(alloc_top);
-       }
-
-       ret = (void *)*mem_start;
-       *mem_start += needed;
-
-       return ret;
-}
-
-#define dt_push_token(token, mem_start, mem_end) \
-       do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
-
-static unsigned long __init dt_find_string(char *str)
-{
-       unsigned long offset = reloc_offset();
-       char *s, *os;
-
-       s = os = (char *)RELOC(dt_string_start);
-       s += 4;
-       while (s <  (char *)RELOC(dt_string_end)) {
-               if (strcmp(s, str) == 0)
-                       return s - os;
-               s += strlen(s) + 1;
-       }
-       return 0;
-}
-
-/*
- * The Open Firmware 1275 specification states properties must be 31 bytes or
- * less, however not all firmwares obey this. Make it 64 bytes to be safe.
- */
-#define MAX_PROPERTY_NAME 64
-
-static void __init scan_dt_build_strings(phandle node,
-                                        unsigned long *mem_start,
-                                        unsigned long *mem_end)
-{
-       unsigned long offset = reloc_offset();
-       char *prev_name, *namep, *sstart;
-       unsigned long soff;
-       phandle child;
-
-       sstart =  (char *)RELOC(dt_string_start);
-
-       /* get and store all property names */
-       prev_name = RELOC("");
-       for (;;) {
-               /* 64 is max len of name including nul. */
-               namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
-               if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
-                       /* No more nodes: unwind alloc */
-                       *mem_start = (unsigned long)namep;
-                       break;
-               }
-
-               /* skip "name" */
-               if (strcmp(namep, RELOC("name")) == 0) {
-                       *mem_start = (unsigned long)namep;
-                       prev_name = RELOC("name");
-                       continue;
-               }
-               /* get/create string entry */
-               soff = dt_find_string(namep);
-               if (soff != 0) {
-                       *mem_start = (unsigned long)namep;
-                       namep = sstart + soff;
-               } else {
-                       /* Trim off some if we can */
-                       *mem_start = (unsigned long)namep + strlen(namep) + 1;
-                       RELOC(dt_string_end) = *mem_start;
-               }
-               prev_name = namep;
-       }
-
-       /* do all our children */
-       child = call_prom("child", 1, 1, node);
-       while (child != 0) {
-               scan_dt_build_strings(child, mem_start, mem_end);
-               child = call_prom("peer", 1, 1, child);
-       }
-}
-
-static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
-                                       unsigned long *mem_end)
-{
-       phandle child;
-       char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
-       unsigned long soff;
-       unsigned char *valp;
-       unsigned long offset = reloc_offset();
-       static char pname[MAX_PROPERTY_NAME];
-       int l;
-
-       dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
-
-       /* get the node's full name */
-       namep = (char *)*mem_start;
-       l = call_prom("package-to-path", 3, 1, node,
-                     namep, *mem_end - *mem_start);
-       if (l >= 0) {
-               /* Didn't fit?  Get more room. */
-               if ((l+1) > (*mem_end - *mem_start)) {
-                       namep = make_room(mem_start, mem_end, l+1, 1);
-                       call_prom("package-to-path", 3, 1, node, namep, l);
-               }
-               namep[l] = '\0';
-
-               /* Fixup an Apple bug where they have bogus \0 chars in the
-                * middle of the path in some properties
-                */
-               for (p = namep, ep = namep + l; p < ep; p++)
-                       if (*p == '\0') {
-                               memmove(p, p+1, ep - p);
-                               ep--; l--; p--;
-                       }
-
-               /* now try to extract the unit name in that mess */
-               for (p = namep, lp = NULL; *p; p++)
-                       if (*p == '/')
-                               lp = p + 1;
-               if (lp != NULL)
-                       memmove(namep, lp, strlen(lp) + 1);
-               *mem_start = _ALIGN(((unsigned long) namep) +
-                                   strlen(namep) + 1, 4);
-       }
-
-       /* get it again for debugging */
-       path = RELOC(prom_scratch);
-       memset(path, 0, PROM_SCRATCH_SIZE);
-       call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
-
-       /* get and store all properties */
-       prev_name = RELOC("");
-       sstart = (char *)RELOC(dt_string_start);
-       for (;;) {
-               if (call_prom("nextprop", 3, 1, node, prev_name,
-                             RELOC(pname)) != 1)
-                       break;
-
-               /* skip "name" */
-               if (strcmp(RELOC(pname), RELOC("name")) == 0) {
-                       prev_name = RELOC("name");
-                       continue;
-               }
-
-               /* find string offset */
-               soff = dt_find_string(RELOC(pname));
-               if (soff == 0) {
-                       prom_printf("WARNING: Can't find string index for"
-                                   " <%s>, node %s\n", RELOC(pname), path);
-                       break;
-               }
-               prev_name = sstart + soff;
-
-               /* get length */
-               l = call_prom("getproplen", 2, 1, node, RELOC(pname));
-
-               /* sanity checks */
-               if (l == PROM_ERROR)
-                       continue;
-               if (l > MAX_PROPERTY_LENGTH) {
-                       prom_printf("WARNING: ignoring large property ");
-                       /* It seems OF doesn't null-terminate the path :-( */
-                       prom_printf("[%s] ", path);
-                       prom_printf("%s length 0x%x\n", RELOC(pname), l);
-                       continue;
-               }
-
-               /* push property head */
-               dt_push_token(OF_DT_PROP, mem_start, mem_end);
-               dt_push_token(l, mem_start, mem_end);
-               dt_push_token(soff, mem_start, mem_end);
-
-               /* push property content */
-               valp = make_room(mem_start, mem_end, l, 4);
-               call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
-               *mem_start = _ALIGN(*mem_start, 4);
-       }
-
-       /* Add a "linux,phandle" property. */
-       soff = dt_find_string(RELOC("linux,phandle"));
-       if (soff == 0)
-               prom_printf("WARNING: Can't find string index for"
-                           " <linux-phandle> node %s\n", path);
-       else {
-               dt_push_token(OF_DT_PROP, mem_start, mem_end);
-               dt_push_token(4, mem_start, mem_end);
-               dt_push_token(soff, mem_start, mem_end);
-               valp = make_room(mem_start, mem_end, 4, 4);
-               *(u32 *)valp = node;
-       }
-
-       /* do all our children */
-       child = call_prom("child", 1, 1, node);
-       while (child != 0) {
-               scan_dt_build_struct(child, mem_start, mem_end);
-               child = call_prom("peer", 1, 1, child);
-       }
-
-       dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
-}
-
-static void __init flatten_device_tree(void)
-{
-       phandle root;
-       unsigned long offset = reloc_offset();
-       unsigned long mem_start, mem_end, room;
-       struct boot_param_header *hdr;
-       struct prom_t *_prom = PTRRELOC(&prom);
-       char *namep;
-       u64 *rsvmap;
-
-       /*
-        * Check how much room we have between alloc top & bottom (+/- a
-        * few pages), crop to 4Mb, as this is our "chuck" size
-        */
-       room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
-       if (room > DEVTREE_CHUNK_SIZE)
-               room = DEVTREE_CHUNK_SIZE;
-       prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
-
-       /* Now try to claim that */
-       mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
-       if (mem_start == 0)
-               prom_panic("Can't allocate initial device-tree chunk\n");
-       mem_end = RELOC(alloc_top);
-
-       /* Get root of tree */
-       root = call_prom("peer", 1, 1, (phandle)0);
-       if (root == (phandle)0)
-               prom_panic ("couldn't get device tree root\n");
-
-       /* Build header and make room for mem rsv map */ 
-       mem_start = _ALIGN(mem_start, 4);
-       hdr = make_room(&mem_start, &mem_end,
-                       sizeof(struct boot_param_header), 4);
-       RELOC(dt_header_start) = (unsigned long)hdr;
-       rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
-
-       /* Start of strings */
-       mem_start = PAGE_ALIGN(mem_start);
-       RELOC(dt_string_start) = mem_start;
-       mem_start += 4; /* hole */
-
-       /* Add "linux,phandle" in there, we'll need it */
-       namep = make_room(&mem_start, &mem_end, 16, 1);
-       strcpy(namep, RELOC("linux,phandle"));
-       mem_start = (unsigned long)namep + strlen(namep) + 1;
-
-       /* Build string array */
-       prom_printf("Building dt strings...\n"); 
-       scan_dt_build_strings(root, &mem_start, &mem_end);
-       RELOC(dt_string_end) = mem_start;
-
-       /* Build structure */
-       mem_start = PAGE_ALIGN(mem_start);
-       RELOC(dt_struct_start) = mem_start;
-       prom_printf("Building dt structure...\n"); 
-       scan_dt_build_struct(root, &mem_start, &mem_end);
-       dt_push_token(OF_DT_END, &mem_start, &mem_end);
-       RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
-
-       /* Finish header */
-       hdr->boot_cpuid_phys = _prom->cpu;
-       hdr->magic = OF_DT_HEADER;
-       hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
-       hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
-       hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
-       hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
-       hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
-       hdr->version = OF_DT_VERSION;
-       /* Version 16 is not backward compatible */
-       hdr->last_comp_version = 0x10;
-
-       /* Reserve the whole thing and copy the reserve map in, we
-        * also bump mem_reserve_cnt to cause further reservations to
-        * fail since it's too late.
-        */
-       reserve_mem(RELOC(dt_header_start), hdr->totalsize);
-       memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
-
-#ifdef DEBUG_PROM
-       {
-               int i;
-               prom_printf("reserved memory map:\n");
-               for (i = 0; i < RELOC(mem_reserve_cnt); i++)
-                       prom_printf("  %x - %x\n", RELOC(mem_reserve_map)[i].base,
-                                   RELOC(mem_reserve_map)[i].size);
-       }
-#endif
-       RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
-
-       prom_printf("Device tree strings 0x%x -> 0x%x\n",
-                   RELOC(dt_string_start), RELOC(dt_string_end)); 
-       prom_printf("Device tree struct  0x%x -> 0x%x\n",
-                   RELOC(dt_struct_start), RELOC(dt_struct_end));
-
-}
-
-
-static void __init fixup_device_tree(void)
-{
-       unsigned long offset = reloc_offset();
-       phandle u3, i2c, mpic;
-       u32 u3_rev;
-       u32 interrupts[2];
-       u32 parent;
-
-       /* Some G5s have a missing interrupt definition, fix it up here */
-       u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
-       if (!PHANDLE_VALID(u3))
-               return;
-       i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
-       if (!PHANDLE_VALID(i2c))
-               return;
-       mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
-       if (!PHANDLE_VALID(mpic))
-               return;
-
-       /* check if proper rev of u3 */
-       if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
-           == PROM_ERROR)
-               return;
-       if (u3_rev < 0x35 || u3_rev > 0x39)
-               return;
-       /* does it need fixup ? */
-       if (prom_getproplen(i2c, "interrupts") > 0)
-               return;
-
-       prom_printf("fixing up bogus interrupts for u3 i2c...\n");
-
-       /* interrupt on this revision of u3 is number 0 and level */
-       interrupts[0] = 0;
-       interrupts[1] = 1;
-       prom_setprop(i2c, "interrupts", &interrupts, sizeof(interrupts));
-       parent = (u32)mpic;
-       prom_setprop(i2c, "interrupt-parent", &parent, sizeof(parent));
-}
-
-
-static void __init prom_find_boot_cpu(void)
-{
-       unsigned long offset = reloc_offset();
-               struct prom_t *_prom = PTRRELOC(&prom);
-       u32 getprop_rval;
-       ihandle prom_cpu;
-       phandle cpu_pkg;
-
-       if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
-               prom_panic("cannot find boot cpu");
-
-       cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
-
-       prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
-       _prom->cpu = getprop_rval;
-
-       prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
-}
-
-static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
-{
-#ifdef CONFIG_BLK_DEV_INITRD
-       unsigned long offset = reloc_offset();
-               struct prom_t *_prom = PTRRELOC(&prom);
-
-       if ( r3 && r4 && r4 != 0xdeadbeef) {
-               u64 val;
-
-               RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3;
-               RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
-
-               val = (u64)RELOC(prom_initrd_start);
-               prom_setprop(_prom->chosen, "linux,initrd-start", &val, sizeof(val));
-               val = (u64)RELOC(prom_initrd_end);
-               prom_setprop(_prom->chosen, "linux,initrd-end", &val, sizeof(val));
-
-               reserve_mem(RELOC(prom_initrd_start),
-                           RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
-
-               prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
-               prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
-       }
-#endif /* CONFIG_BLK_DEV_INITRD */
-}
-
-/*
- * We enter here early on, when the Open Firmware prom is still
- * handling exceptions and the MMU hash table for us.
- */
-
-unsigned long __init prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
-                              unsigned long r6, unsigned long r7)
-{      
-       unsigned long offset = reloc_offset();
-               struct prom_t *_prom = PTRRELOC(&prom);
-       unsigned long phys = KERNELBASE - offset;
-       u32 getprop_rval;
-       
-       /*
-        * First zero the BSS
-        */
-       memset(PTRRELOC(&__bss_start), 0, __bss_stop - __bss_start);
-
-       /*
-        * Init interface to Open Firmware, get some node references,
-        * like /chosen
-        */
-       prom_init_client_services(pp);
-
-       /*
-        * Init prom stdout device
-        */
-       prom_init_stdout();
-       prom_debug("klimit=0x%x\n", RELOC(klimit));
-       prom_debug("offset=0x%x\n", offset);
-
-       /*
-        * Check for an initrd
-        */
-       prom_check_initrd(r3, r4);
-
-       /*
-        * Get default machine type. At this point, we do not differenciate
-        * between pSeries SMP and pSeries LPAR
-        */
-       RELOC(of_platform) = prom_find_machine_type();
-       getprop_rval = RELOC(of_platform);
-       prom_setprop(_prom->chosen, "linux,platform",
-                    &getprop_rval, sizeof(getprop_rval));
-
-       /*
-        * On pSeries, inform the firmware about our capabilities
-        */
-       if (RELOC(of_platform) == PLATFORM_PSERIES ||
-           RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
-               prom_send_capabilities();
-
-       /*
-        * On pSeries and Cell, copy the CPU hold code
-        */
-               if (RELOC(of_platform) & (PLATFORM_PSERIES | PLATFORM_CELL))
-                       copy_and_flush(0, KERNELBASE - offset, 0x100, 0);
-
-       /*
-        * Get memory cells format
-        */
-       getprop_rval = 1;
-       prom_getprop(_prom->root, "#size-cells",
-                    &getprop_rval, sizeof(getprop_rval));
-       _prom->root_size_cells = getprop_rval;
-       getprop_rval = 2;
-       prom_getprop(_prom->root, "#address-cells",
-                    &getprop_rval, sizeof(getprop_rval));
-       _prom->root_addr_cells = getprop_rval;
-
-       /*
-        * Do early parsing of command line
-        */
-       early_cmdline_parse();
-
-       /*
-        * Initialize memory management within prom_init
-        */
-       prom_init_mem();
-
-       /*
-        * Determine which cpu is actually running right _now_
-        */
-       prom_find_boot_cpu();
-
-       /* 
-        * Initialize display devices
-        */
-       prom_check_displays();
-
-       /*
-        * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
-        * that uses the allocator, we need to make sure we get the top of memory
-        * available for us here...
-        */
-       if (RELOC(of_platform) == PLATFORM_PSERIES)
-               prom_initialize_tce_table();
-
-       /*
-        * On non-powermacs, try to instantiate RTAS and puts all CPUs
-        * in spin-loops. PowerMacs don't have a working RTAS and use
-        * a different way to spin CPUs
-        */
-       if (RELOC(of_platform) != PLATFORM_POWERMAC) {
-               prom_instantiate_rtas();
-               prom_hold_cpus();
-       }
-
-       /*
-        * Fill in some infos for use by the kernel later on
-        */
-       if (RELOC(ppc64_iommu_off))
-               prom_setprop(_prom->chosen, "linux,iommu-off", NULL, 0);
-
-       if (RELOC(iommu_force_on))
-               prom_setprop(_prom->chosen, "linux,iommu-force-on", NULL, 0);
-
-       if (RELOC(prom_memory_limit))
-               prom_setprop(_prom->chosen, "linux,memory-limit",
-                       PTRRELOC(&prom_memory_limit), sizeof(RELOC(prom_memory_limit)));
-
-       if (RELOC(prom_tce_alloc_start)) {
-               prom_setprop(_prom->chosen, "linux,tce-alloc-start",
-                       PTRRELOC(&prom_tce_alloc_start), sizeof(RELOC(prom_tce_alloc_start)));
-               prom_setprop(_prom->chosen, "linux,tce-alloc-end",
-                       PTRRELOC(&prom_tce_alloc_end), sizeof(RELOC(prom_tce_alloc_end)));
-       }
-
-       /*
-        * Fixup any known bugs in the device-tree
-        */
-       fixup_device_tree();
-
-       /*
-        * Now finally create the flattened device-tree
-        */
-               prom_printf("copying OF device tree ...\n");
-               flatten_device_tree();
-
-       /* in case stdin is USB and still active on IBM machines... */
-       prom_close_stdin();
-
-       /*
-        * Call OF "quiesce" method to shut down pending DMA's from
-        * devices etc...
-        */
-       prom_printf("Calling quiesce ...\n");
-       call_prom("quiesce", 0, 0);
-
-       /*
-        * And finally, call the kernel passing it the flattened device
-        * tree and NULL as r5, thus triggering the new entry point which
-        * is common to us and kexec
-        */
-       prom_printf("returning from prom_init\n");
-       prom_debug("->dt_header_start=0x%x\n", RELOC(dt_header_start));
-       prom_debug("->phys=0x%x\n", phys);
-
-       __start(RELOC(dt_header_start), phys, 0);
-
-       return 0;
-}
-
diff --git a/arch/ppc64/kernel/rtc.c b/arch/ppc64/kernel/rtc.c
deleted file mode 100644 (file)
index 79e7ed2..0000000
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- *     Real Time Clock interface for PPC64.
- *
- *     Based on rtc.c by Paul Gortmaker
- *
- *     This driver allows use of the real time clock
- *     from user space. It exports the /dev/rtc
- *     interface supporting various ioctl() and also the
- *     /proc/driver/rtc pseudo-file for status information.
- *
- *     Interface does not support RTC interrupts nor an alarm.
- *
- *     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.
- *
- *      1.0    Mike Corrigan:    IBM iSeries rtc support
- *      1.1    Dave Engebretsen: IBM pSeries rtc support
- */
-
-#define RTC_VERSION            "1.1"
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/miscdevice.h>
-#include <linux/ioport.h>
-#include <linux/fcntl.h>
-#include <linux/mc146818rtc.h>
-#include <linux/init.h>
-#include <linux/poll.h>
-#include <linux/proc_fs.h>
-#include <linux/spinlock.h>
-#include <linux/bcd.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/time.h>
-#include <asm/rtas.h>
-
-#include <asm/machdep.h>
-
-/*
- *     We sponge a minor off of the misc major. No need slurping
- *     up another valuable major dev number for this. If you add
- *     an ioctl, make sure you don't conflict with SPARC's RTC
- *     ioctls.
- */
-
-static ssize_t rtc_read(struct file *file, char __user *buf,
-                       size_t count, loff_t *ppos);
-
-static int rtc_ioctl(struct inode *inode, struct file *file,
-                    unsigned int cmd, unsigned long arg);
-
-static int rtc_read_proc(char *page, char **start, off_t off,
-                         int count, int *eof, void *data);
-
-/*
- *     If this driver ever becomes modularised, it will be really nice
- *     to make the epoch retain its value across module reload...
- */
-
-static unsigned long epoch = 1900;     /* year corresponding to 0x00   */
-
-static const unsigned char days_in_mo[] = 
-{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-
-/*
- *     Now all the various file operations that we export.
- */
-
-static ssize_t rtc_read(struct file *file, char __user *buf,
-                       size_t count, loff_t *ppos)
-{
-       return -EIO;
-}
-
-static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-                    unsigned long arg)
-{
-       struct rtc_time wtime; 
-
-       switch (cmd) {
-       case RTC_RD_TIME:       /* Read the time/date from RTC  */
-       {
-               memset(&wtime, 0, sizeof(struct rtc_time));
-               ppc_md.get_rtc_time(&wtime);
-               break;
-       }
-       case RTC_SET_TIME:      /* Set the RTC */
-       {
-               struct rtc_time rtc_tm;
-               unsigned char mon, day, hrs, min, sec, leap_yr;
-               unsigned int yrs;
-
-               if (!capable(CAP_SYS_TIME))
-                       return -EACCES;
-
-               if (copy_from_user(&rtc_tm, (struct rtc_time __user *)arg,
-                                  sizeof(struct rtc_time)))
-                       return -EFAULT;
-
-               yrs = rtc_tm.tm_year;
-               mon = rtc_tm.tm_mon + 1;   /* tm_mon starts at zero */
-               day = rtc_tm.tm_mday;
-               hrs = rtc_tm.tm_hour;
-               min = rtc_tm.tm_min;
-               sec = rtc_tm.tm_sec;
-
-               if (yrs < 70)
-                       return -EINVAL;
-
-               leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
-
-               if ((mon > 12) || (day == 0))
-                       return -EINVAL;
-
-               if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
-                       return -EINVAL;
-                       
-               if ((hrs >= 24) || (min >= 60) || (sec >= 60))
-                       return -EINVAL;
-
-               if ( yrs > 169 )
-                       return -EINVAL;
-
-               ppc_md.set_rtc_time(&rtc_tm);
-               
-               return 0;
-       }
-       case RTC_EPOCH_READ:    /* Read the epoch.      */
-       {
-               return put_user (epoch, (unsigned long __user *)arg);
-       }
-       case RTC_EPOCH_SET:     /* Set the epoch.       */
-       {
-               /* 
-                * There were no RTC clocks before 1900.
-                */
-               if (arg < 1900)
-                       return -EINVAL;
-
-               if (!capable(CAP_SYS_TIME))
-                       return -EACCES;
-
-               epoch = arg;
-               return 0;
-       }
-       default:
-               return -EINVAL;
-       }
-       return copy_to_user((void __user *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
-}
-
-static int rtc_open(struct inode *inode, struct file *file)
-{
-       nonseekable_open(inode, file);
-       return 0;
-}
-
-static int rtc_release(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-/*
- *     The various file operations we support.
- */
-static struct file_operations rtc_fops = {
-       .owner =        THIS_MODULE,
-       .llseek =       no_llseek,
-       .read =         rtc_read,
-       .ioctl =        rtc_ioctl,
-       .open =         rtc_open,
-       .release =      rtc_release,
-};
-
-static struct miscdevice rtc_dev = {
-       .minor =        RTC_MINOR,
-       .name =         "rtc",
-       .fops =         &rtc_fops
-};
-
-static int __init rtc_init(void)
-{
-       int retval;
-
-       retval = misc_register(&rtc_dev);
-       if(retval < 0)
-               return retval;
-
-#ifdef CONFIG_PROC_FS
-       if (create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL)
-                       == NULL) {
-               misc_deregister(&rtc_dev);
-               return -ENOMEM;
-       }
-#endif
-
-       printk(KERN_INFO "i/pSeries Real Time Clock Driver v" RTC_VERSION "\n");
-
-       return 0;
-}
-
-static void __exit rtc_exit (void)
-{
-       remove_proc_entry ("driver/rtc", NULL);
-       misc_deregister(&rtc_dev);
-}
-
-module_init(rtc_init);
-module_exit(rtc_exit);
-
-/*
- *     Info exported via "/proc/driver/rtc".
- */
-
-static int rtc_proc_output (char *buf)
-{
-       
-       char *p;
-       struct rtc_time tm;
-       
-       p = buf;
-
-       ppc_md.get_rtc_time(&tm);
-
-       /*
-        * There is no way to tell if the luser has the RTC set for local
-        * time or for Universal Standard Time (GMT). Probably local though.
-        */
-       p += sprintf(p,
-                    "rtc_time\t: %02d:%02d:%02d\n"
-                    "rtc_date\t: %04d-%02d-%02d\n"
-                    "rtc_epoch\t: %04lu\n",
-                    tm.tm_hour, tm.tm_min, tm.tm_sec,
-                    tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch);
-
-       p += sprintf(p,
-                    "DST_enable\t: no\n"
-                    "BCD\t\t: yes\n"
-                    "24hr\t\t: yes\n" );
-
-       return  p - buf;
-}
-
-static int rtc_read_proc(char *page, char **start, off_t off,
-                         int count, int *eof, void *data)
-{
-        int len = rtc_proc_output (page);
-        if (len <= off+count) *eof = 1;
-        *start = page + off;
-        len -= off;
-        if (len>count) len = count;
-        if (len<0) len = 0;
-        return len;
-}
-
-#ifdef CONFIG_PPC_RTAS
-#define MAX_RTC_WAIT 5000      /* 5 sec */
-#define RTAS_CLOCK_BUSY (-2)
-unsigned long rtas_get_boot_time(void)
-{
-       int ret[8];
-       int error, wait_time;
-       unsigned long max_wait_tb;
-
-       max_wait_tb = __get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
-       do {
-               error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
-               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
-                       wait_time = rtas_extended_busy_delay_time(error);
-                       /* This is boot time so we spin. */
-                       udelay(wait_time*1000);
-                       error = RTAS_CLOCK_BUSY;
-               }
-       } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb));
-
-       if (error != 0 && printk_ratelimit()) {
-               printk(KERN_WARNING "error: reading the clock failed (%d)\n",
-                       error);
-               return 0;
-       }
-
-       return mktime(ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]);
-}
-
-/* NOTE: get_rtc_time will get an error if executed in interrupt context
- * and if a delay is needed to read the clock.  In this case we just
- * silently return without updating rtc_tm.
- */
-void rtas_get_rtc_time(struct rtc_time *rtc_tm)
-{
-        int ret[8];
-       int error, wait_time;
-       unsigned long max_wait_tb;
-
-       max_wait_tb = __get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
-       do {
-               error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret);
-               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
-                       if (in_interrupt() && printk_ratelimit()) {
-                               printk(KERN_WARNING "error: reading clock would delay interrupt\n");
-                               return; /* delay not allowed */
-                       }
-                       wait_time = rtas_extended_busy_delay_time(error);
-                       msleep_interruptible(wait_time);
-                       error = RTAS_CLOCK_BUSY;
-               }
-       } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb));
-
-        if (error != 0 && printk_ratelimit()) {
-                printk(KERN_WARNING "error: reading the clock failed (%d)\n",
-                      error);
-               return;
-        }
-
-       rtc_tm->tm_sec = ret[5];
-       rtc_tm->tm_min = ret[4];
-       rtc_tm->tm_hour = ret[3];
-       rtc_tm->tm_mday = ret[2];
-       rtc_tm->tm_mon = ret[1] - 1;
-       rtc_tm->tm_year = ret[0] - 1900;
-}
-
-int rtas_set_rtc_time(struct rtc_time *tm)
-{
-       int error, wait_time;
-       unsigned long max_wait_tb;
-
-       max_wait_tb = __get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
-       do {
-               error = rtas_call(rtas_token("set-time-of-day"), 7, 1, NULL,
-                                 tm->tm_year + 1900, tm->tm_mon + 1, 
-                                 tm->tm_mday, tm->tm_hour, tm->tm_min, 
-                                 tm->tm_sec, 0);
-               if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) {
-                       if (in_interrupt())
-                               return 1;       /* probably decrementer */
-                       wait_time = rtas_extended_busy_delay_time(error);
-                       msleep_interruptible(wait_time);
-                       error = RTAS_CLOCK_BUSY;
-               }
-       } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb));
-
-        if (error != 0 && printk_ratelimit())
-                printk(KERN_WARNING "error: setting the clock failed (%d)\n",
-                      error); 
-
-        return 0;
-}
-#endif
diff --git a/arch/ppc64/kernel/semaphore.c b/arch/ppc64/kernel/semaphore.c
deleted file mode 100644 (file)
index a1c1db5..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 
- *
- * PowerPC-specific semaphore code.
- *
- * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
- *
- * 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.
- *
- * April 2001 - Reworked by Paul Mackerras <paulus@samba.org>
- * to eliminate the SMP races in the old version between the updates
- * of `count' and `waking'.  Now we use negative `count' values to
- * indicate that some process(es) are waiting for the semaphore.
- */
-
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include <asm/atomic.h>
-#include <asm/semaphore.h>
-#include <asm/errno.h>
-
-/*
- * Atomically update sem->count.
- * This does the equivalent of the following:
- *
- *     old_count = sem->count;
- *     tmp = MAX(old_count, 0) + incr;
- *     sem->count = tmp;
- *     return old_count;
- */
-static inline int __sem_update_count(struct semaphore *sem, int incr)
-{
-       int old_count, tmp;
-
-       __asm__ __volatile__("\n"
-"1:    lwarx   %0,0,%3\n"
-"      srawi   %1,%0,31\n"
-"      andc    %1,%0,%1\n"
-"      add     %1,%1,%4\n"
-"      stwcx.  %1,0,%3\n"
-"      bne     1b"
-       : "=&r" (old_count), "=&r" (tmp), "=m" (sem->count)
-       : "r" (&sem->count), "r" (incr), "m" (sem->count)
-       : "cc");
-
-       return old_count;
-}
-
-void __up(struct semaphore *sem)
-{
-       /*
-        * Note that we incremented count in up() before we came here,
-        * but that was ineffective since the result was <= 0, and
-        * any negative value of count is equivalent to 0.
-        * This ends up setting count to 1, unless count is now > 0
-        * (i.e. because some other cpu has called up() in the meantime),
-        * in which case we just increment count.
-        */
-       __sem_update_count(sem, 1);
-       wake_up(&sem->wait);
-}
-EXPORT_SYMBOL(__up);
-
-/*
- * Note that when we come in to __down or __down_interruptible,
- * we have already decremented count, but that decrement was
- * ineffective since the result was < 0, and any negative value
- * of count is equivalent to 0.
- * Thus it is only when we decrement count from some value > 0
- * that we have actually got the semaphore.
- */
-void __sched __down(struct semaphore *sem)
-{
-       struct task_struct *tsk = current;
-       DECLARE_WAITQUEUE(wait, tsk);
-
-       __set_task_state(tsk, TASK_UNINTERRUPTIBLE);
-       add_wait_queue_exclusive(&sem->wait, &wait);
-
-       /*
-        * Try to get the semaphore.  If the count is > 0, then we've
-        * got the semaphore; we decrement count and exit the loop.
-        * If the count is 0 or negative, we set it to -1, indicating
-        * that we are asleep, and then sleep.
-        */
-       while (__sem_update_count(sem, -1) <= 0) {
-               schedule();
-               set_task_state(tsk, TASK_UNINTERRUPTIBLE);
-       }
-       remove_wait_queue(&sem->wait, &wait);
-       __set_task_state(tsk, TASK_RUNNING);
-
-       /*
-        * If there are any more sleepers, wake one of them up so
-        * that it can either get the semaphore, or set count to -1
-        * indicating that there are still processes sleeping.
-        */
-       wake_up(&sem->wait);
-}
-EXPORT_SYMBOL(__down);
-
-int __sched __down_interruptible(struct semaphore * sem)
-{
-       int retval = 0;
-       struct task_struct *tsk = current;
-       DECLARE_WAITQUEUE(wait, tsk);
-
-       __set_task_state(tsk, TASK_INTERRUPTIBLE);
-       add_wait_queue_exclusive(&sem->wait, &wait);
-
-       while (__sem_update_count(sem, -1) <= 0) {
-               if (signal_pending(current)) {
-                       /*
-                        * A signal is pending - give up trying.
-                        * Set sem->count to 0 if it is negative,
-                        * since we are no longer sleeping.
-                        */
-                       __sem_update_count(sem, 0);
-                       retval = -EINTR;
-                       break;
-               }
-               schedule();
-               set_task_state(tsk, TASK_INTERRUPTIBLE);
-       }
-       remove_wait_queue(&sem->wait, &wait);
-       __set_task_state(tsk, TASK_RUNNING);
-
-       wake_up(&sem->wait);
-       return retval;
-}
-EXPORT_SYMBOL(__down_interruptible);
diff --git a/arch/ppc64/kernel/vdso32/gettimeofday.S b/arch/ppc64/kernel/vdso32/gettimeofday.S
deleted file mode 100644 (file)
index e243c1d..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Userland implementation of gettimeofday() for 32 bits processes in a
- * ppc64 kernel for use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
- *
- * 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/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-#include <asm/unistd.h>
-
-       .text
-/*
- * Exact prototype of gettimeofday
- *
- * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
- *
- */
-V_FUNCTION_BEGIN(__kernel_gettimeofday)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r10,r3                  /* r10 saves tv */
-       mr      r11,r4                  /* r11 saves tz */
-       bl      __get_datapage@local    /* get data page */
-       mr      r9, r3                  /* datapage ptr in r9 */
-       bl      __do_get_xsec@local     /* get xsec from tb & kernel */
-       bne-    2f                      /* out of line -> do syscall */
-
-       /* seconds are xsec >> 20 */
-       rlwinm  r5,r4,12,20,31
-       rlwimi  r5,r3,12,0,19
-       stw     r5,TVAL32_TV_SEC(r10)
-
-       /* get remaining xsec and convert to usec. we scale
-        * up remaining xsec by 12 bits and get the top 32 bits
-        * of the multiplication
-        */
-       rlwinm  r5,r4,12,0,19
-       lis     r6,1000000@h
-       ori     r6,r6,1000000@l
-       mulhwu  r5,r5,r6
-       stw     r5,TVAL32_TV_USEC(r10)
-
-       cmpli   cr0,r11,0               /* check if tz is NULL */
-       beq     1f
-       lwz     r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
-       lwz     r5,CFG_TZ_DSTTIME(r9)
-       stw     r4,TZONE_TZ_MINWEST(r11)
-       stw     r5,TZONE_TZ_DSTTIME(r11)
-
-1:     mtlr    r12
-       li      r3,0
-       blr
-
-2:     mr      r3,r10
-       mr      r4,r11
-       li      r0,__NR_gettimeofday
-       sc
-       b       1b
-  .cfi_endproc
-V_FUNCTION_END(__kernel_gettimeofday)
-
-/*
- * This is the core of gettimeofday(), it returns the xsec
- * value in r3 & r4 and expects the datapage ptr (non clobbered)
- * in r9. clobbers r0,r4,r5,r6,r7,r8
-*/
-__do_get_xsec:
-  .cfi_startproc
-       /* Check for update count & load values. We use the low
-        * order 32 bits of the update count
-        */
-1:     lwz     r8,(CFG_TB_UPDATE_COUNT+4)(r9)
-       andi.   r0,r8,1                 /* pending update ? loop */
-       bne-    1b
-       xor     r0,r8,r8                /* create dependency */
-       add     r9,r9,r0
-
-       /* Load orig stamp (offset to TB) */
-       lwz     r5,CFG_TB_ORIG_STAMP(r9)
-       lwz     r6,(CFG_TB_ORIG_STAMP+4)(r9)
-
-       /* Get a stable TB value */
-2:     mftbu   r3
-       mftbl   r4
-       mftbu   r0
-       cmpl    cr0,r3,r0
-       bne-    2b
-
-       /* Substract tb orig stamp. If the high part is non-zero, we jump to the
-        * slow path which call the syscall. If it's ok, then we have our 32 bits
-        * tb_ticks value in r7
-        */
-       subfc   r7,r6,r4
-       subfe.  r0,r5,r3
-       bne-    3f
-
-       /* Load scale factor & do multiplication */
-       lwz     r5,CFG_TB_TO_XS(r9)     /* load values */
-       lwz     r6,(CFG_TB_TO_XS+4)(r9)
-       mulhwu  r4,r7,r5
-       mulhwu  r6,r7,r6
-       mullw   r0,r7,r5
-       addc    r6,r6,r0
-
-       /* At this point, we have the scaled xsec value in r4 + XER:CA
-        * we load & add the stamp since epoch
-        */
-       lwz     r5,CFG_STAMP_XSEC(r9)
-       lwz     r6,(CFG_STAMP_XSEC+4)(r9)
-       adde    r4,r4,r6
-       addze   r3,r5
-
-       /* We now have our result in r3,r4. We create a fake dependency
-        * on that result and re-check the counter
-        */
-       xor     r0,r4,r4
-       add     r9,r9,r0
-       lwz     r0,(CFG_TB_UPDATE_COUNT+4)(r9)
-        cmpl    cr0,r8,r0              /* check if updated */
-       bne-    1b
-
-       /* Warning ! The caller expects CR:EQ to be set to indicate a
-        * successful calculation (so it won't fallback to the syscall
-        * method). We have overriden that CR bit in the counter check,
-        * but fortunately, the loop exit condition _is_ CR:EQ set, so
-        * we can exit safely here. If you change this code, be careful
-        * of that side effect.
-        */
-3:     blr
-  .cfi_endproc
diff --git a/arch/ppc64/kernel/vdso64/gettimeofday.S b/arch/ppc64/kernel/vdso64/gettimeofday.S
deleted file mode 100644 (file)
index f6df802..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Userland implementation of gettimeofday() for 64 bits processes in a
- * ppc64 kernel for use in the vDSO
- *
- * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
- *                    IBM Corp.
- *
- * 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/config.h>
-#include <asm/processor.h>
-#include <asm/ppc_asm.h>
-#include <asm/vdso.h>
-#include <asm/asm-offsets.h>
-
-       .text
-/*
- * Exact prototype of gettimeofday
- *
- * int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
- *
- */
-V_FUNCTION_BEGIN(__kernel_gettimeofday)
-  .cfi_startproc
-       mflr    r12
-  .cfi_register lr,r12
-
-       mr      r11,r3                  /* r11 holds tv */
-       mr      r10,r4                  /* r10 holds tz */
-       bl      V_LOCAL_FUNC(__get_datapage)            /* get data page */
-       bl      V_LOCAL_FUNC(__do_get_xsec)             /* get xsec from tb & kernel */
-       lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
-       ori     r7,r7,16960
-       rldicl  r5,r4,44,20             /* r5 = sec = xsec / XSEC_PER_SEC */
-       rldicr  r6,r5,20,43             /* r6 = sec * XSEC_PER_SEC */
-       std     r5,TVAL64_TV_SEC(r11)   /* store sec in tv */
-       subf    r0,r6,r4                /* r0 = xsec = (xsec - r6) */
-       mulld   r0,r0,r7                /* usec = (xsec * USEC_PER_SEC) / XSEC_PER_SEC */
-       rldicl  r0,r0,44,20
-       cmpldi  cr0,r10,0               /* check if tz is NULL */
-       std     r0,TVAL64_TV_USEC(r11)  /* store usec in tv */
-       beq     1f
-       lwz     r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
-       lwz     r5,CFG_TZ_DSTTIME(r3)
-       stw     r4,TZONE_TZ_MINWEST(r10)
-       stw     r5,TZONE_TZ_DSTTIME(r10)
-1:     mtlr    r12
-       li      r3,0                    /* always success */
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__kernel_gettimeofday)
-
-
-/*
- * This is the core of gettimeofday(), it returns the xsec
- * value in r4 and expects the datapage ptr (non clobbered)
- * in r3. clobbers r0,r4,r5,r6,r7,r8
-*/
-V_FUNCTION_BEGIN(__do_get_xsec)
-  .cfi_startproc
-       /* check for update count & load values */
-1:     ld      r7,CFG_TB_UPDATE_COUNT(r3)
-       andi.   r0,r4,1                 /* pending update ? loop */
-       bne-    1b
-       xor     r0,r4,r4                /* create dependency */
-       add     r3,r3,r0
-
-       /* Get TB & offset it */
-       mftb    r8
-       ld      r9,CFG_TB_ORIG_STAMP(r3)
-       subf    r8,r9,r8
-
-       /* Scale result */
-       ld      r5,CFG_TB_TO_XS(r3)
-       mulhdu  r8,r8,r5
-
-       /* Add stamp since epoch */
-       ld      r6,CFG_STAMP_XSEC(r3)
-       add     r4,r6,r8
-
-       xor     r0,r4,r4
-       add     r3,r3,r0
-       ld      r0,CFG_TB_UPDATE_COUNT(r3)
-        cmpld   cr0,r0,r7              /* check if updated */
-       bne-    1b
-       blr
-  .cfi_endproc
-V_FUNCTION_END(__do_get_xsec)
diff --git a/arch/ppc64/kernel/vmlinux.lds.S b/arch/ppc64/kernel/vmlinux.lds.S
deleted file mode 100644 (file)
index 022f220..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#include <asm/page.h>
-#include <asm-generic/vmlinux.lds.h>
-
-OUTPUT_ARCH(powerpc:common64)
-jiffies = jiffies_64;
-SECTIONS
-{
-  /* Sections to be discarded. */
-  /DISCARD/ : {
-       *(.exitcall.exit)
-       }
-
-
-  /* Read-only sections, merged into text segment: */
-  .text : {
-       *(.text .text.*)
-       SCHED_TEXT
-       LOCK_TEXT
-       KPROBES_TEXT
-       *(.fixup)
-       . = ALIGN(PAGE_SIZE);
-       _etext = .;
-       }
-
-  __ex_table : {
-       __start___ex_table = .;
-       *(__ex_table)
-       __stop___ex_table = .;
-       }
-
-  __bug_table : {
-       __start___bug_table = .;
-       *(__bug_table)
-       __stop___bug_table = .;
-       }
-
-  __ftr_fixup : {
-       __start___ftr_fixup = .;
-       *(__ftr_fixup)
-       __stop___ftr_fixup = .;
-       }
-
-  RODATA
-
-
-  /* will be freed after init */
-  . = ALIGN(PAGE_SIZE);
-  __init_begin = .;
-
-  .init.text : {
-       _sinittext = .;
-       *(.init.text)
-       _einittext = .;
-       }
-
-  .init.data : {
-       *(.init.data)
-       }
-
-  . = ALIGN(16);
-  .init.setup : {
-       __setup_start = .;
-       *(.init.setup)
-       __setup_end = .;
-       }
-
-  .initcall.init : {
-       __initcall_start = .;
-       *(.initcall1.init)
-       *(.initcall2.init)
-       *(.initcall3.init)
-       *(.initcall4.init)
-       *(.initcall5.init)
-       *(.initcall6.init)
-       *(.initcall7.init)
-       __initcall_end = .;
-       }
-
-  .con_initcall.init : {
-       __con_initcall_start = .;
-       *(.con_initcall.init)
-       __con_initcall_end = .;
-       }
-
-  SECURITY_INIT
-
-  . = ALIGN(PAGE_SIZE);
-  .init.ramfs : {
-       __initramfs_start = .;
-       *(.init.ramfs)
-       __initramfs_end = .;
-       }
-
-  .data.percpu : {
-       __per_cpu_start = .;
-       *(.data.percpu)
-       __per_cpu_end = .;
-       }
-
-  . = ALIGN(PAGE_SIZE);
-  . = ALIGN(16384);
-  __init_end = .;
-  /* freed after init ends here */
-
-
-  /* Read/write sections */
-  . = ALIGN(PAGE_SIZE);
-  . = ALIGN(16384);
-  _sdata = .;
-  /* The initial task and kernel stack */
-  .data.init_task : {
-       *(.data.init_task)
-       }
-
-  . = ALIGN(PAGE_SIZE);
-  .data.page_aligned : {
-       *(.data.page_aligned)
-       }
-
-  .data.cacheline_aligned : {
-       *(.data.cacheline_aligned)
-       }
-
-  .data : {
-       *(.data .data.rel* .toc1)
-       *(.branch_lt)
-       }
-
-  .opd : {
-       *(.opd)
-       }
-
-  .got : {
-       __toc_start = .;
-       *(.got)
-       *(.toc)
-       . = ALIGN(PAGE_SIZE);
-       _edata = .;
-       }
-
-
-  . = ALIGN(PAGE_SIZE);
-  .bss : {
-       __bss_start = .;
-       *(.bss)
-       __bss_stop = .;
-       }
-
-  . = ALIGN(PAGE_SIZE);
-  _end = . ;
-}
diff --git a/arch/ppc64/xmon/privinst.h b/arch/ppc64/xmon/privinst.h
deleted file mode 100644 (file)
index 02eb40d..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 1996 Paul Mackerras.
- *
- *      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.
- */
-
-#define GETREG(reg)            \
-    static inline unsigned long get_ ## reg (void)     \
-       { unsigned long ret; asm volatile ("mf" #reg " %0" : "=r" (ret) :); return ret; }
-
-#define SETREG(reg)            \
-    static inline void set_ ## reg (unsigned long val) \
-       { asm volatile ("mt" #reg " %0" : : "r" (val)); }
-
-GETREG(msr)
-SETREG(msrd)
-GETREG(cr)
-
-#define GSETSPR(n, name)       \
-    static inline long get_ ## name (void) \
-       { long ret; asm volatile ("mfspr %0," #n : "=r" (ret) : ); return ret; } \
-    static inline void set_ ## name (long val) \
-       { asm volatile ("mtspr " #n ",%0" : : "r" (val)); }
-
-GSETSPR(0, mq)
-GSETSPR(1, xer)
-GSETSPR(4, rtcu)
-GSETSPR(5, rtcl)
-GSETSPR(8, lr)
-GSETSPR(9, ctr)
-GSETSPR(18, dsisr)
-GSETSPR(19, dar)
-GSETSPR(22, dec)
-GSETSPR(25, sdr1)
-GSETSPR(26, srr0)
-GSETSPR(27, srr1)
-GSETSPR(272, sprg0)
-GSETSPR(273, sprg1)
-GSETSPR(274, sprg2)
-GSETSPR(275, sprg3)
-GSETSPR(282, ear)
-GSETSPR(287, pvr)
-GSETSPR(1008, hid0)
-GSETSPR(1009, hid1)
-GSETSPR(1010, iabr)
-GSETSPR(1023, pir)
-
-static inline void store_inst(void *p)
-{
-       asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
-}
-
-static inline void cflush(void *p)
-{
-       asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
-}
-
-static inline void cinval(void *p)
-{
-       asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
-}
index 2e64e8c3e8e54c1aafbe66e34d3d64cf0f96f895..cb3cf0f228221154a2dd5e658b8550733a966866 100644 (file)
@@ -37,17 +37,43 @@ int __atomic_add_return(int i, atomic_t *v)
        spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
        return ret;
 }
+EXPORT_SYMBOL(__atomic_add_return);
 
-void atomic_set(atomic_t *v, int i)
+int atomic_cmpxchg(atomic_t *v, int old, int new)
 {
+       int ret;
        unsigned long flags;
+
        spin_lock_irqsave(ATOMIC_HASH(v), flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
 
-       v->counter = i;
+       spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
+       return ret;
+}
+
+int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
 
+       spin_lock_irqsave(ATOMIC_HASH(v), flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
        spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
+       return ret != u;
 }
 
-EXPORT_SYMBOL(__atomic_add_return);
-EXPORT_SYMBOL(atomic_set);
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+/* Atomic operations are already serializing */
+void atomic_set(atomic_t *v, int i)
+{
+       unsigned long flags;
 
+       spin_lock_irqsave(ATOMIC_HASH(v), flags);
+       v->counter = i;
+       spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
+}
+EXPORT_SYMBOL(atomic_set);
index 94b05e8c906c78ca4701ccb766573f01b2798c75..2e168d16547f93234602de95762346a727b730d8 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include <linux/smp_lock.h>
+#include <linux/string.h>
 #include <linux/bitops.h>
 
 #include <asm/bitext.h>
index e62214354bb52b0313a1ff0cacba58b8f9e2a5f9..196b208665a223cf5624bae71c81e4484494029f 100644 (file)
 #define INCLUDES
 #include "compat_ioctl.c"
 #include <linux/syscalls.h>
-#include <asm/fbio.h>
-
-/* Use this to get at 32-bit user passed pointers. 
- * See sys_sparc32.c for description about it.
- */
-#define A(__x) compat_ptr(__x)
 
 #define CODE
 #include "compat_ioctl.c"
 
-struct  fbcmap32 {
-       int             index;          /* first element (0 origin) */
-       int             count;
-       u32             red;
-       u32             green;
-       u32             blue;
-};
-
-#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
-#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
-
-static int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       struct fbcmap32 __user *argp = (void __user *)arg;
-       struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p));
-       u32 addr;
-       int ret;
-       
-       ret = copy_in_user(p, argp, 2 * sizeof(int));
-       ret |= get_user(addr, &argp->red);
-       ret |= put_user(compat_ptr(addr), &p->red);
-       ret |= get_user(addr, &argp->green);
-       ret |= put_user(compat_ptr(addr), &p->green);
-       ret |= get_user(addr, &argp->blue);
-       ret |= put_user(compat_ptr(addr), &p->blue);
-       if (ret)
-               return -EFAULT;
-       return sys_ioctl(fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (unsigned long)p);
-}
-
-struct fbcursor32 {
-       short set;              /* what to set, choose from the list above */
-       short enable;           /* cursor on/off */
-       struct fbcurpos pos;    /* cursor position */
-       struct fbcurpos hot;    /* cursor hot spot */
-       struct fbcmap32 cmap;   /* color map info */
-       struct fbcurpos size;   /* cursor bit map size */
-       u32     image;          /* cursor image bits */
-       u32     mask;           /* cursor mask bits */
-};
-       
-#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
-#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
-
-static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
-       struct fbcursor32 __user *argp =  (void __user *)arg;
-       compat_uptr_t addr;
-       int ret;
-       
-       ret = copy_in_user(p, argp,
-                             2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
-       ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos));
-       ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int));
-       ret |= get_user(addr, &argp->cmap.red);
-       ret |= put_user(compat_ptr(addr), &p->cmap.red);
-       ret |= get_user(addr, &argp->cmap.green);
-       ret |= put_user(compat_ptr(addr), &p->cmap.green);
-       ret |= get_user(addr, &argp->cmap.blue);
-       ret |= put_user(compat_ptr(addr), &p->cmap.blue);
-       ret |= get_user(addr, &argp->mask);
-       ret |= put_user(compat_ptr(addr), &p->mask);
-       ret |= get_user(addr, &argp->image);
-       ret |= put_user(compat_ptr(addr), &p->image);
-       if (ret)
-               return -EFAULT;
-       return sys_ioctl (fd, FBIOSCURSOR, (unsigned long)p);
-}
-
 #define COMPATIBLE_IOCTL(cmd)          HANDLE_IOCTL((cmd),sys_ioctl)
 #define HANDLE_IOCTL(cmd,handler)      { (cmd), (ioctl_trans_handler_t)(handler), NULL },
 #define IOCTL_TABLE_START \
@@ -103,22 +27,6 @@ IOCTL_TABLE_START
 #include <linux/compat_ioctl.h>
 #define DECLARES
 #include "compat_ioctl.c"
-COMPATIBLE_IOCTL(FBIOGTYPE)
-COMPATIBLE_IOCTL(FBIOSATTR)
-COMPATIBLE_IOCTL(FBIOGATTR)
-COMPATIBLE_IOCTL(FBIOSVIDEO)
-COMPATIBLE_IOCTL(FBIOGVIDEO)
-COMPATIBLE_IOCTL(FBIOGCURSOR32)  /* This is not implemented yet. Later it should be converted... */
-COMPATIBLE_IOCTL(FBIOSCURPOS)
-COMPATIBLE_IOCTL(FBIOGCURPOS)
-COMPATIBLE_IOCTL(FBIOGCURMAX)
-/* Little k */
-/* Little v, the video4linux ioctls */
-/* And these ioctls need translation */
-/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
-HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
-HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap)
-HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor)
 #if 0
 HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl)
 HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl)
index bf1849dd9c49f5192301c9167a13a47490b0f07e..48180531562fbdd4d21559986fb4b81ef4862dc7 100644 (file)
@@ -587,6 +587,8 @@ extern void mmu_info(struct seq_file *);
 unsigned int dcache_parity_tl1_occurred;
 unsigned int icache_parity_tl1_occurred;
 
+static int ncpus_probed;
+
 static int show_cpuinfo(struct seq_file *m, void *__unused)
 {
        seq_printf(m, 
@@ -595,8 +597,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
                   "promlib\t\t: Version 3 Revision %d\n"
                   "prom\t\t: %d.%d.%d\n"
                   "type\t\t: sun4u\n"
-                  "ncpus probed\t: %ld\n"
-                  "ncpus active\t: %ld\n"
+                  "ncpus probed\t: %d\n"
+                  "ncpus active\t: %d\n"
                   "D$ parity tl1\t: %u\n"
                   "I$ parity tl1\t: %u\n"
 #ifndef CONFIG_SMP
@@ -610,8 +612,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
                   prom_prev >> 16,
                   (prom_prev >> 8) & 0xff,
                   prom_prev & 0xff,
-                  (long)num_possible_cpus(),
-                  (long)num_online_cpus(),
+                  ncpus_probed,
+                  num_online_cpus(),
                   dcache_parity_tl1_occurred,
                   icache_parity_tl1_occurred
 #ifndef CONFIG_SMP
@@ -677,6 +679,15 @@ static int __init topology_init(void)
        int i, err;
 
        err = -ENOMEM;
+
+       /* Count the number of physically present processors in
+        * the machine, even on uniprocessor, so that /proc/cpuinfo
+        * output is consistent with 2.4.x
+        */
+       ncpus_probed = 0;
+       while (!cpu_find_by_instance(ncpus_probed, NULL, NULL))
+               ncpus_probed++;
+
        for (i = 0; i < NR_CPUS; i++) {
                if (cpu_possible(i)) {
                        struct cpu *p = kmalloc(sizeof(*p), GFP_KERNEL);
index 797a65493fb848cc836ca4248171e19149f42bc3..6efc03df51c3b1b72d13b850a512178ddf9dd067 100644 (file)
@@ -39,7 +39,6 @@
 #include <asm/starfire.h>
 #include <asm/tlb.h>
 
-extern int linux_num_cpus;
 extern void calibrate_delay(void);
 
 /* Please don't make this stuff initdata!!!  --DaveM */
index 3b5f47c469073df1ca4b0bac35bc06dff2aaaeaf..563301fe5df8bbfb4bfd5680e5489d23b91e0ba4 100644 (file)
@@ -7,7 +7,6 @@ config UML
        bool
        default y
 
-# XXX: does UM have a mmu/swap?
 config MMU
        bool
        default y
@@ -36,12 +35,6 @@ config IRQ_RELEASE_METHOD
        bool
        default y
 
-menu "Host processor type and features"
-
-source "arch/i386/Kconfig.cpu"
-
-endmenu
-
 menu "UML-specific options"
 
 config MODE_TT
@@ -209,7 +202,8 @@ config MAGIC_SYSRQ
 config SMP
        bool "Symmetric multi-processing support (EXPERIMENTAL)"
        default n
-       depends on (MODE_TT && EXPERIMENTAL && !SMP_BROKEN) || (BROKEN && SMP_BROKEN)
+       #SMP_BROKEN is for x86_64.
+       depends on MODE_TT && EXPERIMENTAL && (!SMP_BROKEN || (BROKEN && SMP_BROKEN))
        help
        This option enables UML SMP support.
        It is NOT related to having a real SMP box. Not directly, at least.
index 5d92cacd56c6a71cddf0c88026d7788fedbd3e39..c71b39a677aa49b41bab93ffaf7374800948abb0 100644 (file)
@@ -1,3 +1,9 @@
+menu "Host processor type and features"
+
+source "arch/i386/Kconfig.cpu"
+
+endmenu
+
 config UML_X86
        bool
        default y
@@ -42,7 +48,3 @@ config ARCH_HAS_SC_SIGNALS
 config ARCH_REUSE_HOST_VSYSCALL_AREA
        bool
        default y
-
-config X86_CMPXCHG
-       bool
-       default y
index 1f7dcb064aee65602eac0d5fbb18cc77aad6754e..7a0e04e34bf96f2cb4a89a6be34cfbe8f1e6cf90 100644 (file)
@@ -35,4 +35,3 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2)
 
 CFLAGS += $(cflags-y)
 USER_CFLAGS += $(cflags-y)
-
index 16e7dc89f61d78e2508b71a3c6cb2bb046c09785..5b58fad45290fc8ad26c50034979224389e16cda 100644 (file)
@@ -89,8 +89,7 @@ static int not_configged_write(int fd, const char *buf, int len, void *data)
        return(-EIO);
 }
 
-static int not_configged_console_write(int fd, const char *buf, int len,
-                                      void *data)
+static int not_configged_console_write(int fd, const char *buf, int len)
 {
        my_puts("Using a channel type which is configured out of "
               "UML\n");
@@ -299,7 +298,7 @@ int console_write_chan(struct list_head *chans, const char *buf, int len)
                chan = list_entry(ele, struct chan, list);
                if(!chan->output || (chan->ops->console_write == NULL))
                        continue;
-               n = chan->ops->console_write(chan->fd, buf, len, chan->data);
+               n = chan->ops->console_write(chan->fd, buf, len);
                if(chan->primary) ret = n;
        }
        return(ret);
index 1c55d580248993c9ef1dd7249ccf8bb8e548c745..5d50d4a44abf4879220e045b9eaecf0d48d8f9d7 100644 (file)
@@ -20,7 +20,7 @@
 #include "choose-mode.h"
 #include "mode.h"
 
-int generic_console_write(int fd, const char *buf, int n, void *unused)
+int generic_console_write(int fd, const char *buf, int n)
 {
        struct termios save, new;
        int err;
index c1b03f7c1daa962195a6e8ee26d09580abfab615..1bb085b2824d19e25e88ce4e931bcfba25f07a76 100644 (file)
@@ -98,7 +98,7 @@ static int connect_to_switch(struct daemon_data *pri)
                printk("daemon_open : control setup request failed, err = %d\n",
                       -n);
                err = -ENOTCONN;
-               goto out;               
+               goto out_free;
        }
 
        n = os_read_file(pri->control, sun, sizeof(*sun));
@@ -106,12 +106,14 @@ static int connect_to_switch(struct daemon_data *pri)
                printk("daemon_open : read of data socket failed, err = %d\n",
                       -n);
                err = -ENOTCONN;
-               goto out_close;         
+               goto out_free;
        }
 
        pri->data_addr = sun;
        return(fd);
 
+ out_free:
+       kfree(sun);
  out_close:
        os_close_file(fd);
  out:
index f0b888f66e0561ad3f73af964428f0d42c96e674..3296e86a03a5cd3a197007c1593e127fee3c1d7c 100644 (file)
@@ -76,13 +76,6 @@ static void fd_close(int fd, void *d)
        }
 }
 
-static int fd_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct fd_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
 struct chan_ops fd_ops = {
        .type           = "fd",
        .init           = fd_init,
@@ -90,7 +83,7 @@ struct chan_ops fd_ops = {
        .close          = fd_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = fd_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = generic_free,
        .winch          = 1,
index 5db136e2651cc20a7883ad6ce3048423bbfaa8dd..afe85bfa66e0872eabc55cd1e0b25dace52900bc 100644 (file)
@@ -54,7 +54,7 @@ static int mcast_open(void *data)
        struct mcast_data *pri = data;
        struct sockaddr_in *sin = pri->mcast_addr;
        struct ip_mreq mreq;
-       int fd, yes = 1, err = 0;
+       int fd, yes = 1, err = -EINVAL;
 
 
        if ((sin->sin_addr.s_addr == 0) || (sin->sin_port == 0))
@@ -63,40 +63,40 @@ static int mcast_open(void *data)
        fd = socket(AF_INET, SOCK_DGRAM, 0);
 
        if (fd < 0){
+               err = -errno;
                printk("mcast_open : data socket failed, errno = %d\n", 
                       errno);
-               err = -errno;
                goto out;
        }
 
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
+               err = -errno;
                printk("mcast_open: SO_REUSEADDR failed, errno = %d\n",
                        errno);
-               err = -errno;
                goto out_close;
        }
 
        /* set ttl according to config */
        if (setsockopt(fd, SOL_IP, IP_MULTICAST_TTL, &pri->ttl,
                       sizeof(pri->ttl)) < 0) {
+               err = -errno;
                printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n",
                        errno);
-               err = -errno;
                goto out_close;
        }
 
        /* set LOOP, so data does get fed back to local sockets */
        if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) {
+               err = -errno;
                printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n",
                        errno);
-               err = -errno;
                goto out_close;
        }
 
        /* bind socket to mcast address */
        if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) {
-               printk("mcast_open : data bind failed, errno = %d\n", errno);
                err = -errno;
+               printk("mcast_open : data bind failed, errno = %d\n", errno);
                goto out_close;
        }               
        
@@ -105,22 +105,22 @@ static int mcast_open(void *data)
        mreq.imr_interface.s_addr = 0;
        if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, 
                       &mreq, sizeof(mreq)) < 0) {
+               err = -errno;
                printk("mcast_open: IP_ADD_MEMBERSHIP failed, error = %d\n",
                        errno);
                printk("There appears not to be a multicast-capable network "
                       "interface on the host.\n");
                printk("eth0 should be configured in order to use the "
                       "multicast transport.\n");
-               err = -errno;
-                goto out_close;
+               goto out_close;
        }
 
        return fd;
 
  out_close:
-        os_close_file(fd);
+       os_close_file(fd);
  out:
-        return err;
+       return err;
 }
 
 static void mcast_close(int fd, void *data)
index 4cf31a2ae19c3d7a50a49d0da5f4201f11e449e1..84c73a300acb9ffffe0e2f48748df6ece06831c2 100644 (file)
@@ -268,9 +268,10 @@ void uml_net_user_timer_expire(unsigned long _conn)
 static DEFINE_SPINLOCK(devices_lock);
 static struct list_head devices = LIST_HEAD_INIT(devices);
 
-static struct device_driver uml_net_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver uml_net_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 static int driver_registered;
 
@@ -317,7 +318,7 @@ static int eth_configure(int n, void *init, char *mac,
 
        /* sysfs register */
        if (!driver_registered) {
-               driver_register(&uml_net_driver);
+               platform_driver_register(&uml_net_driver);
                driver_registered = 1;
        }
        device->pdev.id = n;
index ed4a1a6c5d83fa03fb515f69a2fc30340f596301..c43e8bb3250264940af52ea528fe6a378fe41f67 100644 (file)
@@ -100,13 +100,6 @@ static void port_close(int fd, void *d)
        os_close_file(fd);
 }
 
-static int port_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct port_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
 struct chan_ops port_ops = {
        .type           = "port",
        .init           = port_init,
@@ -114,7 +107,7 @@ struct chan_ops port_ops = {
        .close          = port_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = port_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = port_free,
        .winch          = 1,
index 0306a1b215b7d8016f04bd3eca2dba996ee53dfa..1c555c38de4d0184adb129755058b71a1449553f 100644 (file)
@@ -118,13 +118,6 @@ static int pty_open(int input, int output, int primary, void *d,
        return(fd);
 }
 
-static int pty_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct pty_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
 struct chan_ops pty_ops = {
        .type           = "pty",
        .init           = pty_chan_init,
@@ -132,7 +125,7 @@ struct chan_ops pty_ops = {
        .close          = generic_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = pty_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = generic_free,
        .winch          = 0,
@@ -145,7 +138,7 @@ struct chan_ops pts_ops = {
        .close          = generic_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = pty_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = generic_free,
        .winch          = 0,
index 6fbb670ee2741a73d30dfa9eb20e1cad2d78f00a..94c9265a4f2ca54e034f4f79c11bf48ee061bdf2 100644 (file)
@@ -60,13 +60,6 @@ static int tty_open(int input, int output, int primary, void *d,
        return(fd);
 }
 
-static int tty_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct tty_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
 struct chan_ops tty_ops = {
        .type           = "tty",
        .init           = tty_chan_init,
@@ -74,7 +67,7 @@ struct chan_ops tty_ops = {
        .close          = generic_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = tty_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = generic_free,
        .winch          = 0,
index b2c86257b0f83cc0f8f254d286db9bf76e4c5e86..93898917cbe5bb97240b77684e52e608de2ea9cc 100644 (file)
@@ -823,9 +823,10 @@ static int ubd_mc_init(void)
 
 __initcall(ubd_mc_init);
 
-static struct device_driver ubd_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver ubd_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 
 int ubd_init(void)
@@ -850,7 +851,7 @@ int ubd_init(void)
                if (register_blkdev(fake_major, "ubd"))
                        return -1;
        }
-       driver_register(&ubd_driver);
+       platform_driver_register(&ubd_driver);
        for (i = 0; i < MAX_DEV; i++) 
                ubd_add(i);
        return 0;
index b530f1a6540d506a556e38c90dc3afec63f2f7f6..aaa63666104333f487d01521bb6792250cb40a14 100644 (file)
@@ -194,13 +194,6 @@ static void xterm_free(void *d)
        free(d);
 }
 
-static int xterm_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct xterm_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
 struct chan_ops xterm_ops = {
        .type           = "xterm",
        .init           = xterm_init,
@@ -208,7 +201,7 @@ struct chan_ops xterm_ops = {
        .close          = xterm_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = xterm_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = xterm_free,
        .winch          = 1,
index f77d9aa4c164f103995dd83cd0407a226d31a7cd..659bb3cac32f51f3e7f8017bd137270e068cabf6 100644 (file)
@@ -25,7 +25,7 @@ struct chan_ops {
        void (*close)(int, void *);
        int (*read)(int, char *, void *);
        int (*write)(int, const char *, int, void *);
-       int (*console_write)(int, const char *, int, void *);
+       int (*console_write)(int, const char *, int);
        int (*window_size)(int, void *, unsigned short *, unsigned short *);
        void (*free)(void *);
        int winch;
@@ -37,7 +37,7 @@ extern struct chan_ops fd_ops, null_ops, port_ops, pts_ops, pty_ops, tty_ops,
 extern void generic_close(int fd, void *unused);
 extern int generic_read(int fd, char *c_out, void *unused);
 extern int generic_write(int fd, const char *buf, int n, void *unused);
-extern int generic_console_write(int fd, const char *buf, int n, void *state);
+extern int generic_console_write(int fd, const char *buf, int n);
 extern int generic_window_size(int fd, void *unused, unsigned short *rows_out,
                               unsigned short *cols_out);
 extern void generic_free(void *data);
index 84c0868cd5613610c4f874aa280283d2d5f0a35b..f8760a3f43b0f0f6e0402f21089d87e56ba62c29 100644 (file)
 #include "uaccess-skas.h"
 #endif
 
+#define __under_task_size(addr, size) \
+       (((unsigned long) (addr) < TASK_SIZE) && \
+         (((unsigned long) (addr) + (size)) < TASK_SIZE))
+
+#define __access_ok_vsyscall(type, addr, size) \
+        ((type == VERIFY_READ) && \
+         ((unsigned long) (addr) >= FIXADDR_USER_START) && \
+         ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \
+         ((unsigned long) (addr) + (size) >= (unsigned long)(addr)))
+
+#define __addr_range_nowrap(addr, size) \
+       ((unsigned long) (addr) <= ((unsigned long) (addr) + (size)))
+
 #define access_ok(type, addr, size) \
-       CHOOSE_MODE_PROC(access_ok_tt, access_ok_skas, type, addr, size)
+       (__addr_range_nowrap(addr, size) && \
+        (__under_task_size(addr, size) || \
+         __access_ok_vsyscall(type, addr, size) || \
+         segment_eq(get_fs(), KERNEL_DS) || \
+         CHOOSE_MODE_PROC(access_ok_tt, access_ok_skas, type, addr, size)))
 
 static inline int copy_from_user(void *to, const void __user *from, int n)
 {
index 7da0c2def0ef1c6ca8c2034619ad3ba2777a1b55..f611f83ad4ff815397f1746a10ba2e5656c3d9bc 100644 (file)
@@ -9,14 +9,8 @@
 #include "asm/errno.h"
 #include "asm/fixmap.h"
 
-#define access_ok_skas(type, addr, size) \
-       ((segment_eq(get_fs(), KERNEL_DS)) || \
-        (((unsigned long) (addr) < TASK_SIZE) && \
-         ((unsigned long) (addr) + (size) <= TASK_SIZE)) || \
-        ((type == VERIFY_READ ) && \
-         ((unsigned long) (addr) >= FIXADDR_USER_START) && \
-         ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \
-         ((unsigned long) (addr) + (size) >= (unsigned long)(addr))))
+/* No SKAS-specific checking. */
+#define access_ok_skas(type, addr, size) 0
 
 extern int copy_from_user_skas(void *to, const void __user *from, int n);
 extern int copy_to_user_skas(void __user *to, const void *from, int n);
index 75195281081e10252e840ea2bf533e3cd193a27d..a5a47528dec7a68cbab0c9e290461a66eea6af2c 100644 (file)
@@ -143,7 +143,7 @@ int copy_from_user_skas(void *to, const void __user *from, int n)
                return(0);
        }
 
-       return(access_ok_skas(VERIFY_READ, from, n) ?
+       return(access_ok(VERIFY_READ, from, n) ?
               buffer_op((unsigned long) from, n, 0, copy_chunk_from_user, &to):
               n);
 }
@@ -164,7 +164,7 @@ int copy_to_user_skas(void __user *to, const void *from, int n)
                return(0);
        }
 
-       return(access_ok_skas(VERIFY_WRITE, to, n) ?
+       return(access_ok(VERIFY_WRITE, to, n) ?
               buffer_op((unsigned long) to, n, 1, copy_chunk_to_user, &from) :
               n);
 }
@@ -193,7 +193,7 @@ int strncpy_from_user_skas(char *dst, const char __user *src, int count)
                return(strnlen(dst, count));
        }
 
-       if(!access_ok_skas(VERIFY_READ, src, 1))
+       if(!access_ok(VERIFY_READ, src, 1))
                return(-EFAULT);
 
        n = buffer_op((unsigned long) src, count, 0, strncpy_chunk_from_user,
@@ -221,7 +221,7 @@ int clear_user_skas(void __user *mem, int len)
                return(0);
        }
 
-       return(access_ok_skas(VERIFY_WRITE, mem, len) ?
+       return(access_ok(VERIFY_WRITE, mem, len) ?
               buffer_op((unsigned long) mem, len, 1, clear_chunk, NULL) : len);
 }
 
index 95c8f8733bafb516e67d044d6d78a87779a46c98..0d4c10a736077702556fea90e281b82b109ada06 100644 (file)
@@ -95,7 +95,16 @@ survive:
                pte = pte_offset_kernel(pmd, address);
        } while(!pte_present(*pte));
        err = 0;
+       /* The below warning was added in place of
+        *      pte_mkyoung(); if (is_write) pte_mkdirty();
+        * If it's triggered, we'd see normally a hang here (a clean pte is
+        * marked read-only to emulate the dirty bit).
+        * However, the generic code can mark a PTE writable but clean on a
+        * concurrent read fault, triggering this harmlessly. So comment it out.
+        */
+#if 0
        WARN_ON(!pte_young(*pte) || (is_write && !pte_dirty(*pte)));
+#endif
        flush_tlb_page(vma, address);
 out:
        up_read(&mm->mmap_sem);
index dc2ebfa8c54fb621c6d790659417f4f68c010d26..b9bfe9c481c4eadd31601623bbe2e9de89dec1ea 100644 (file)
 extern unsigned long end_vm;
 extern unsigned long uml_physmem;
 
-#define under_task_size(addr, size) \
-       (((unsigned long) (addr) < TASK_SIZE) && \
-         (((unsigned long) (addr) + (size)) < TASK_SIZE))
-
 #define is_stack(addr, size) \
        (((unsigned long) (addr) < STACK_TOP) && \
         ((unsigned long) (addr) >= STACK_TOP - ABOVE_KMEM) && \
         (((unsigned long) (addr) + (size)) <= STACK_TOP))
 
 #define access_ok_tt(type, addr, size) \
-       ((type == VERIFY_READ) || (segment_eq(get_fs(), KERNEL_DS)) || \
-         (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \
-          (under_task_size(addr, size) || is_stack(addr, size))))
+       (is_stack(addr, size))
 
 extern unsigned long get_fault_addr(void);
 
index a72aa632972f4ebc72c66ac09593600f7caefd33..1cb60726567ed43da205922b9b004fcd42be8a7b 100644 (file)
@@ -8,7 +8,7 @@
 
 int copy_from_user_tt(void *to, const void __user *from, int n)
 {
-       if(!access_ok_tt(VERIFY_READ, from, n))
+       if(!access_ok(VERIFY_READ, from, n))
                return(n);
 
        return(__do_copy_from_user(to, from, n, &current->thread.fault_addr,
@@ -17,7 +17,7 @@ int copy_from_user_tt(void *to, const void __user *from, int n)
 
 int copy_to_user_tt(void __user *to, const void *from, int n)
 {
-       if(!access_ok_tt(VERIFY_WRITE, to, n))
+       if(!access_ok(VERIFY_WRITE, to, n))
                return(n);
 
        return(__do_copy_to_user(to, from, n, &current->thread.fault_addr,
@@ -28,7 +28,7 @@ int strncpy_from_user_tt(char *dst, const char __user *src, int count)
 {
        int n;
 
-       if(!access_ok_tt(VERIFY_READ, src, 1))
+       if(!access_ok(VERIFY_READ, src, 1))
                return(-EFAULT);
 
        n = __do_strncpy_from_user(dst, src, count,
@@ -47,7 +47,7 @@ int __clear_user_tt(void __user *mem, int len)
 
 int clear_user_tt(void __user *mem, int len)
 {
-       if(!access_ok_tt(VERIFY_WRITE, mem, len))
+       if(!access_ok(VERIFY_WRITE, mem, len))
                return(len);
 
        return(__do_clear_user(mem, len, &current->thread.fault_addr,
index 89c053b6c2c404d39e7c31ed013ff9410a8aeaeb..310865903234750fc4599d7782f5ac0b3e6000a2 100644 (file)
@@ -23,6 +23,14 @@ config GENERIC_CALIBRATE_DELAY
        bool
        default y
 
+config GENERIC_HARDIRQS
+       bool
+       default y
+
+config GENERIC_IRQ_PROBE
+       bool
+       default y
+
 # Turn off some random 386 crap that can affect device config
 config ISA
        bool
index 9e85969ba9767d714486334c0b31f743470b5cb2..7a151c26f82e2bd7be47a0053deb18bf84f0004d 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/irq.c -- High-level interrupt handling
  *
- *  Copyright (C) 2001,02,03,04  NEC Electronics Corporation
- *  Copyright (C) 2001,02,03,04  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03,04,05  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03,04,05  Miles Bader <miles@gnu.org>
  *  Copyright (C) 1994-2000  Ralf Baechle
  *  Copyright (C) 1992  Linus Torvalds
  *
 #include <asm/system.h>
 
 /*
- * Controller mappings for all interrupt sources:
+ * 'what should we do if we get a hw irq event on an illegal vector'.
+ * each architecture has to answer this themselves, it doesn't deserve
+ * a generic callback i think.
  */
-irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = {
-       [0 ... NR_IRQS-1] = {
-               .handler = &no_irq_type,
-               .lock = SPIN_LOCK_UNLOCKED
-       }
-};
-
-/*
- * Special irq handlers.
- */
-
-irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs)
-{
-       return IRQ_NONE;
-}
-
-/*
- * Generic no controller code
- */
-
-static void enable_none(unsigned int irq) { }
-static unsigned int startup_none(unsigned int irq) { return 0; }
-static void disable_none(unsigned int irq) { }
-static void ack_none(unsigned int irq)
+void ack_bad_irq(unsigned int irq)
 {
-       /*
-        * 'what should we do if we get a hw irq event on an illegal vector'.
-        * each architecture has to answer this themselves, it doesn't deserve
-        * a generic callback i think.
-        */
        printk("received IRQ %d with unknown interrupt type\n", irq);
 }
 
-/* startup is the same as "enable", shutdown is same as "disable" */
-#define shutdown_none  disable_none
-#define end_none       enable_none
-
-struct hw_interrupt_type no_irq_type = {
-       .typename = "none",
-       .startup = startup_none,
-       .shutdown = shutdown_none,
-       .enable = enable_none,
-       .disable = disable_none,
-       .ack = ack_none,
-       .end = end_none
-};
-
 volatile unsigned long irq_err_count, spurious_count;
 
 /*
@@ -84,643 +44,68 @@ volatile unsigned long irq_err_count, spurious_count;
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-       int i = *(loff_t *) v;
-       struct irqaction * action;
-       unsigned long flags;
+       int irq = *(loff_t *) v;
 
-       if (i == 0) {
+       if (irq == 0) {
+               int cpu;
                seq_puts(p, "           ");
-               for (i=0; i < 1 /*smp_num_cpus*/; i++)
-                       seq_printf(p, "CPU%d       ", i);
+               for (cpu=0; cpu < 1 /*smp_num_cpus*/; cpu++)
+                       seq_printf(p, "CPU%d       ", cpu);
                seq_putc(p, '\n');
        }
 
-       if (i < NR_IRQS) {
-               int j, count, num;
-               const char *type_name = irq_desc[i].handler->typename;
-               spin_lock_irqsave(&irq_desc[j].lock, flags);
-               action = irq_desc[i].action;
-               if (!action) 
-                       goto skip;
+       if (irq < NR_IRQS) {
+               unsigned long flags;
+               struct irqaction *action;
 
-               count = 0;
-               num = -1;
-               for (j = 0; j < NR_IRQS; j++)
-                       if (irq_desc[j].handler->typename == type_name) {
-                               if (i == j)
-                                       num = count;
-                               count++;
-                       }
+               spin_lock_irqsave(&irq_desc[irq].lock, flags);
 
-               seq_printf(p, "%3d: ",i);
-               seq_printf(p, "%10u ", kstat_irqs(i));
-               if (count > 1) {
-                       int prec = (num >= 100 ? 3 : num >= 10 ? 2 : 1);
-                       seq_printf(p, " %*s%d", 14 - prec, type_name, num);
-               } else
-                       seq_printf(p, " %14s", type_name);
+               action = irq_desc[irq].action;
+               if (action) {
+                       int j;
+                       int count = 0;
+                       int num = -1;
+                       const char *type_name = irq_desc[irq].handler->typename;
+
+                       for (j = 0; j < NR_IRQS; j++)
+                               if (irq_desc[j].handler->typename == type_name){
+                                       if (irq == j)
+                                               num = count;
+                                       count++;
+                               }
+
+                       seq_printf(p, "%3d: ",irq);
+                       seq_printf(p, "%10u ", kstat_irqs(irq));
+                       if (count > 1) {
+                               int prec = (num >= 100 ? 3 : num >= 10 ? 2 : 1);
+                               seq_printf(p, " %*s%d", 14 - prec,
+                                          type_name, num);
+                       } else
+                               seq_printf(p, " %14s", type_name);
                
-               seq_printf(p, "  %s", action->name);
-               for (action=action->next; action; action = action->next)
-                       seq_printf(p, ", %s", action->name);
-               seq_putc(p, '\n');
-skip:
-               spin_unlock_irqrestore(&irq_desc[j].lock, flags);
-       } else if (i == NR_IRQS)
-               seq_printf(p, "ERR: %10lu\n", irq_err_count);
-       return 0;
-}
-
-/*
- * This should really return information about whether
- * we should do bottom half handling etc. Right now we
- * end up _always_ checking the bottom half, which is a
- * waste of time and is not what some drivers would
- * prefer.
- */
-int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * action)
-{
-       int status = 1; /* Force the "do bottom halves" bit */
-       int ret;
-
-       if (!(action->flags & SA_INTERRUPT))
-               local_irq_enable();
-
-       do {
-               ret = action->handler(irq, action->dev_id, regs);
-               if (ret == IRQ_HANDLED)
-                       status |= action->flags;
-               action = action->next;
-       } while (action);
-       if (status & SA_SAMPLE_RANDOM)
-               add_interrupt_randomness(irq);
-       local_irq_disable();
-
-       return status;
-}
-
-/*
- * Generic enable/disable code: this just calls
- * down into the PIC-specific version for the actual
- * hardware disable after having gotten the irq
- * controller lock. 
- */
-/**
- *     disable_irq_nosync - disable an irq without waiting
- *     @irq: Interrupt to disable
- *
- *     Disable the selected interrupt line. Disables of an interrupt
- *     stack. Unlike disable_irq(), this function does not ensure existing
- *     instances of the IRQ handler have completed before returning.
- *
- *     This function may be called from IRQ context.
- */
-void inline disable_irq_nosync(unsigned int irq)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       unsigned long flags;
-
-       spin_lock_irqsave(&desc->lock, flags);
-       if (!desc->depth++) {
-               desc->status |= IRQ_DISABLED;
-               desc->handler->disable(irq);
-       }
-       spin_unlock_irqrestore(&desc->lock, flags);
-}
-
-/**
- *     disable_irq - disable an irq and wait for completion
- *     @irq: Interrupt to disable
- *
- *     Disable the selected interrupt line. Disables of an interrupt
- *     stack. That is for two disables you need two enables. This
- *     function waits for any pending IRQ handlers for this interrupt
- *     to complete before returning. If you use this function while
- *     holding a resource the IRQ handler may need you will deadlock.
- *
- *     This function may be called - with care - from IRQ context.
- */
-void disable_irq(unsigned int irq)
-{
-       disable_irq_nosync(irq);
-       synchronize_irq(irq);
-}
+                       seq_printf(p, "  %s", action->name);
+                       for (action=action->next; action; action = action->next)
+                               seq_printf(p, ", %s", action->name);
+                       seq_putc(p, '\n');
+               }
 
-/**
- *     enable_irq - enable interrupt handling on an irq
- *     @irq: Interrupt to enable
- *
- *     Re-enables the processing of interrupts on this IRQ line
- *     providing no disable_irq calls are now in effect.
- *
- *     This function may be called from IRQ context.
- */
-void enable_irq(unsigned int irq)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       unsigned long flags;
+               spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
+       } else if (irq == NR_IRQS)
+               seq_printf(p, "ERR: %10lu\n", irq_err_count);
 
-       spin_lock_irqsave(&desc->lock, flags);
-       switch (desc->depth) {
-       case 1: {
-               unsigned int status = desc->status & ~IRQ_DISABLED;
-               desc->status = status;
-               if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
-                       desc->status = status | IRQ_REPLAY;
-                       hw_resend_irq(desc->handler,irq);
-               }
-               desc->handler->enable(irq);
-               /* fall-through */
-       }
-       default:
-               desc->depth--;
-               break;
-       case 0:
-               printk("enable_irq(%u) unbalanced from %p\n", irq,
-                      __builtin_return_address(0));
-       }
-       spin_unlock_irqrestore(&desc->lock, flags);
+       return 0;
 }
 
 /* Handle interrupt IRQ.  REGS are the registers at the time of ther
    interrupt.  */
 unsigned int handle_irq (int irq, struct pt_regs *regs)
 {
-       /* 
-        * We ack quickly, we don't want the irq controller
-        * thinking we're snobs just because some other CPU has
-        * disabled global interrupts (we have already done the
-        * INT_ACK cycles, it's too late to try to pretend to the
-        * controller that we aren't taking the interrupt).
-        *
-        * 0 return value means that this irq is already being
-        * handled by some other CPU. (or is disabled)
-        */
-       int cpu = smp_processor_id();
-       irq_desc_t *desc = irq_desc + irq;
-       struct irqaction * action;
-       unsigned int status;
-
        irq_enter();
-       kstat_cpu(cpu).irqs[irq]++;
-       spin_lock(&desc->lock);
-       desc->handler->ack(irq);
-       /*
-          REPLAY is when Linux resends an IRQ that was dropped earlier
-          WAITING is used by probe to mark irqs that are being tested
-          */
-       status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
-       status |= IRQ_PENDING; /* we _want_ to handle it */
-
-       /*
-        * If the IRQ is disabled for whatever reason, we cannot
-        * use the action we have.
-        */
-       action = NULL;
-       if (likely(!(status & (IRQ_DISABLED | IRQ_INPROGRESS)))) {
-               action = desc->action;
-               status &= ~IRQ_PENDING; /* we commit to handling */
-               status |= IRQ_INPROGRESS; /* we are handling it */
-       }
-       desc->status = status;
-
-       /*
-        * If there is no IRQ handler or it was disabled, exit early.
-          Since we set PENDING, if another processor is handling
-          a different instance of this same irq, the other processor
-          will take care of it.
-        */
-       if (unlikely(!action))
-               goto out;
-
-       /*
-        * Edge triggered interrupts need to remember
-        * pending events.
-        * This applies to any hw interrupts that allow a second
-        * instance of the same irq to arrive while we are in handle_irq
-        * or in the handler. But the code here only handles the _second_
-        * instance of the irq, not the third or fourth. So it is mostly
-        * useful for irq hardware that does not mask cleanly in an
-        * SMP environment.
-        */
-       for (;;) {
-               spin_unlock(&desc->lock);
-               handle_IRQ_event(irq, regs, action);
-               spin_lock(&desc->lock);
-               
-               if (likely(!(desc->status & IRQ_PENDING)))
-                       break;
-               desc->status &= ~IRQ_PENDING;
-       }
-       desc->status &= ~IRQ_INPROGRESS;
-
-out:
-       /*
-        * The ->end() handler has to deal with interrupts which got
-        * disabled while the handler was running.
-        */
-       desc->handler->end(irq);
-       spin_unlock(&desc->lock);
-
+       __do_IRQ(irq, regs);
        irq_exit();
-
        return 1;
 }
 
-/**
- *     request_irq - allocate an interrupt line
- *     @irq: Interrupt line to allocate
- *     @handler: Function to be called when the IRQ occurs
- *     @irqflags: Interrupt type flags
- *     @devname: An ascii name for the claiming device
- *     @dev_id: A cookie passed back to the handler function
- *
- *     This call allocates interrupt resources and enables the
- *     interrupt line and IRQ handling. From the point this
- *     call is made your handler function may be invoked. Since
- *     your handler function must clear any interrupt the board 
- *     raises, you must take care both to initialise your hardware
- *     and to set up the interrupt handler in the right order.
- *
- *     Dev_id must be globally unique. Normally the address of the
- *     device data structure is used as the cookie. Since the handler
- *     receives this value it makes sense to use it.
- *
- *     If your interrupt is shared you must pass a non NULL dev_id
- *     as this is required when freeing the interrupt.
- *
- *     Flags:
- *
- *     SA_SHIRQ                Interrupt is shared
- *
- *     SA_INTERRUPT            Disable local interrupts while processing
- *
- *     SA_SAMPLE_RANDOM        The interrupt can be used for entropy
- *
- */
-int request_irq(unsigned int irq, 
-               irqreturn_t (*handler)(int, void *, struct pt_regs *),
-               unsigned long irqflags, 
-               const char * devname,
-               void *dev_id)
-{
-       int retval;
-       struct irqaction * action;
-
-#if 1
-       /*
-        * Sanity-check: shared interrupts should REALLY pass in
-        * a real dev-ID, otherwise we'll have trouble later trying
-        * to figure out which interrupt is which (messes up the
-        * interrupt freeing logic etc).
-        */
-       if (irqflags & SA_SHIRQ) {
-               if (!dev_id)
-                       printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);
-       }
-#endif
-
-       if (irq >= NR_IRQS)
-               return -EINVAL;
-       if (!handler)
-               return -EINVAL;
-
-       action = (struct irqaction *)
-                       kmalloc(sizeof(struct irqaction), GFP_KERNEL);
-       if (!action)
-               return -ENOMEM;
-
-       action->handler = handler;
-       action->flags = irqflags;
-       cpus_clear(action->mask);
-       action->name = devname;
-       action->next = NULL;
-       action->dev_id = dev_id;
-
-       retval = setup_irq(irq, action);
-       if (retval)
-               kfree(action);
-       return retval;
-}
-
-EXPORT_SYMBOL(request_irq);
-
-/**
- *     free_irq - free an interrupt
- *     @irq: Interrupt line to free
- *     @dev_id: Device identity to free
- *
- *     Remove an interrupt handler. The handler is removed and if the
- *     interrupt line is no longer in use by any driver it is disabled.
- *     On a shared IRQ the caller must ensure the interrupt is disabled
- *     on the card it drives before calling this function. The function
- *     does not return until any executing interrupts for this IRQ
- *     have completed.
- *
- *     This function may be called from interrupt context. 
- *
- *     Bugs: Attempting to free an irq in a handler for the same irq hangs
- *           the machine.
- */
-void free_irq(unsigned int irq, void *dev_id)
-{
-       irq_desc_t *desc;
-       struct irqaction **p;
-       unsigned long flags;
-
-       if (irq >= NR_IRQS)
-               return;
-
-       desc = irq_desc + irq;
-       spin_lock_irqsave(&desc->lock,flags);
-       p = &desc->action;
-       for (;;) {
-               struct irqaction * action = *p;
-               if (action) {
-                       struct irqaction **pp = p;
-                       p = &action->next;
-                       if (action->dev_id != dev_id)
-                               continue;
-
-                       /* Found it - now remove it from the list of entries */
-                       *pp = action->next;
-                       if (!desc->action) {
-                               desc->status |= IRQ_DISABLED;
-                               desc->handler->shutdown(irq);
-                       }
-                       spin_unlock_irqrestore(&desc->lock,flags);
-
-                       synchronize_irq(irq);
-                       kfree(action);
-                       return;
-               }
-               printk("Trying to free free IRQ%d\n",irq);
-               spin_unlock_irqrestore(&desc->lock,flags);
-               return;
-       }
-}
-
-EXPORT_SYMBOL(free_irq);
-
-/*
- * IRQ autodetection code..
- *
- * This depends on the fact that any interrupt that
- * comes in on to an unassigned handler will get stuck
- * with "IRQ_WAITING" cleared and the interrupt
- * disabled.
- */
-
-static DECLARE_MUTEX(probe_sem);
-
-/**
- *     probe_irq_on    - begin an interrupt autodetect
- *
- *     Commence probing for an interrupt. The interrupts are scanned
- *     and a mask of potential interrupt lines is returned.
- *
- */
-unsigned long probe_irq_on(void)
-{
-       unsigned int i;
-       irq_desc_t *desc;
-       unsigned long val;
-       unsigned long delay;
-
-       down(&probe_sem);
-       /* 
-        * something may have generated an irq long ago and we want to
-        * flush such a longstanding irq before considering it as spurious. 
-        */
-       for (i = NR_IRQS-1; i > 0; i--)  {
-               desc = irq_desc + i;
-
-               spin_lock_irq(&desc->lock);
-               if (!irq_desc[i].action) 
-                       irq_desc[i].handler->startup(i);
-               spin_unlock_irq(&desc->lock);
-       }
-
-       /* Wait for longstanding interrupts to trigger. */
-       for (delay = jiffies + HZ/50; time_after(delay, jiffies); )
-               /* about 20ms delay */ barrier();
-
-       /*
-        * enable any unassigned irqs
-        * (we must startup again here because if a longstanding irq
-        * happened in the previous stage, it may have masked itself)
-        */
-       for (i = NR_IRQS-1; i > 0; i--) {
-               desc = irq_desc + i;
-
-               spin_lock_irq(&desc->lock);
-               if (!desc->action) {
-                       desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
-                       if (desc->handler->startup(i))
-                               desc->status |= IRQ_PENDING;
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-
-       /*
-        * Wait for spurious interrupts to trigger
-        */
-       for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
-               /* about 100ms delay */ barrier();
-
-       /*
-        * Now filter out any obviously spurious interrupts
-        */
-       val = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       /* It triggered already - consider it spurious. */
-                       if (!(status & IRQ_WAITING)) {
-                               desc->status = status & ~IRQ_AUTODETECT;
-                               desc->handler->shutdown(i);
-                       } else
-                               if (i < 32)
-                                       val |= 1 << i;
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-
-       return val;
-}
-
-EXPORT_SYMBOL(probe_irq_on);
-
-/*
- * Return a mask of triggered interrupts (this
- * can handle only legacy ISA interrupts).
- */
-/**
- *     probe_irq_mask - scan a bitmap of interrupt lines
- *     @val:   mask of interrupts to consider
- *
- *     Scan the ISA bus interrupt lines and return a bitmap of
- *     active interrupts. The interrupt probe logic state is then
- *     returned to its previous value.
- *
- *     Note: we need to scan all the irq's even though we will
- *     only return ISA irq numbers - just so that we reset them
- *     all to a known state.
- */
-unsigned int probe_irq_mask(unsigned long val)
-{
-       int i;
-       unsigned int mask;
-
-       mask = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       if (i < 16 && !(status & IRQ_WAITING))
-                               mask |= 1 << i;
-
-                       desc->status = status & ~IRQ_AUTODETECT;
-                       desc->handler->shutdown(i);
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-       up(&probe_sem);
-
-       return mask & val;
-}
-
-/*
- * Return the one interrupt that triggered (this can
- * handle any interrupt source).
- */
-
-/**
- *     probe_irq_off   - end an interrupt autodetect
- *     @val: mask of potential interrupts (unused)
- *
- *     Scans the unused interrupt lines and returns the line which
- *     appears to have triggered the interrupt. If no interrupt was
- *     found then zero is returned. If more than one interrupt is
- *     found then minus the first candidate is returned to indicate
- *     their is doubt.
- *
- *     The interrupt probe logic state is returned to its previous
- *     value.
- *
- *     BUGS: When used in a module (which arguably shouldnt happen)
- *     nothing prevents two IRQ probe callers from overlapping. The
- *     results of this are non-optimal.
- */
-int probe_irq_off(unsigned long val)
-{
-       int i, irq_found, nr_irqs;
-
-       nr_irqs = 0;
-       irq_found = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       if (!(status & IRQ_WAITING)) {
-                               if (!nr_irqs)
-                                       irq_found = i;
-                               nr_irqs++;
-                       }
-                       desc->status = status & ~IRQ_AUTODETECT;
-                       desc->handler->shutdown(i);
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-       up(&probe_sem);
-
-       if (nr_irqs > 1)
-               irq_found = -irq_found;
-       return irq_found;
-}
-
-EXPORT_SYMBOL(probe_irq_off);
-
-/* this was setup_x86_irq but it seems pretty generic */
-int setup_irq(unsigned int irq, struct irqaction * new)
-{
-       int shared = 0;
-       unsigned long flags;
-       struct irqaction *old, **p;
-       irq_desc_t *desc = irq_desc + irq;
-
-       /*
-        * Some drivers like serial.c use request_irq() heavily,
-        * so we have to be careful not to interfere with a
-        * running system.
-        */
-       if (new->flags & SA_SAMPLE_RANDOM) {
-               /*
-                * This function might sleep, we want to call it first,
-                * outside of the atomic block.
-                * Yes, this might clear the entropy pool if the wrong
-                * driver is attempted to be loaded, without actually
-                * installing a new handler, but is this really a problem,
-                * only the sysadmin is able to do this.
-                */
-               rand_initialize_irq(irq);
-       }
-
-       /*
-        * The following block of code has to be executed atomically
-        */
-       spin_lock_irqsave(&desc->lock,flags);
-       p = &desc->action;
-       if ((old = *p) != NULL) {
-               /* Can't share interrupts unless both agree to */
-               if (!(old->flags & new->flags & SA_SHIRQ)) {
-                       spin_unlock_irqrestore(&desc->lock,flags);
-                       return -EBUSY;
-               }
-
-               /* add new interrupt at end of irq queue */
-               do {
-                       p = &old->next;
-                       old = *p;
-               } while (old);
-               shared = 1;
-       }
-
-       *p = new;
-
-       if (!shared) {
-               desc->depth = 0;
-               desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS);
-               desc->handler->startup(irq);
-       }
-       spin_unlock_irqrestore(&desc->lock,flags);
-
-       /* register_irq_proc(irq); */
-       return 0;
-}
-
 /* Initialize irq handling for IRQs.
    BASE_IRQ, BASE_IRQ+INTERVAL, ..., BASE_IRQ+NUM*INTERVAL
    to IRQ_TYPE.  An IRQ_TYPE of 0 means to use a generic interrupt type.  */
@@ -736,9 +121,3 @@ init_irq_handlers (int base_irq, int num, int interval,
                base_irq += interval;
        }
 }
-
-#if defined(CONFIG_PROC_FS) && defined(CONFIG_SYSCTL)
-void init_irq_proc(void)
-{
-}
-#endif /* CONFIG_PROC_FS && CONFIG_SYSCTL */
index 4cce2f6f170c0712dda1a1e6f60cbf545def6b70..6ece645e4dbea691191ccdaa8d49ec42025ab25f 100644 (file)
@@ -226,22 +226,42 @@ config SCHED_SMT
 
 source "kernel/Kconfig.preempt"
 
-config K8_NUMA
-       bool "K8 NUMA support"
-       select NUMA
+config NUMA
+       bool "Non Uniform Memory Access (NUMA) Support"
        depends on SMP
        help
-         Enable NUMA (Non Unified Memory Architecture) support for
-         AMD Opteron Multiprocessor systems. The kernel will try to allocate
-         memory used by a CPU on the local memory controller of the CPU
-         and add some more NUMA awareness to the kernel.
-         This code is recommended on all multiprocessor Opteron systems
-         and normally doesn't hurt on others.
+        Enable NUMA (Non Uniform Memory Access) support. The kernel 
+        will try to allocate memory used by a CPU on the local memory 
+        controller of the CPU and add some more NUMA awareness to the kernel.
+        This code is recommended on all multiprocessor Opteron systems.
+        If the system is EM64T, you should say N unless your system is EM64T 
+        NUMA. 
+
+config K8_NUMA
+       bool "Old style AMD Opteron NUMA detection"
+       depends on NUMA
+       default y
+       help
+        Enable K8 NUMA node topology detection.  You should say Y here if
+        you have a multi processor AMD K8 system. This uses an old
+        method to read the NUMA configurtion directly from the builtin
+        Northbridge of Opteron. It is recommended to use X86_64_ACPI_NUMA
+        instead, which also takes priority if both are compiled in.   
+
+# Dummy CONFIG option to select ACPI_NUMA from drivers/acpi/Kconfig.
+
+config X86_64_ACPI_NUMA
+       bool "ACPI NUMA detection"
+       depends on NUMA
+       select ACPI 
+       select ACPI_NUMA
+       default y
+       help
+        Enable ACPI SRAT based node topology detection.
 
 config NUMA_EMU
-       bool "NUMA emulation support"
-       select NUMA
-       depends on SMP
+       bool "NUMA emulation"
+       depends on NUMA
        help
          Enable NUMA emulation. A flat machine will be split
          into virtual nodes when booted with "numa=fake=N", where N is the
@@ -252,9 +272,6 @@ config ARCH_DISCONTIGMEM_ENABLE
        depends on NUMA
        default y
 
-config NUMA
-       bool
-       default n
 
 config ARCH_DISCONTIGMEM_ENABLE
        def_bool y
@@ -374,6 +391,14 @@ config X86_MCE_INTEL
           Additional support for intel specific MCE features such as
           the thermal monitor.
 
+config X86_MCE_AMD
+       bool "AMD MCE features"
+       depends on X86_MCE && X86_LOCAL_APIC
+       default y
+       help
+          Additional support for AMD specific MCE features such as
+          the DRAM Error Threshold.
+
 config PHYSICAL_START
        hex "Physical address where the kernel is loaded" if EMBEDDED
        default "0x100000"
@@ -502,7 +527,7 @@ config IA32_EMULATION
          left.
 
 config IA32_AOUT
-       bool "IA32 a.out support"
+       tristate "IA32 a.out support"
        depends on IA32_EMULATION
        help
          Support old a.out binaries in the 32bit emulation.
index d584ecc27ea1902e038329335486a60b8e72f9eb..e2c6e64a85ec27318d0a76d51e421301e121dd3e 100644 (file)
@@ -2,15 +2,6 @@ menu "Kernel hacking"
 
 source "lib/Kconfig.debug"
 
-# !SMP for now because the context switch early causes GPF in segment reloading
-# and the GS base checking does the wrong thing then, causing a hang.
-config CHECKING
-       bool "Additional run-time checks"
-       depends on DEBUG_KERNEL && !SMP
-       help
-         Enables some internal consistency checks for kernel debugging.
-         You should normally say N.
-
 config INIT_DEBUG
        bool "Debug __init statements"
        depends on DEBUG_KERNEL
index f8db7e500fbfdd727e16ac7a9c71f1cab078f243..5d56542fb68f004737be94ed09d376f92507ab68 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-git11
-# Mon Sep 12 16:16:16 2005
+# Linux kernel version: 2.6.14-git7
+# Sat Nov  5 15:55:50 2005
 #
 CONFIG_X86_64=y
 CONFIG_64BIT=y
@@ -35,7 +35,7 @@ CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-# CONFIG_HOTPLUG is not set
+CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
@@ -93,10 +93,11 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 CONFIG_PREEMPT_BKL=y
+CONFIG_NUMA=y
 CONFIG_K8_NUMA=y
+CONFIG_X86_64_ACPI_NUMA=y
 # CONFIG_NUMA_EMU is not set
 CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_NUMA=y
 CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
 CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
@@ -107,9 +108,10 @@ CONFIG_DISCONTIGMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_NEED_MULTIPLE_NODES=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_HAVE_DEC_LOCK=y
 CONFIG_NR_CPUS=32
+CONFIG_HOTPLUG_CPU=y
 CONFIG_HPET_TIMER=y
 CONFIG_X86_PM_TIMER=y
 CONFIG_HPET_EMULATE_RTC=y
@@ -117,6 +119,7 @@ CONFIG_GART_IOMMU=y
 CONFIG_SWIOTLB=y
 CONFIG_X86_MCE=y
 CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_AMD=y
 CONFIG_PHYSICAL_START=0x100000
 # CONFIG_KEXEC is not set
 CONFIG_SECCOMP=y
@@ -136,11 +139,15 @@ CONFIG_PM=y
 # CONFIG_PM_DEBUG is not set
 CONFIG_SOFTWARE_SUSPEND=y
 CONFIG_PM_STD_PARTITION=""
+CONFIG_SUSPEND_SMP=y
 
 #
 # ACPI (Advanced Configuration and Power Interface) Support
 #
 CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+CONFIG_ACPI_SLEEP_PROC_SLEEP=y
 CONFIG_ACPI_AC=y
 CONFIG_ACPI_BATTERY=y
 CONFIG_ACPI_BUTTON=y
@@ -148,6 +155,7 @@ CONFIG_ACPI_BUTTON=y
 CONFIG_ACPI_HOTKEY=m
 CONFIG_ACPI_FAN=y
 CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_HOTPLUG_CPU=y
 CONFIG_ACPI_THERMAL=y
 CONFIG_ACPI_NUMA=y
 # CONFIG_ACPI_ASUS is not set
@@ -158,7 +166,7 @@ CONFIG_ACPI_BLACKLIST_YEAR=2001
 CONFIG_ACPI_EC=y
 CONFIG_ACPI_POWER=y
 CONFIG_ACPI_SYSTEM=y
-# CONFIG_ACPI_CONTAINER is not set
+CONFIG_ACPI_CONTAINER=y
 
 #
 # CPU Frequency scaling
@@ -293,7 +301,6 @@ CONFIG_IPV6=y
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-# CONFIG_NETFILTER_NETLINK is not set
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
@@ -311,6 +318,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
 # CONFIG_DEBUG_DRIVER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -354,6 +366,11 @@ CONFIG_IOSCHED_NOOP=y
 # CONFIG_IOSCHED_AS is not set
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -450,6 +467,7 @@ CONFIG_BLK_DEV_SD=y
 CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
 
 #
 # SCSI low-level drivers
@@ -469,20 +487,24 @@ CONFIG_AIC79XX_DEBUG_MASK=0
 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 CONFIG_SCSI_SATA=y
 # CONFIG_SCSI_SATA_AHCI is not set
 # CONFIG_SCSI_SATA_SVW is not set
 CONFIG_SCSI_ATA_PIIX=y
 # CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
+CONFIG_SCSI_SATA_NV=y
+# CONFIG_SCSI_PDC_ADMA is not set
 # CONFIG_SCSI_SATA_QSTOR is not set
+# CONFIG_SCSI_SATA_PROMISE is not set
 # CONFIG_SCSI_SATA_SX4 is not set
 # CONFIG_SCSI_SATA_SIL is not set
+# CONFIG_SCSI_SATA_SIL24 is not set
 # CONFIG_SCSI_SATA_SIS is not set
 # CONFIG_SCSI_SATA_ULI is not set
 CONFIG_SCSI_SATA_VIA=y
 # CONFIG_SCSI_SATA_VITESSE is not set
+CONFIG_SCSI_SATA_INTEL_COMBINED=y
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
@@ -525,6 +547,7 @@ CONFIG_BLK_DEV_DM=y
 CONFIG_FUSION=y
 CONFIG_FUSION_SPI=y
 # CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
 CONFIG_FUSION_MAX_SGE=128
 # CONFIG_FUSION_CTL is not set
 
@@ -564,6 +587,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 CONFIG_NET_VENDOR_3COM=y
 CONFIG_VORTEX=y
 # CONFIG_TYPHOON is not set
@@ -740,7 +764,43 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Watchdog Cards
 #
-# CONFIG_WATCHDOG is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+CONFIG_SOFT_WATCHDOG=y
+# CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADVANTECH_WDT is not set
+# CONFIG_ALIM1535_WDT is not set
+# CONFIG_ALIM7101_WDT is not set
+# CONFIG_SC520_WDT is not set
+# CONFIG_EUROTECH_WDT is not set
+# CONFIG_IB700_WDT is not set
+# CONFIG_IBMASR is not set
+# CONFIG_WAFER_WDT is not set
+# CONFIG_I6300ESB_WDT is not set
+# CONFIG_I8XX_TCO is not set
+# CONFIG_SC1200_WDT is not set
+# CONFIG_60XX_WDT is not set
+# CONFIG_SBC8360_WDT is not set
+# CONFIG_CPU5_WDT is not set
+# CONFIG_W83627HF_WDT is not set
+# CONFIG_W83877F_WDT is not set
+# CONFIG_W83977F_WDT is not set
+# CONFIG_MACHZ_WDT is not set
+
+#
+# PCI-based Watchdog Cards
+#
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_WDTPCI is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
 CONFIG_HW_RANDOM=y
 # CONFIG_NVRAM is not set
 CONFIG_RTC=y
@@ -767,6 +827,7 @@ CONFIG_MAX_RAW_DEVS=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -783,6 +844,7 @@ CONFIG_MAX_RAW_DEVS=256
 #
 CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_HDAPS is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
@@ -886,12 +948,15 @@ CONFIG_USB_UHCI_HCD=y
 # USB Device Class drivers
 #
 # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 CONFIG_USB_PRINTER=y
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -924,6 +989,7 @@ CONFIG_USB_HIDINPUT=y
 # CONFIG_USB_XPAD is not set
 # CONFIG_USB_ATI_REMOTE is not set
 # CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
 
 #
 # USB Imaging devices
@@ -1005,7 +1071,7 @@ CONFIG_USB_MON=y
 #
 # CONFIG_EDD is not set
 # CONFIG_DELL_RBU is not set
-CONFIG_DCDBAS=m
+# CONFIG_DCDBAS is not set
 
 #
 # File systems
@@ -1037,7 +1103,7 @@ CONFIG_INOTIFY=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 CONFIG_AUTOFS_FS=y
-# CONFIG_AUTOFS4_FS is not set
+CONFIG_AUTOFS4_FS=y
 # CONFIG_FUSE_FS is not set
 
 #
@@ -1068,7 +1134,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
+CONFIG_RELAYFS_FS=y
 
 #
 # Miscellaneous filesystems
@@ -1186,7 +1252,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_VM is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_INIT_DEBUG=y
 # CONFIG_IOMMU_DEBUG is not set
 CONFIG_KPROBES=y
index 93c60f4aa47a65f9c3708397735a17aa8377bc49..3bf58af98936fda96afff0f79b873ea4c61750ed 100644 (file)
@@ -36,9 +36,6 @@
 #undef WARN_OLD
 #undef CORE_DUMP /* probably broken */
 
-extern int ia32_setup_arg_pages(struct linux_binprm *bprm,
-                               unsigned long stack_top, int exec_stack);
-
 static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs);
 static int load_aout_library(struct file*);
 
index d9161e395978ca6d423d44b87845290781acb6c8..830feb272eca434c10f73adcb1499abeb71d7f9a 100644 (file)
@@ -335,7 +335,8 @@ static void elf32_init(struct pt_regs *regs)
        me->thread.es = __USER_DS;
 }
 
-int setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top, int executable_stack)
+int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
+                        int executable_stack)
 {
        unsigned long stack_base;
        struct vm_area_struct *mpnt;
@@ -389,6 +390,7 @@ int setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top, int exec
        
        return 0;
 }
+EXPORT_SYMBOL(ia32_setup_arg_pages);
 
 static unsigned long
 elf32_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
index 14328cab5d3ace4b2516b35c7b09993b6e5ff948..fe4cbd1c4b2fe2e894e22cb0855467a3e21b5c26 100644 (file)
@@ -11,6 +11,7 @@ obj-y := process.o signal.o entry.o traps.o irq.o \
 
 obj-$(CONFIG_X86_MCE)         += mce.o
 obj-$(CONFIG_X86_MCE_INTEL)    += mce_intel.o
+obj-$(CONFIG_X86_MCE_AMD)      += mce_amd.o
 obj-$(CONFIG_MTRR)             += ../../i386/kernel/cpu/mtrr/
 obj-$(CONFIG_ACPI)             += acpi/
 obj-$(CONFIG_X86_MSR)          += msr.o
index 962ad4823b6a567d4f340bca8d101a2e958dfbd2..c7f4fdd20f05ff78ee731054170de372f9c0cf40 100644 (file)
@@ -196,7 +196,7 @@ static __u32 __init search_agp_bridge(u32 *order, int *valid_agp)
 void __init iommu_hole_init(void) 
 { 
        int fix, num; 
-       u32 aper_size, aper_alloc = 0, aper_order, last_aper_order = 0;
+       u32 aper_size, aper_alloc = 0, aper_order = 0, last_aper_order = 0;
        u64 aper_base, last_aper_base = 0;
        int valid_agp = 0;
 
index b6e7715d877f38a0d191616c22dc7f9fe98e4509..18691ce4c75921ff84bd09d4f37766511e09247a 100644 (file)
@@ -833,6 +833,16 @@ int setup_profiling_timer(unsigned int multiplier)
        return 0;
 }
 
+#ifdef CONFIG_X86_MCE_AMD
+void setup_threshold_lvt(unsigned long lvt_off)
+{
+       unsigned int v = 0;
+       unsigned long reg = (lvt_off << 4) + 0x500;
+       v |= THRESHOLD_APIC_VECTOR;
+       apic_write(reg, v);
+}
+#endif /* CONFIG_X86_MCE_AMD */
+
 #undef APIC_DIVISOR
 
 /*
index ab3f87aaff70ab81e4c14f9beacc6341d52579b8..17579a1a174bda40da7f3291793ac746b9515cb0 100644 (file)
@@ -23,8 +23,7 @@
 #include <asm/e820.h>
 #include <asm/proto.h>
 #include <asm/bootsetup.h>
-
-extern char _end[];
+#include <asm/sections.h>
 
 /* 
  * PFN of last memory page.
index 7937971d1853bd5187cfe615e24c4a5cf35689be..9ff42041bb6b8b974a00be6c234bbaac31b3213e 100644 (file)
@@ -612,6 +612,9 @@ retint_kernel:
 ENTRY(thermal_interrupt)
        apicinterrupt THERMAL_APIC_VECTOR,smp_thermal_interrupt
 
+ENTRY(threshold_interrupt)
+       apicinterrupt THRESHOLD_APIC_VECTOR,mce_threshold_interrupt
+
 #ifdef CONFIG_SMP      
 ENTRY(reschedule_interrupt)
        apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt
index b92e5f45ed46743ab03fbd7e2dbb4c44da5057ab..15290968e49db562753b720f15b9d564500f5668 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/linkage.h>
 #include <linux/threads.h>
+#include <linux/init.h>
 #include <asm/desc.h>
 #include <asm/segment.h>
 #include <asm/page.h>
@@ -70,7 +71,7 @@ startup_32:
        movl    %eax, %cr4
 
        /* Setup early boot stage 4 level pagetables */
-       movl    $(init_level4_pgt - __START_KERNEL_map), %eax
+       movl    $(boot_level4_pgt - __START_KERNEL_map), %eax
        movl    %eax, %cr3
 
        /* Setup EFER (Extended Feature Enable Register) */
@@ -113,7 +114,7 @@ startup_64:
        movq    %rax, %cr4
 
        /* Setup early boot stage 4 level pagetables. */
-       movq    $(init_level4_pgt - __START_KERNEL_map), %rax
+       movq    $(boot_level4_pgt - __START_KERNEL_map), %rax
        movq    %rax, %cr3
 
        /* Check if nx is implemented */
@@ -240,20 +241,10 @@ ljumpvector:
 ENTRY(stext)
 ENTRY(_stext)
 
-       /*
-        * This default setting generates an ident mapping at address 0x100000
-        * and a mapping for the kernel that precisely maps virtual address
-        * 0xffffffff80000000 to physical address 0x000000. (always using
-        * 2Mbyte large pages provided by PAE mode)
-        */
 .org 0x1000
 ENTRY(init_level4_pgt)
-       .quad   0x0000000000002007 + __PHYSICAL_START   /* -> level3_ident_pgt */
-       .fill   255,8,0
-       .quad   0x000000000000a007 + __PHYSICAL_START
-       .fill   254,8,0
-       /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
-       .quad   0x0000000000003007 + __PHYSICAL_START   /* -> level3_kernel_pgt */
+       /* This gets initialized in x86_64_start_kernel */
+       .fill   512,8,0
 
 .org 0x2000
 ENTRY(level3_ident_pgt)
@@ -350,6 +341,24 @@ ENTRY(wakeup_level4_pgt)
        .quad   0x0000000000003007 + __PHYSICAL_START   /* -> level3_kernel_pgt */
 #endif
 
+#ifndef CONFIG_HOTPLUG_CPU
+       __INITDATA
+#endif
+       /*
+        * This default setting generates an ident mapping at address 0x100000
+        * and a mapping for the kernel that precisely maps virtual address
+        * 0xffffffff80000000 to physical address 0x000000. (always using
+        * 2Mbyte large pages provided by PAE mode)
+        */
+       .align PAGE_SIZE
+ENTRY(boot_level4_pgt)
+       .quad   0x0000000000002007 + __PHYSICAL_START   /* -> level3_ident_pgt */
+       .fill   255,8,0
+       .quad   0x000000000000a007 + __PHYSICAL_START
+       .fill   254,8,0
+       /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
+       .quad   0x0000000000003007 + __PHYSICAL_START   /* -> level3_kernel_pgt */
+
        .data
 
        .align 16
index cf6ab147a2a5dc806cfbd4ead4912cfaca1c8258..b675c5add01ece1b5b9071940e25d0b714e4f536 100644 (file)
 #include <asm/bootsetup.h>
 #include <asm/setup.h>
 #include <asm/desc.h>
+#include <asm/pgtable.h>
+#include <asm/sections.h>
 
 /* Don't add a printk in there. printk relies on the PDA which is not initialized 
    yet. */
 static void __init clear_bss(void)
 {
-       extern char __bss_start[], __bss_end[];
        memset(__bss_start, 0,
-              (unsigned long) __bss_end - (unsigned long) __bss_start);
+              (unsigned long) __bss_stop - (unsigned long) __bss_start);
 }
 
 #define NEW_CL_POINTER         0x228   /* Relative to real mode data */
@@ -75,8 +76,6 @@ static void __init setup_boot_cpu_data(void)
        boot_cpu_data.x86_mask = eax & 0xf;
 }
 
-extern char _end[];
-
 void __init x86_64_start_kernel(char * real_mode_data)
 {
        char *s;
@@ -86,6 +85,13 @@ void __init x86_64_start_kernel(char * real_mode_data)
                set_intr_gate(i, early_idt_handler);
        asm volatile("lidt %0" :: "m" (idt_descr));
        clear_bss();
+
+       /*
+        * switch to init_level4_pgt from boot_level4_pgt
+        */
+       memcpy(init_level4_pgt, boot_level4_pgt, PTRS_PER_PGD*sizeof(pgd_t));
+       asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
+
        pda_init(0);
        copy_bootdata(real_mode_data);
 #ifdef CONFIG_SMP
index c6c9791d77c18aa2ed7025f7b9c7a0b07e18f132..6e5101ad3d1a075290e3acb298b78e0f5e430c8d 100644 (file)
@@ -492,6 +492,7 @@ void invalidate_interrupt5(void);
 void invalidate_interrupt6(void);
 void invalidate_interrupt7(void);
 void thermal_interrupt(void);
+void threshold_interrupt(void);
 void i8254_timer_resume(void);
 
 static void setup_timer_hardware(void)
@@ -515,7 +516,7 @@ void i8254_timer_resume(void)
 }
 
 static struct sysdev_class timer_sysclass = {
-       set_kset_name("timer"),
+       set_kset_name("timer_pit"),
        .resume         = timer_resume,
 };
 
@@ -580,6 +581,7 @@ void __init init_IRQ(void)
        set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
 #endif 
        set_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
+       set_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
 
 #ifdef CONFIG_X86_LOCAL_APIC
        /* self generated IPI for local APIC timer */
index c8eee20cd5197cbb4b81a4cd7f0441685090a583..97154ab058b470e1e27af7484e6adcf97fa93a06 100644 (file)
@@ -57,7 +57,7 @@ int nr_ioapic_registers[MAX_IO_APICS];
  * Rough estimation of how many shared IRQs there are, can
  * be changed anytime.
  */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
+#define MAX_PLUS_SHARED_IRQS NR_IRQ_VECTORS
 #define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
 
 /*
@@ -85,6 +85,7 @@ int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1};
        int pin;                                                        \
        struct irq_pin_list *entry = irq_2_pin + irq;                   \
                                                                        \
+       BUG_ON(irq >= NR_IRQS);                                         \
        for (;;) {                                                      \
                unsigned int reg;                                       \
                pin = entry->pin;                                       \
@@ -127,6 +128,8 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
 }
 #endif
 
+static u8 gsi_2_irq[NR_IRQ_VECTORS] = { [0 ... NR_IRQ_VECTORS-1] = 0xFF };
+
 /*
  * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
  * shared ISA-space IRQs, so we have to support them. We are super
@@ -137,6 +140,7 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
        static int first_free_entry = NR_IRQS;
        struct irq_pin_list *entry = irq_2_pin + irq;
 
+       BUG_ON(irq >= NR_IRQS);
        while (entry->next)
                entry = irq_2_pin + entry->next;
 
@@ -144,7 +148,7 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
                entry->next = first_free_entry;
                entry = irq_2_pin + entry->next;
                if (++first_free_entry >= PIN_MAP_SIZE)
-                       panic("io_apic.c: whoops");
+                       panic("io_apic.c: ran out of irq_2_pin entries!");
        }
        entry->apic = apic;
        entry->pin = pin;
@@ -420,6 +424,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
                                best_guess = irq;
                }
        }
+       BUG_ON(best_guess >= NR_IRQS);
        return best_guess;
 }
 
@@ -610,6 +615,64 @@ static inline int irq_trigger(int idx)
        return MPBIOS_trigger(idx);
 }
 
+static int next_irq = 16;
+
+/*
+ * gsi_irq_sharing -- Name overload!  "irq" can be either a legacy IRQ
+ * in the range 0-15, a linux IRQ in the range 0-223, or a GSI number
+ * from ACPI, which can reach 800 in large boxen.
+ *
+ * Compact the sparse GSI space into a sequential IRQ series and reuse
+ * vectors if possible.
+ */
+int gsi_irq_sharing(int gsi)
+{
+       int i, tries, vector;
+
+       BUG_ON(gsi >= NR_IRQ_VECTORS);
+
+       if (platform_legacy_irq(gsi))
+               return gsi;
+
+       if (gsi_2_irq[gsi] != 0xFF)
+               return (int)gsi_2_irq[gsi];
+
+       tries = NR_IRQS;
+  try_again:
+       vector = assign_irq_vector(gsi);
+
+       /*
+        * Sharing vectors means sharing IRQs, so scan irq_vectors for previous
+        * use of vector and if found, return that IRQ.  However, we never want
+        * to share legacy IRQs, which usually have a different trigger mode
+        * than PCI.
+        */
+       for (i = 0; i < NR_IRQS; i++)
+               if (IO_APIC_VECTOR(i) == vector)
+                       break;
+       if (platform_legacy_irq(i)) {
+               if (--tries >= 0) {
+                       IO_APIC_VECTOR(i) = 0;
+                       goto try_again;
+               }
+               panic("gsi_irq_sharing: didn't find an IRQ using vector 0x%02X for GSI %d", vector, gsi);
+       }
+       if (i < NR_IRQS) {
+               gsi_2_irq[gsi] = i;
+               printk(KERN_INFO "GSI %d sharing vector 0x%02X and IRQ %d\n",
+                               gsi, vector, i);
+               return i;
+       }
+
+       i = next_irq++;
+       BUG_ON(i >= NR_IRQS);
+       gsi_2_irq[gsi] = i;
+       IO_APIC_VECTOR(i) = vector;
+       printk(KERN_INFO "GSI %d assigned vector 0x%02X and IRQ %d\n",
+                       gsi, vector, i);
+       return i;
+}
+
 static int pin_2_irq(int idx, int apic, int pin)
 {
        int irq, i;
@@ -639,6 +702,7 @@ static int pin_2_irq(int idx, int apic, int pin)
                        while (i < apic)
                                irq += nr_ioapic_registers[i++];
                        irq += pin;
+                       irq = gsi_irq_sharing(irq);
                        break;
                }
                default:
@@ -648,6 +712,7 @@ static int pin_2_irq(int idx, int apic, int pin)
                        break;
                }
        }
+       BUG_ON(irq >= NR_IRQS);
 
        /*
         * PCI IRQ command line redirection. Yes, limits are hardcoded.
@@ -663,6 +728,7 @@ static int pin_2_irq(int idx, int apic, int pin)
                        }
                }
        }
+       BUG_ON(irq >= NR_IRQS);
        return irq;
 }
 
@@ -690,8 +756,8 @@ int assign_irq_vector(int irq)
 {
        static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
 
-       BUG_ON(irq >= NR_IRQ_VECTORS);
-       if (IO_APIC_VECTOR(irq) > 0)
+       BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
+       if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
                return IO_APIC_VECTOR(irq);
 next:
        current_vector += 8;
@@ -699,9 +765,8 @@ next:
                goto next;
 
        if (current_vector >= FIRST_SYSTEM_VECTOR) {
-               offset++;
-               if (!(offset%8))
-                       return -ENOSPC;
+               /* If we run out of vectors on large boxen, must share them. */
+               offset = (offset + 1) % 8;
                current_vector = FIRST_DEVICE_VECTOR + offset;
        }
 
@@ -1917,6 +1982,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
        entry.polarity = active_high_low;
        entry.mask = 1;                                  /* Disabled (masked) */
 
+       irq = gsi_irq_sharing(irq);
        /*
         * IRQs < 16 are already in the irq_2_pin[] map
         */
index 69541db5ff2c46ae58d199ab3ed695fbf7165572..183dc61054295426fcf12262cf94c66ab6df0a0b 100644 (file)
@@ -37,7 +37,7 @@ static unsigned long bank[NR_BANKS] = { [0 ... NR_BANKS-1] = ~0UL };
 static unsigned long console_logged;
 static int notify_user;
 static int rip_msr;
-static int mce_bootlog;
+static int mce_bootlog = 1;
 
 /*
  * Lockless MCE logging infrastructure.
@@ -347,7 +347,11 @@ static void __cpuinit mce_cpu_quirks(struct cpuinfo_x86 *c)
                /* disable GART TBL walk error reporting, which trips off 
                   incorrectly with the IOMMU & 3ware & Cerberus. */
                clear_bit(10, &bank[4]);
+               /* Lots of broken BIOS around that don't clear them
+                  by default and leave crap in there. Don't log. */
+               mce_bootlog = 0;
        }
+
 }                      
 
 static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c)
@@ -356,6 +360,9 @@ static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c)
        case X86_VENDOR_INTEL:
                mce_intel_feature_init(c);
                break;
+       case X86_VENDOR_AMD:
+               mce_amd_feature_init(c);
+               break;
        default:
                break;
        }
@@ -495,16 +502,16 @@ static int __init mcheck_disable(char *str)
 /* mce=off disables machine check. Note you can reenable it later
    using sysfs.
    mce=TOLERANCELEVEL (number, see above)
-   mce=bootlog Log MCEs from before booting. Disabled by default to work
-   around buggy BIOS that leave bogus MCEs.  */
+   mce=bootlog Log MCEs from before booting. Disabled by default on AMD.
+   mce=nobootlog Don't log MCEs from before booting. */
 static int __init mcheck_enable(char *str)
 {
        if (*str == '=')
                str++;
        if (!strcmp(str, "off"))
                mce_dont_init = 1;
-       else if (!strcmp(str, "bootlog"))
-               mce_bootlog = 1;
+       else if (!strcmp(str, "bootlog") || !strcmp(str,"nobootlog"))
+               mce_bootlog = str[0] == 'b';
        else if (isdigit(str[0]))
                get_option(&str, &tolerant);
        else
diff --git a/arch/x86_64/kernel/mce_amd.c b/arch/x86_64/kernel/mce_amd.c
new file mode 100644 (file)
index 0000000..1f76175
--- /dev/null
@@ -0,0 +1,538 @@
+/*
+ *  (c) 2005 Advanced Micro Devices, Inc.
+ *  Your use of this code is subject to the terms and conditions of the
+ *  GNU general public license version 2. See "COPYING" or
+ *  http://www.gnu.org/licenses/gpl.html
+ *
+ *  Written by Jacob Shin - AMD, Inc.
+ *
+ *  Support : jacob.shin@amd.com
+ *
+ *  MC4_MISC0 DRAM ECC Error Threshold available under AMD K8 Rev F.
+ *  MC4_MISC0 exists per physical processor.
+ *
+ */
+
+#include <linux/cpu.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/kobject.h>
+#include <linux/notifier.h>
+#include <linux/sched.h>
+#include <linux/smp.h>
+#include <linux/sysdev.h>
+#include <linux/sysfs.h>
+#include <asm/apic.h>
+#include <asm/mce.h>
+#include <asm/msr.h>
+#include <asm/percpu.h>
+
+#define PFX "mce_threshold: "
+#define VERSION "version 1.00.9"
+#define NR_BANKS 5
+#define THRESHOLD_MAX 0xFFF
+#define INT_TYPE_APIC 0x00020000
+#define MASK_VALID_HI 0x80000000
+#define MASK_LVTOFF_HI 0x00F00000
+#define MASK_COUNT_EN_HI 0x00080000
+#define MASK_INT_TYPE_HI 0x00060000
+#define MASK_OVERFLOW_HI 0x00010000
+#define MASK_ERR_COUNT_HI 0x00000FFF
+#define MASK_OVERFLOW 0x0001000000000000L
+
+struct threshold_bank {
+       unsigned int cpu;
+       u8 bank;
+       u8 interrupt_enable;
+       u16 threshold_limit;
+       struct kobject kobj;
+};
+
+static struct threshold_bank threshold_defaults = {
+       .interrupt_enable = 0,
+       .threshold_limit = THRESHOLD_MAX,
+};
+
+#ifdef CONFIG_SMP
+static unsigned char shared_bank[NR_BANKS] = {
+       0, 0, 0, 0, 1
+};
+#endif
+
+static DEFINE_PER_CPU(unsigned char, bank_map);        /* see which banks are on */
+
+/*
+ * CPU Initialization
+ */
+
+/* must be called with correct cpu affinity */
+static void threshold_restart_bank(struct threshold_bank *b,
+                                  int reset, u16 old_limit)
+{
+       u32 mci_misc_hi, mci_misc_lo;
+
+       rdmsr(MSR_IA32_MC0_MISC + b->bank * 4, mci_misc_lo, mci_misc_hi);
+
+       if (b->threshold_limit < (mci_misc_hi & THRESHOLD_MAX))
+               reset = 1;      /* limit cannot be lower than err count */
+
+       if (reset) {            /* reset err count and overflow bit */
+               mci_misc_hi =
+                   (mci_misc_hi & ~(MASK_ERR_COUNT_HI | MASK_OVERFLOW_HI)) |
+                   (THRESHOLD_MAX - b->threshold_limit);
+       } else if (old_limit) { /* change limit w/o reset */
+               int new_count = (mci_misc_hi & THRESHOLD_MAX) +
+                   (old_limit - b->threshold_limit);
+               mci_misc_hi = (mci_misc_hi & ~MASK_ERR_COUNT_HI) |
+                   (new_count & THRESHOLD_MAX);
+       }
+
+       b->interrupt_enable ?
+           (mci_misc_hi = (mci_misc_hi & ~MASK_INT_TYPE_HI) | INT_TYPE_APIC) :
+           (mci_misc_hi &= ~MASK_INT_TYPE_HI);
+
+       mci_misc_hi |= MASK_COUNT_EN_HI;
+       wrmsr(MSR_IA32_MC0_MISC + b->bank * 4, mci_misc_lo, mci_misc_hi);
+}
+
+void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
+{
+       int bank;
+       u32 mci_misc_lo, mci_misc_hi;
+       unsigned int cpu = smp_processor_id();
+
+       for (bank = 0; bank < NR_BANKS; ++bank) {
+               rdmsr(MSR_IA32_MC0_MISC + bank * 4, mci_misc_lo, mci_misc_hi);
+
+               /* !valid, !counter present, bios locked */
+               if (!(mci_misc_hi & MASK_VALID_HI) ||
+                   !(mci_misc_hi & MASK_VALID_HI >> 1) ||
+                   (mci_misc_hi & MASK_VALID_HI >> 2))
+                       continue;
+
+               per_cpu(bank_map, cpu) |= (1 << bank);
+
+#ifdef CONFIG_SMP
+               if (shared_bank[bank] && cpu_core_id[cpu])
+                       continue;
+#endif
+
+               setup_threshold_lvt((mci_misc_hi & MASK_LVTOFF_HI) >> 20);
+               threshold_defaults.cpu = cpu;
+               threshold_defaults.bank = bank;
+               threshold_restart_bank(&threshold_defaults, 0, 0);
+       }
+}
+
+/*
+ * APIC Interrupt Handler
+ */
+
+/*
+ * threshold interrupt handler will service THRESHOLD_APIC_VECTOR.
+ * the interrupt goes off when error_count reaches threshold_limit.
+ * the handler will simply log mcelog w/ software defined bank number.
+ */
+asmlinkage void mce_threshold_interrupt(void)
+{
+       int bank;
+       struct mce m;
+
+       ack_APIC_irq();
+       irq_enter();
+
+       memset(&m, 0, sizeof(m));
+       rdtscll(m.tsc);
+       m.cpu = smp_processor_id();
+
+       /* assume first bank caused it */
+       for (bank = 0; bank < NR_BANKS; ++bank) {
+               m.bank = MCE_THRESHOLD_BASE + bank;
+               rdmsrl(MSR_IA32_MC0_MISC + bank * 4, m.misc);
+
+               if (m.misc & MASK_OVERFLOW) {
+                       mce_log(&m);
+                       goto out;
+               }
+       }
+      out:
+       irq_exit();
+}
+
+/*
+ * Sysfs Interface
+ */
+
+static struct sysdev_class threshold_sysclass = {
+       set_kset_name("threshold"),
+};
+
+static DEFINE_PER_CPU(struct sys_device, device_threshold);
+
+struct threshold_attr {
+        struct attribute attr;
+        ssize_t(*show) (struct threshold_bank *, char *);
+        ssize_t(*store) (struct threshold_bank *, const char *, size_t count);
+};
+
+static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]);
+
+static cpumask_t affinity_set(unsigned int cpu)
+{
+       cpumask_t oldmask = current->cpus_allowed;
+       cpumask_t newmask = CPU_MASK_NONE;
+       cpu_set(cpu, newmask);
+       set_cpus_allowed(current, newmask);
+       return oldmask;
+}
+
+static void affinity_restore(cpumask_t oldmask)
+{
+       set_cpus_allowed(current, oldmask);
+}
+
+#define SHOW_FIELDS(name) \
+        static ssize_t show_ ## name(struct threshold_bank * b, char *buf) \
+        { \
+                return sprintf(buf, "%lx\n", (unsigned long) b->name); \
+        }
+SHOW_FIELDS(interrupt_enable)
+SHOW_FIELDS(threshold_limit)
+
+static ssize_t store_interrupt_enable(struct threshold_bank *b,
+                                     const char *buf, size_t count)
+{
+       char *end;
+       cpumask_t oldmask;
+       unsigned long new = simple_strtoul(buf, &end, 0);
+       if (end == buf)
+               return -EINVAL;
+       b->interrupt_enable = !!new;
+
+       oldmask = affinity_set(b->cpu);
+       threshold_restart_bank(b, 0, 0);
+       affinity_restore(oldmask);
+
+       return end - buf;
+}
+
+static ssize_t store_threshold_limit(struct threshold_bank *b,
+                                    const char *buf, size_t count)
+{
+       char *end;
+       cpumask_t oldmask;
+       u16 old;
+       unsigned long new = simple_strtoul(buf, &end, 0);
+       if (end == buf)
+               return -EINVAL;
+       if (new > THRESHOLD_MAX)
+               new = THRESHOLD_MAX;
+       if (new < 1)
+               new = 1;
+       old = b->threshold_limit;
+       b->threshold_limit = new;
+
+       oldmask = affinity_set(b->cpu);
+       threshold_restart_bank(b, 0, old);
+       affinity_restore(oldmask);
+
+       return end - buf;
+}
+
+static ssize_t show_error_count(struct threshold_bank *b, char *buf)
+{
+       u32 high, low;
+       cpumask_t oldmask;
+       oldmask = affinity_set(b->cpu);
+       rdmsr(MSR_IA32_MC0_MISC + b->bank * 4, low, high); /* ignore low 32 */
+       affinity_restore(oldmask);
+       return sprintf(buf, "%x\n",
+                      (high & 0xFFF) - (THRESHOLD_MAX - b->threshold_limit));
+}
+
+static ssize_t store_error_count(struct threshold_bank *b,
+                                const char *buf, size_t count)
+{
+       cpumask_t oldmask;
+       oldmask = affinity_set(b->cpu);
+       threshold_restart_bank(b, 1, 0);
+       affinity_restore(oldmask);
+       return 1;
+}
+
+#define THRESHOLD_ATTR(_name,_mode,_show,_store) {            \
+        .attr = {.name = __stringify(_name), .mode = _mode }, \
+        .show = _show,                                        \
+        .store = _store,                                      \
+};
+
+#define ATTR_FIELDS(name) \
+        static struct threshold_attr name = \
+        THRESHOLD_ATTR(name, 0644, show_## name, store_## name)
+
+ATTR_FIELDS(interrupt_enable);
+ATTR_FIELDS(threshold_limit);
+ATTR_FIELDS(error_count);
+
+static struct attribute *default_attrs[] = {
+       &interrupt_enable.attr,
+       &threshold_limit.attr,
+       &error_count.attr,
+       NULL
+};
+
+#define to_bank(k) container_of(k,struct threshold_bank,kobj)
+#define to_attr(a) container_of(a,struct threshold_attr,attr)
+
+static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
+{
+       struct threshold_bank *b = to_bank(kobj);
+       struct threshold_attr *a = to_attr(attr);
+       ssize_t ret;
+       ret = a->show ? a->show(b, buf) : -EIO;
+       return ret;
+}
+
+static ssize_t store(struct kobject *kobj, struct attribute *attr,
+                    const char *buf, size_t count)
+{
+       struct threshold_bank *b = to_bank(kobj);
+       struct threshold_attr *a = to_attr(attr);
+       ssize_t ret;
+       ret = a->store ? a->store(b, buf, count) : -EIO;
+       return ret;
+}
+
+static struct sysfs_ops threshold_ops = {
+       .show = show,
+       .store = store,
+};
+
+static struct kobj_type threshold_ktype = {
+       .sysfs_ops = &threshold_ops,
+       .default_attrs = default_attrs,
+};
+
+/* symlinks sibling shared banks to first core.  first core owns dir/files. */
+static __cpuinit int threshold_create_bank(unsigned int cpu, int bank)
+{
+       int err = 0;
+       struct threshold_bank *b = 0;
+
+#ifdef CONFIG_SMP
+       if (cpu_core_id[cpu] && shared_bank[bank]) {    /* symlink */
+               char name[16];
+               unsigned lcpu = first_cpu(cpu_core_map[cpu]);
+               if (cpu_core_id[lcpu])
+                       goto out;       /* first core not up yet */
+
+               b = per_cpu(threshold_banks, lcpu)[bank];
+               if (!b)
+                       goto out;
+               sprintf(name, "bank%i", bank);
+               err = sysfs_create_link(&per_cpu(device_threshold, cpu).kobj,
+                                       &b->kobj, name);
+               if (err)
+                       goto out;
+               per_cpu(threshold_banks, cpu)[bank] = b;
+               goto out;
+       }
+#endif
+
+       b = kmalloc(sizeof(struct threshold_bank), GFP_KERNEL);
+       if (!b) {
+               err = -ENOMEM;
+               goto out;
+       }
+       memset(b, 0, sizeof(struct threshold_bank));
+
+       b->cpu = cpu;
+       b->bank = bank;
+       b->interrupt_enable = 0;
+       b->threshold_limit = THRESHOLD_MAX;
+       kobject_set_name(&b->kobj, "bank%i", bank);
+       b->kobj.parent = &per_cpu(device_threshold, cpu).kobj;
+       b->kobj.ktype = &threshold_ktype;
+
+       err = kobject_register(&b->kobj);
+       if (err) {
+               kfree(b);
+               goto out;
+       }
+       per_cpu(threshold_banks, cpu)[bank] = b;
+      out:
+       return err;
+}
+
+/* create dir/files for all valid threshold banks */
+static __cpuinit int threshold_create_device(unsigned int cpu)
+{
+       int bank;
+       int err = 0;
+
+       per_cpu(device_threshold, cpu).id = cpu;
+       per_cpu(device_threshold, cpu).cls = &threshold_sysclass;
+       err = sysdev_register(&per_cpu(device_threshold, cpu));
+       if (err)
+               goto out;
+
+       for (bank = 0; bank < NR_BANKS; ++bank) {
+               if (!(per_cpu(bank_map, cpu) & 1 << bank))
+                       continue;
+               err = threshold_create_bank(cpu, bank);
+               if (err)
+                       goto out;
+       }
+      out:
+       return err;
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+/*
+ * let's be hotplug friendly.
+ * in case of multiple core processors, the first core always takes ownership
+ *   of shared sysfs dir/files, and rest of the cores will be symlinked to it.
+ */
+
+/* cpu hotplug call removes all symlinks before first core dies */
+static __cpuinit void threshold_remove_bank(unsigned int cpu, int bank)
+{
+       struct threshold_bank *b;
+       char name[16];
+
+       b = per_cpu(threshold_banks, cpu)[bank];
+       if (!b)
+               return;
+       if (shared_bank[bank] && atomic_read(&b->kobj.kref.refcount) > 2) {
+               sprintf(name, "bank%i", bank);
+               sysfs_remove_link(&per_cpu(device_threshold, cpu).kobj, name);
+               per_cpu(threshold_banks, cpu)[bank] = 0;
+       } else {
+               kobject_unregister(&b->kobj);
+               kfree(per_cpu(threshold_banks, cpu)[bank]);
+       }
+}
+
+static __cpuinit void threshold_remove_device(unsigned int cpu)
+{
+       int bank;
+
+       for (bank = 0; bank < NR_BANKS; ++bank) {
+               if (!(per_cpu(bank_map, cpu) & 1 << bank))
+                       continue;
+               threshold_remove_bank(cpu, bank);
+       }
+       sysdev_unregister(&per_cpu(device_threshold, cpu));
+}
+
+/* link all existing siblings when first core comes up */
+static __cpuinit int threshold_create_symlinks(unsigned int cpu)
+{
+       int bank, err = 0;
+       unsigned int lcpu = 0;
+
+       if (cpu_core_id[cpu])
+               return 0;
+       for_each_cpu_mask(lcpu, cpu_core_map[cpu]) {
+               if (lcpu == cpu)
+                       continue;
+               for (bank = 0; bank < NR_BANKS; ++bank) {
+                       if (!(per_cpu(bank_map, cpu) & 1 << bank))
+                               continue;
+                       if (!shared_bank[bank])
+                               continue;
+                       err = threshold_create_bank(lcpu, bank);
+               }
+       }
+       return err;
+}
+
+/* remove all symlinks before first core dies. */
+static __cpuinit void threshold_remove_symlinks(unsigned int cpu)
+{
+       int bank;
+       unsigned int lcpu = 0;
+       if (cpu_core_id[cpu])
+               return;
+       for_each_cpu_mask(lcpu, cpu_core_map[cpu]) {
+               if (lcpu == cpu)
+                       continue;
+               for (bank = 0; bank < NR_BANKS; ++bank) {
+                       if (!(per_cpu(bank_map, cpu) & 1 << bank))
+                               continue;
+                       if (!shared_bank[bank])
+                               continue;
+                       threshold_remove_bank(lcpu, bank);
+               }
+       }
+}
+#else /* !CONFIG_HOTPLUG_CPU */
+static __cpuinit void threshold_create_symlinks(unsigned int cpu)
+{
+}
+static __cpuinit void threshold_remove_symlinks(unsigned int cpu)
+{
+}
+static void threshold_remove_device(unsigned int cpu)
+{
+}
+#endif
+
+/* get notified when a cpu comes on/off */
+static __cpuinit int threshold_cpu_callback(struct notifier_block *nfb,
+                                           unsigned long action, void *hcpu)
+{
+       /* cpu was unsigned int to begin with */
+       unsigned int cpu = (unsigned long)hcpu;
+
+       if (cpu >= NR_CPUS)
+               goto out;
+
+       switch (action) {
+       case CPU_ONLINE:
+               threshold_create_device(cpu);
+               threshold_create_symlinks(cpu);
+               break;
+       case CPU_DOWN_PREPARE:
+               threshold_remove_symlinks(cpu);
+               break;
+       case CPU_DOWN_FAILED:
+               threshold_create_symlinks(cpu);
+               break;
+       case CPU_DEAD:
+               threshold_remove_device(cpu);
+               break;
+       default:
+               break;
+       }
+      out:
+       return NOTIFY_OK;
+}
+
+static struct notifier_block threshold_cpu_notifier = {
+       .notifier_call = threshold_cpu_callback,
+};
+
+static __init int threshold_init_device(void)
+{
+       int err;
+       int lcpu = 0;
+
+       err = sysdev_class_register(&threshold_sysclass);
+       if (err)
+               goto out;
+
+       /* to hit CPUs online before the notifier is up */
+       for_each_online_cpu(lcpu) {
+               err = threshold_create_device(lcpu);
+               if (err)
+                       goto out;
+       }
+       register_cpu_notifier(&threshold_cpu_notifier);
+
+      out:
+       return err;
+}
+
+device_initcall(threshold_init_device);
index f16d38d09dafeadcafc6d1e6413617c96eeeb8d4..1105250bf02c3ee26d8b1f8a54ab78904e85ca5a 100644 (file)
@@ -42,7 +42,7 @@ int acpi_found_madt;
  * Various Linux-internal data structures created from the
  * MP-table.
  */
-int apic_version [MAX_APICS];
+unsigned char apic_version [MAX_APICS];
 unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
 int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
 
@@ -65,7 +65,9 @@ unsigned long mp_lapic_addr = 0;
 /* Processor that is doing the boot up */
 unsigned int boot_cpu_id = -1U;
 /* Internal processor count */
-static unsigned int num_processors = 0;
+unsigned int num_processors __initdata = 0;
+
+unsigned disabled_cpus __initdata;
 
 /* Bitmask of physically existing CPUs */
 physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE;
@@ -106,11 +108,14 @@ static int __init mpf_checksum(unsigned char *mp, int len)
 
 static void __init MP_processor_info (struct mpc_config_processor *m)
 {
-       int ver, cpu;
+       int cpu;
+       unsigned char ver;
        static int found_bsp=0;
 
-       if (!(m->mpc_cpuflag & CPU_ENABLED))
+       if (!(m->mpc_cpuflag & CPU_ENABLED)) {
+               disabled_cpus++;
                return;
+       }
 
        printk(KERN_INFO "Processor #%d %d:%d APIC version %d\n",
                m->mpc_apicid,
@@ -129,12 +134,14 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
        }
 
        cpu = num_processors++;
-
-       if (m->mpc_apicid > MAX_APICS) {
+       
+#if MAX_APICS < 255    
+       if ((int)m->mpc_apicid > MAX_APICS) {
                printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
                        m->mpc_apicid, MAX_APICS);
                return;
        }
+#endif
        ver = m->mpc_apicver;
 
        physid_set(m->mpc_apicid, phys_cpu_present_map);
@@ -218,7 +225,7 @@ static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
                        m->mpc_irqtype, m->mpc_irqflag & 3,
                        (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
                        m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
-       if (++mp_irq_entries == MAX_IRQ_SOURCES)
+       if (++mp_irq_entries >= MAX_IRQ_SOURCES)
                panic("Max # of irq sources exceeded!!\n");
 }
 
@@ -549,7 +556,7 @@ void __init get_smp_config (void)
                 * Read the physical hardware table.  Anything here will
                 * override the defaults.
                 */
-               if (!smp_read_mpc((void *)(unsigned long)mpf->mpf_physptr)) {
+               if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr))) {
                        smp_found_config = 0;
                        printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
                        printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
index 88be97c96987ad17edc63673b1134ffa4864b896..2e28e855ec3cff500847957a51251368407fbea3 100644 (file)
@@ -220,6 +220,12 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
           uses the normal dma_mask for alloc_coherent. */
        dma_mask &= *dev->dma_mask;
 
+       /* Why <=? Even when the mask is smaller than 4GB it is often larger 
+          than 16MB and in this case we have a chance of finding fitting memory 
+          in the next higher zone first. If not retry with true GFP_DMA. -AK */
+       if (dma_mask <= 0xffffffff)
+               gfp |= GFP_DMA32;
+
  again:
        memory = dma_alloc_pages(dev, gfp, get_order(size));
        if (memory == NULL)
@@ -245,7 +251,7 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
                                }
 
                                if (!(gfp & GFP_DMA)) { 
-                                       gfp |= GFP_DMA; 
+                                       gfp = (gfp & ~GFP_DMA32) | GFP_DMA;
                                        goto again;
                                }
                                return NULL;
index 59be85d9a4bc166284ac102aea770d52c77a69cf..5afd63e8cef7ab9c9a71bb1f35df69a738ce90d5 100644 (file)
@@ -144,7 +144,8 @@ void cpu_idle_wait(void)
        do {
                ssleep(1);
                for_each_online_cpu(cpu) {
-                       if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
+                       if (cpu_isset(cpu, map) &&
+                                       !per_cpu(cpu_idle_state, cpu))
                                cpu_clear(cpu, map);
                }
                cpus_and(map, map, cpu_online_map);
@@ -275,7 +276,8 @@ void __show_regs(struct pt_regs * regs)
                system_utsname.version);
        printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
        printk_address(regs->rip); 
-       printk("\nRSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss, regs->rsp, regs->eflags);
+       printk("\nRSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss, regs->rsp,
+               regs->eflags);
        printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
               regs->rax, regs->rbx, regs->rcx);
        printk("RDX: %016lx RSI: %016lx RDI: %016lx\n",
@@ -427,15 +429,14 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp,
        struct pt_regs * childregs;
        struct task_struct *me = current;
 
-       childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
-
+       childregs = ((struct pt_regs *)
+                       (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
        *childregs = *regs;
 
        childregs->rax = 0;
        childregs->rsp = rsp;
-       if (rsp == ~0UL) {
+       if (rsp == ~0UL)
                childregs->rsp = (unsigned long)childregs;
-       }
 
        p->thread.rsp = (unsigned long) childregs;
        p->thread.rsp0 = (unsigned long) (childregs+1);
@@ -457,7 +458,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp,
                        p->thread.io_bitmap_max = 0;
                        return -ENOMEM;
                }
-               memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr, IO_BITMAP_BYTES);
+               memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
+                               IO_BITMAP_BYTES);
        } 
 
        /*
@@ -494,7 +496,8 @@ out:
  * - fold all the options into a flag word and test it with a single test.
  * - could test fs/gs bitsliced
  */
-struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
+struct task_struct *
+__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
 {
        struct thread_struct *prev = &prev_p->thread,
                                 *next = &next_p->thread;
@@ -565,7 +568,8 @@ struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct *
        prev->userrsp = read_pda(oldrsp); 
        write_pda(oldrsp, next->userrsp); 
        write_pda(pcurrent, next_p); 
-       write_pda(kernelstack, (unsigned long)next_p->thread_info + THREAD_SIZE - PDA_STACKOFFSET);
+       write_pda(kernelstack,
+           (unsigned long)next_p->thread_info + THREAD_SIZE - PDA_STACKOFFSET);
 
        /*
         * Now maybe reload the debug registers
@@ -646,7 +650,9 @@ asmlinkage long sys_fork(struct pt_regs *regs)
        return do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL);
 }
 
-asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
+asmlinkage long
+sys_clone(unsigned long clone_flags, unsigned long newsp,
+         void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
 {
        if (!newsp)
                newsp = regs->rsp;
@@ -682,7 +688,8 @@ unsigned long get_wchan(struct task_struct *p)
                return 0;
        fp = *(u64 *)(p->thread.rsp);
        do { 
-               if (fp < (unsigned long)stack || fp > (unsigned long)stack+THREAD_SIZE)
+               if (fp < (unsigned long)stack ||
+                   fp > (unsigned long)stack+THREAD_SIZE)
                        return 0; 
                rip = *(u64 *)(fp+8); 
                if (!in_sched_functions(rip))
@@ -717,8 +724,8 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
                        task->thread.gsindex = 0;
                        task->thread.gs = addr;
                        if (doit) {
-               load_gs_index(0);
-               ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); 
+                               load_gs_index(0);
+                               ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
                        } 
                }
                put_cpu();
@@ -735,7 +742,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
                        set_32bit_tls(task, FS_TLS, addr);
                        if (doit) { 
                                load_TLS(&task->thread, cpu); 
-                               asm volatile("movl %0,%%fs" :: "r" (FS_TLS_SEL));
+                               asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
                        }
                        task->thread.fsindex = FS_TLS_SEL;
                        task->thread.fs = 0;
@@ -745,8 +752,8 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
                        if (doit) {
                                /* set the selector to 0 to not confuse
                                   __switch_to */
-               asm volatile("movl %0,%%fs" :: "r" (0));
-               ret = checking_wrmsrl(MSR_FS_BASE, addr); 
+                               asm volatile("movl %0,%%fs" :: "r" (0));
+                               ret = checking_wrmsrl(MSR_FS_BASE, addr);
                        }
                }
                put_cpu();
@@ -755,9 +762,9 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
                unsigned long base; 
                if (task->thread.fsindex == FS_TLS_SEL)
                        base = read_32bit_tls(task, FS_TLS);
-               else if (doit) {
+               else if (doit)
                        rdmsrl(MSR_FS_BASE, base);
-               else
+               else
                        base = task->thread.fs;
                ret = put_user(base, (unsigned long __user *)addr); 
                break; 
@@ -766,9 +773,9 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
                unsigned long base;
                if (task->thread.gsindex == GS_TLS_SEL)
                        base = read_32bit_tls(task, GS_TLS);
-               else if (doit) {
+               else if (doit)
                        rdmsrl(MSR_KERNEL_GS_BASE, base);
-               else
+               else
                        base = task->thread.gs;
                ret = put_user(base, (unsigned long __user *)addr); 
                break;
index 47f95687905fd22d417d54632a40b784d186ed82..75235ed2b31bd61b630a30e0640b97ee674a3981 100644 (file)
@@ -77,6 +77,7 @@ static inline void kb_wait(void)
 
 void machine_shutdown(void)
 {
+       unsigned long flags;
        /* Stop the cpus and apics */
 #ifdef CONFIG_SMP
        int reboot_cpu_id;
@@ -98,7 +99,7 @@ void machine_shutdown(void)
        smp_send_stop();
 #endif
 
-       local_irq_disable();
+       local_irq_save(flags);
 
 #ifndef CONFIG_SMP
        disable_local_APIC();
@@ -106,7 +107,7 @@ void machine_shutdown(void)
 
        disable_IO_APIC();
 
-       local_irq_enable();
+       local_irq_restore(flags);
 }
 
 void machine_emergency_restart(void)
@@ -120,7 +121,7 @@ void machine_emergency_restart(void)
                /* Could also try the reset bit in the Hammer NB */
                switch (reboot_type) { 
                case BOOT_KBD:
-               for (i=0; i<100; i++) {
+               for (i=0; i<10; i++) {
                        kb_wait();
                        udelay(50);
                        outb(0xfe,0x64);         /* pulse reset low */
index da0bc3e7bdf5cfbd7394c612f25836110fdd2816..750e01dcbdf49f364940c87f5ab6b4bc158d460a 100644 (file)
@@ -60,6 +60,7 @@
 #include <asm/setup.h>
 #include <asm/mach_apic.h>
 #include <asm/numa.h>
+#include <asm/sections.h>
 
 /*
  * Machine setup..
@@ -103,7 +104,6 @@ struct edid_info edid_info;
 struct e820map e820;
 
 extern int root_mountflags;
-extern char _text, _etext, _edata, _end;
 
 char command_line[COMMAND_LINE_SIZE];
 
@@ -412,7 +412,6 @@ contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
 {
        unsigned long bootmap_size, bootmap;
 
-       memory_present(0, start_pfn, end_pfn);
        bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
        bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size);
        if (bootmap == -1L)
@@ -571,6 +570,8 @@ void __init setup_arch(char **cmdline_p)
 
        init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
 
+       zap_low_mappings(0);
+
 #ifdef CONFIG_ACPI
        /*
         * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
@@ -657,8 +658,6 @@ void __init setup_arch(char **cmdline_p)
        }
 #endif
 
-       sparse_init();
-
        paging_init();
 
        check_ioapic();
@@ -793,7 +792,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
 #endif
 
        bits = 0;
-       while ((1 << bits) < c->x86_num_cores)
+       while ((1 << bits) < c->x86_max_cores)
                bits++;
 
        /* Low order bits define the core id (index of core in socket) */
@@ -823,10 +822,10 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
                if (!node_online(node))
                        node = nearby_node(apicid);
        }
-       cpu_to_node[cpu] = node;
+       numa_set_node(cpu, node);
 
        printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
-                       cpu, c->x86_num_cores, node, cpu_core_id[cpu]);
+                       cpu, c->x86_max_cores, node, cpu_core_id[cpu]);
 #endif
 #endif
 }
@@ -875,9 +874,9 @@ static int __init init_amd(struct cpuinfo_x86 *c)
        display_cacheinfo(c);
 
        if (c->extended_cpuid_level >= 0x80000008) {
-               c->x86_num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
-               if (c->x86_num_cores & (c->x86_num_cores - 1))
-                       c->x86_num_cores = 1;
+               c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
+               if (c->x86_max_cores & (c->x86_max_cores - 1))
+                       c->x86_max_cores = 1;
 
                amd_detect_cmp(c);
        }
@@ -889,54 +888,44 @@ static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
 {
 #ifdef CONFIG_SMP
        u32     eax, ebx, ecx, edx;
-       int     index_msb, tmp;
+       int     index_msb, core_bits;
        int     cpu = smp_processor_id();
-       
+
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+
+       c->apicid = phys_pkg_id(0);
+
        if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
                return;
 
-       cpuid(1, &eax, &ebx, &ecx, &edx);
        smp_num_siblings = (ebx & 0xff0000) >> 16;
-       
+
        if (smp_num_siblings == 1) {
                printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-       } else if (smp_num_siblings > 1) {
-               index_msb = 31;
-               /*
-                * At this point we only support two siblings per
-                * processor package.
-                */
+       } else if (smp_num_siblings > 1 ) {
+
                if (smp_num_siblings > NR_CPUS) {
                        printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
                        smp_num_siblings = 1;
                        return;
                }
-               tmp = smp_num_siblings;
-               while ((tmp & 0x80000000 ) == 0) {
-                       tmp <<=1 ;
-                       index_msb--;
-               }
-               if (smp_num_siblings & (smp_num_siblings - 1))
-                       index_msb++;
+
+               index_msb = get_count_order(smp_num_siblings);
                phys_proc_id[cpu] = phys_pkg_id(index_msb);
-               
+
                printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
                       phys_proc_id[cpu]);
 
-               smp_num_siblings = smp_num_siblings / c->x86_num_cores;
+               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
 
-               tmp = smp_num_siblings;
-               index_msb = 31;
-               while ((tmp & 0x80000000) == 0) {
-                       tmp <<=1 ;
-                       index_msb--;
-               }
-               if (smp_num_siblings & (smp_num_siblings - 1))
-                       index_msb++;
+               index_msb = get_count_order(smp_num_siblings) ;
 
-               cpu_core_id[cpu] = phys_pkg_id(index_msb);
+               core_bits = get_count_order(c->x86_max_cores);
 
-               if (c->x86_num_cores > 1)
+               cpu_core_id[cpu] = phys_pkg_id(index_msb) &
+                                              ((1 << core_bits) - 1);
+
+               if (c->x86_max_cores > 1)
                        printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
                               cpu_core_id[cpu]);
        }
@@ -975,7 +964,7 @@ static void srat_detect_node(void)
        node = apicid_to_node[hard_smp_processor_id()];
        if (node == NUMA_NO_NODE)
                node = 0;
-       cpu_to_node[cpu] = node;
+       numa_set_node(cpu, node);
 
        if (acpi_numa > 0)
                printk(KERN_INFO "CPU %d -> Node %d\n", cpu, node);
@@ -993,13 +982,18 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
                unsigned eax = cpuid_eax(0x80000008);
                c->x86_virt_bits = (eax >> 8) & 0xff;
                c->x86_phys_bits = eax & 0xff;
+               /* CPUID workaround for Intel 0F34 CPU */
+               if (c->x86_vendor == X86_VENDOR_INTEL &&
+                   c->x86 == 0xF && c->x86_model == 0x3 &&
+                   c->x86_mask == 0x4)
+                       c->x86_phys_bits = 36;
        }
 
        if (c->x86 == 15)
                c->x86_cache_alignment = c->x86_clflush_size * 2;
        if (c->x86 >= 15)
                set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-       c->x86_num_cores = intel_num_cpu_cores(c);
+       c->x86_max_cores = intel_num_cpu_cores(c);
 
        srat_detect_node();
 }
@@ -1037,7 +1031,7 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
        c->x86_model_id[0] = '\0';  /* Unset */
        c->x86_clflush_size = 64;
        c->x86_cache_alignment = c->x86_clflush_size;
-       c->x86_num_cores = 1;
+       c->x86_max_cores = 1;
        c->extended_cpuid_level = 0;
        memset(&c->x86_capability, 0, sizeof c->x86_capability);
 
@@ -1060,10 +1054,10 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
                c->x86 = (tfms >> 8) & 0xf;
                c->x86_model = (tfms >> 4) & 0xf;
                c->x86_mask = tfms & 0xf;
-               if (c->x86 == 0xf) {
+               if (c->x86 == 0xf)
                        c->x86 += (tfms >> 20) & 0xff;
+               if (c->x86 >= 0x6)
                        c->x86_model += ((tfms >> 16) & 0xF) << 4;
-               } 
                if (c->x86_capability[0] & (1<<19)) 
                        c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
        } else {
@@ -1271,13 +1265,12 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
        
 #ifdef CONFIG_SMP
-       if (smp_num_siblings * c->x86_num_cores > 1) {
+       if (smp_num_siblings * c->x86_max_cores > 1) {
                int cpu = c - cpu_data;
                seq_printf(m, "physical id\t: %d\n", phys_proc_id[cpu]);
-               seq_printf(m, "siblings\t: %d\n",
-                               c->x86_num_cores * smp_num_siblings);
+               seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
                seq_printf(m, "core id\t\t: %d\n", cpu_core_id[cpu]);
-               seq_printf(m, "cpu cores\t: %d\n", c->x86_num_cores);
+               seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
        }
 #endif 
 
index 79190891fbc56414ad65245f799d13d454002356..06dc354375c3fa684e5d7cbe16e74ec69a4a16f5 100644 (file)
@@ -141,7 +141,6 @@ void pda_init(int cpu)
                        panic("cannot allocate irqstack for cpu %d", cpu); 
        }
 
-       asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
 
        pda->irqstackptr += IRQSTACKSIZE-64;
 } 
@@ -197,6 +196,7 @@ void __cpuinit cpu_init (void)
        /* CPU 0 is initialised in head64.c */
        if (cpu != 0) {
                pda_init(cpu);
+               zap_low_mappings(cpu);
        } else 
                estacks = boot_exception_stacks; 
 
index d642fbf3da29d7823cd2a22f4329858aad7d76f3..5876df116c9225ef449e58a3d06e3de9b66c6445 100644 (file)
@@ -110,6 +110,15 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, unsigned
        COPY(r14);
        COPY(r15);
 
+       /* Kernel saves and restores only the CS segment register on signals,
+        * which is the bare minimum needed to allow mixed 32/64-bit code.
+        * App's signal handler can save/restore other segments if needed. */
+       {
+               unsigned cs;
+               err |= __get_user(cs, &sc->cs);
+               regs->cs = cs | 3;      /* Force into user mode */
+       }
+
        {
                unsigned int tmpflags;
                err |= __get_user(tmpflags, &sc->eflags);
@@ -187,6 +196,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned lo
 {
        int err = 0;
 
+       err |= __put_user(regs->cs, &sc->cs);
        err |= __put_user(0, &sc->gs);
        err |= __put_user(0, &sc->fs);
 
@@ -318,7 +328,14 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        regs->rsp = (unsigned long)frame;
 
+       /* Set up the CS register to run signal handlers in 64-bit mode,
+          even if the handler happens to be interrupting 32-bit code. */
+       regs->cs = __USER_CS;
+
+       /* This, by contrast, has nothing to do with segment registers -
+          see include/asm-x86_64/uaccess.h for details. */
        set_fs(USER_DS);
+
        regs->eflags &= ~TF_MASK;
        if (test_thread_flag(TIF_SINGLESTEP))
                ptrace_notify(SIGTRAP);
index 9db9dda161b40fe59df298406518bb4a867b0b61..cfc3d9dccbd9151d0d7ddc47b0fe87802bf7b003 100644 (file)
@@ -28,8 +28,6 @@
 #include <asm/proto.h>
 #include <asm/apicdef.h>
 
-#define __cpuinit __init
-
 /*
  *     Smarter SMP flushing macros. 
  *             c/o Linus Torvalds.
@@ -452,13 +450,14 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
 
 void smp_stop_cpu(void)
 {
+       unsigned long flags;
        /*
         * Remove this CPU:
         */
        cpu_clear(smp_processor_id(), cpu_online_map);
-       local_irq_disable();
+       local_irq_save(flags);
        disable_local_APIC();
-       local_irq_enable(); 
+       local_irq_restore(flags);
 }
 
 static void smp_really_stop_cpu(void *dummy)
index c4e59bbdc1872b4ce599f452b125183603cf8f8e..683c33f7b96753219a2c1043246dcdfac12b999e 100644 (file)
@@ -64,6 +64,7 @@
 int smp_num_siblings = 1;
 /* Package ID of each logical CPU */
 u8 phys_proc_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
+/* core ID of each logical CPU */
 u8 cpu_core_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
 
 /* Bitmask of currently online CPUs */
@@ -87,7 +88,10 @@ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
 /* Set when the idlers are all forked */
 int smp_threads_ready;
 
+/* representing HT siblings of each logical CPU */
 cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
+
+/* representing HT and core siblings of each logical CPU */
 cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
 EXPORT_SYMBOL(cpu_core_map);
 
@@ -434,30 +438,59 @@ void __cpuinit smp_callin(void)
        cpu_set(cpuid, cpu_callin_map);
 }
 
+/* representing cpus for which sibling maps can be computed */
+static cpumask_t cpu_sibling_setup_map;
+
 static inline void set_cpu_sibling_map(int cpu)
 {
        int i;
+       struct cpuinfo_x86 *c = cpu_data;
+
+       cpu_set(cpu, cpu_sibling_setup_map);
 
        if (smp_num_siblings > 1) {
-               for_each_cpu(i) {
-                       if (cpu_core_id[cpu] == cpu_core_id[i]) {
+               for_each_cpu_mask(i, cpu_sibling_setup_map) {
+                       if (phys_proc_id[cpu] == phys_proc_id[i] &&
+                           cpu_core_id[cpu] == cpu_core_id[i]) {
                                cpu_set(i, cpu_sibling_map[cpu]);
                                cpu_set(cpu, cpu_sibling_map[i]);
+                               cpu_set(i, cpu_core_map[cpu]);
+                               cpu_set(cpu, cpu_core_map[i]);
                        }
                }
        } else {
                cpu_set(cpu, cpu_sibling_map[cpu]);
        }
 
-       if (current_cpu_data.x86_num_cores > 1) {
-               for_each_cpu(i) {
-                       if (phys_proc_id[cpu] == phys_proc_id[i]) {
-                               cpu_set(i, cpu_core_map[cpu]);
-                               cpu_set(cpu, cpu_core_map[i]);
-                       }
-               }
-       } else {
+       if (current_cpu_data.x86_max_cores == 1) {
                cpu_core_map[cpu] = cpu_sibling_map[cpu];
+               c[cpu].booted_cores = 1;
+               return;
+       }
+
+       for_each_cpu_mask(i, cpu_sibling_setup_map) {
+               if (phys_proc_id[cpu] == phys_proc_id[i]) {
+                       cpu_set(i, cpu_core_map[cpu]);
+                       cpu_set(cpu, cpu_core_map[i]);
+                       /*
+                        *  Does this new cpu bringup a new core?
+                        */
+                       if (cpus_weight(cpu_sibling_map[cpu]) == 1) {
+                               /*
+                                * for each core in package, increment
+                                * the booted_cores for this new cpu
+                                */
+                               if (first_cpu(cpu_sibling_map[i]) == i)
+                                       c[cpu].booted_cores++;
+                               /*
+                                * increment the core count for all
+                                * the other cpus in this package
+                                */
+                               if (i != cpu)
+                                       c[i].booted_cores++;
+                       } else if (i != cpu && !c[cpu].booted_cores)
+                               c[cpu].booted_cores = c[i].booted_cores;
+               }
        }
 }
 
@@ -879,6 +912,9 @@ static __init void disable_smp(void)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
+
+int additional_cpus __initdata = -1;
+
 /*
  * cpu_possible_map should be static, it cannot change as cpu's
  * are onlined, or offlined. The reason is per-cpu data-structures
@@ -887,14 +923,38 @@ static __init void disable_smp(void)
  * cpu_present_map on the other hand can change dynamically.
  * In case when cpu_hotplug is not compiled, then we resort to current
  * behaviour, which is cpu_possible == cpu_present.
- * If cpu-hotplug is supported, then we need to preallocate for all
- * those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
  * - Ashok Raj
+ *
+ * Three ways to find out the number of additional hotplug CPUs:
+ * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
+ * - otherwise use half of the available CPUs or 2, whatever is more.
+ * - The user can overwrite it with additional_cpus=NUM
+ * We do this because additional CPUs waste a lot of memory.
+ * -AK
  */
 __init void prefill_possible_map(void)
 {
        int i;
-       for (i = 0; i < NR_CPUS; i++)
+       int possible;
+
+       if (additional_cpus == -1) {
+               if (disabled_cpus > 0) {
+                       additional_cpus = disabled_cpus;
+               } else {
+                       additional_cpus = num_processors / 2;
+                       if (additional_cpus == 0)
+                               additional_cpus = 2;
+               }
+       }
+       possible = num_processors + additional_cpus;
+       if (possible > NR_CPUS) 
+               possible = NR_CPUS;
+
+       printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n",
+               possible,
+               max_t(int, possible - num_processors, 0));
+
+       for (i = 0; i < possible; i++)
                cpu_set(i, cpu_possible_map);
 }
 #endif
@@ -965,6 +1025,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
        nmi_watchdog_default();
        current_cpu_data = boot_cpu_data;
        current_thread_info()->cpu = 0;  /* needed? */
+       set_cpu_sibling_map(0);
 
        if (smp_sanity_check(max_cpus) < 0) {
                printk(KERN_INFO "SMP disabled\n");
@@ -1008,8 +1069,6 @@ void __init smp_prepare_boot_cpu(void)
        int me = smp_processor_id();
        cpu_set(me, cpu_online_map);
        cpu_set(me, cpu_callout_map);
-       cpu_set(0, cpu_sibling_map[0]);
-       cpu_set(0, cpu_core_map[0]);
        per_cpu(cpu_state, me) = CPU_ONLINE;
 }
 
@@ -1062,9 +1121,6 @@ int __cpuinit __cpu_up(unsigned int cpu)
  */
 void __init smp_cpus_done(unsigned int max_cpus)
 {
-#ifndef CONFIG_HOTPLUG_CPU
-       zap_low_mappings();
-#endif
        smp_cleanup_boot();
 
 #ifdef CONFIG_X86_IO_APIC
@@ -1081,15 +1137,24 @@ void __init smp_cpus_done(unsigned int max_cpus)
 static void remove_siblinginfo(int cpu)
 {
        int sibling;
+       struct cpuinfo_x86 *c = cpu_data;
 
+       for_each_cpu_mask(sibling, cpu_core_map[cpu]) {
+               cpu_clear(cpu, cpu_core_map[sibling]);
+               /*
+                * last thread sibling in this cpu core going down
+                */
+               if (cpus_weight(cpu_sibling_map[cpu]) == 1)
+                       c[sibling].booted_cores--;
+       }
+                       
        for_each_cpu_mask(sibling, cpu_sibling_map[cpu])
                cpu_clear(cpu, cpu_sibling_map[sibling]);
-       for_each_cpu_mask(sibling, cpu_core_map[cpu])
-               cpu_clear(cpu, cpu_core_map[sibling]);
        cpus_clear(cpu_sibling_map[cpu]);
        cpus_clear(cpu_core_map[cpu]);
        phys_proc_id[cpu] = BAD_APICID;
        cpu_core_id[cpu] = BAD_APICID;
+       cpu_clear(cpu, cpu_sibling_setup_map);
 }
 
 void remove_cpu_from_maps(void)
@@ -1153,6 +1218,12 @@ void __cpu_die(unsigned int cpu)
        printk(KERN_ERR "CPU %u didn't die...\n", cpu);
 }
 
+static __init int setup_additional_cpus(char *s)
+{
+       return get_option(&s, &additional_cpus);
+}
+__setup("additional_cpus=", setup_additional_cpus);
+
 #else /* ... !CONFIG_HOTPLUG_CPU */
 
 int __cpu_disable(void)
index cc7821c68851d5334b01359f8dd892a5266fdf0b..6449ea8fe756475b7316bdaa51ddd16e3c2c6dd9 100644 (file)
@@ -154,17 +154,3 @@ asmlinkage long sys_uname(struct new_utsname __user * name)
                err |= copy_to_user(&name->machine, "i686", 5);                 
        return err ? -EFAULT : 0;
 }
-
-asmlinkage long sys_time64(long __user * tloc)
-{
-       struct timeval now; 
-       int i; 
-
-       do_gettimeofday(&now);
-       i = now.tv_sec;
-       if (tloc) {
-               if (put_user(i,tloc))
-                       i = -EFAULT;
-       }
-       return i;
-}
index b5e09e6b55368fbd58572ac8c775bd1fc77ab4a7..bf337f493189535f12f47f40b1ff93a94f4b26ff 100644 (file)
@@ -428,19 +428,6 @@ static void __kprobes do_trap(int trapnr, int signr, char *str,
 {
        conditional_sti(regs);
 
-#ifdef CONFIG_CHECKING
-       { 
-               unsigned long gs; 
-               struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); 
-               rdmsrl(MSR_GS_BASE, gs); 
-               if (gs != (unsigned long)pda) { 
-                       wrmsrl(MSR_GS_BASE, pda); 
-                       printk("%s: wrong gs %lx expected %p rip %lx\n", str, gs, pda,
-                             regs->rip);
-               }
-       }
-#endif
-
        if (user_mode(regs)) {
                struct task_struct *tsk = current;
 
@@ -513,20 +500,6 @@ asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
 {
        conditional_sti(regs);
 
-#ifdef CONFIG_CHECKING
-       { 
-               unsigned long gs; 
-               struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); 
-               rdmsrl(MSR_GS_BASE, gs); 
-               if (gs != (unsigned long)pda) { 
-                       wrmsrl(MSR_GS_BASE, pda); 
-                      oops_in_progress++;
-                       printk("general protection handler: wrong gs %lx expected %p\n", gs, pda);
-                      oops_in_progress--;
-               }
-       }
-#endif
-
        if (user_mode(regs)) {
                struct task_struct *tsk = current;
 
@@ -665,19 +638,6 @@ asmlinkage void __kprobes do_debug(struct pt_regs * regs,
        struct task_struct *tsk = current;
        siginfo_t info;
 
-#ifdef CONFIG_CHECKING
-       { 
-              /* RED-PEN interaction with debugger - could destroy gs */
-               unsigned long gs; 
-               struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); 
-               rdmsrl(MSR_GS_BASE, gs); 
-               if (gs != (unsigned long)pda) { 
-                       wrmsrl(MSR_GS_BASE, pda); 
-                       printk("debug handler: wrong gs %lx expected %p\n", gs, pda);
-               }
-       }
-#endif
-
        get_debugreg(condition, 6);
 
        if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
@@ -888,6 +848,10 @@ asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
 {
 }
 
+asmlinkage void __attribute__((weak)) mce_threshold_interrupt(void)
+{
+}
+
 /*
  *  'math_state_restore()' saves the current math information in the
  * old math state array, and gets the new ones from the current task
index 6dd642cad2efd0074d2150edebe7d78080836850..58b19215b4b3a3c19adc2a68a3b792b325b555f3 100644 (file)
@@ -50,7 +50,7 @@ SECTIONS
        *(.bss.page_aligned)    
        *(.bss)
        }
-  __bss_end = .;
+  __bss_stop = .;
 
   . = ALIGN(PAGE_SIZE);
   . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
index fd99ddd009bc8834163335a1f779aedfcbaa3cb8..4a54221e10bc39a0371c35090fe4de72f472a70e 100644 (file)
@@ -203,3 +203,6 @@ EXPORT_SYMBOL(flush_tlb_page);
 #endif
 
 EXPORT_SYMBOL(cpu_khz);
+
+EXPORT_SYMBOL(load_gs_index);
+
index 30a9da458c152b8f1c426258ecf26fe4ea02e977..43d9fa136180f7376d6e45e0803fdd290c3a3ac7 100644 (file)
@@ -5,46 +5,8 @@
        .globl clear_page
        .p2align 4
 clear_page:
-       xorl   %eax,%eax
-       movl   $4096/64,%ecx
-       .p2align 4
-.Lloop:
-       decl    %ecx
-#define PUT(x) movq %rax,x*8(%rdi) 
-       movq %rax,(%rdi)
-       PUT(1)
-       PUT(2)
-       PUT(3)
-       PUT(4)
-       PUT(5)
-       PUT(6)
-       PUT(7)
-       leaq    64(%rdi),%rdi
-       jnz     .Lloop
-       nop
-       ret
-clear_page_end:        
-       
-       /* C stepping K8 run faster using the string instructions.
-          It is also a lot simpler. Use this when possible */
-       
-#include <asm/cpufeature.h>
-               
-       .section .altinstructions,"a"
-       .align 8
-       .quad  clear_page
-       .quad  clear_page_c
-       .byte  X86_FEATURE_K8_C
-       .byte  clear_page_end-clear_page        
-       .byte  clear_page_c_end-clear_page_c
-       .previous
-
-       .section .altinstr_replacement,"ax"
-clear_page_c:
        movl $4096/8,%ecx
        xorl %eax,%eax
        rep 
        stosq
        ret
-clear_page_c_end:
-       .previous
index dd3aa47b6bf51d09fcb24dc8b8affe4a7e3e7ed5..621a19769406c2f25dbd4b04bc578027e6c03958 100644 (file)
@@ -8,94 +8,7 @@
        .globl copy_page
        .p2align 4
 copy_page:
-       subq    $3*8,%rsp
-       movq    %rbx,(%rsp)
-       movq    %r12,1*8(%rsp)
-       movq    %r13,2*8(%rsp)
-                       
-       movl    $(4096/64)-5,%ecx
-       .p2align 4
-.Loop64:       
-       dec     %rcx
-
-       movq        (%rsi), %rax
-       movq      8 (%rsi), %rbx
-       movq     16 (%rsi), %rdx
-       movq     24 (%rsi), %r8
-       movq     32 (%rsi), %r9
-       movq     40 (%rsi), %r10
-       movq     48 (%rsi), %r11
-       movq     56 (%rsi), %r12
-
-       prefetcht0 5*64(%rsi)
-
-       movq     %rax,    (%rdi)
-       movq     %rbx,  8 (%rdi)
-       movq     %rdx, 16 (%rdi)
-       movq     %r8,  24 (%rdi)
-       movq     %r9,  32 (%rdi)
-       movq     %r10, 40 (%rdi)
-       movq     %r11, 48 (%rdi)
-       movq     %r12, 56 (%rdi)
-
-       leaq    64 (%rsi), %rsi
-       leaq    64 (%rdi), %rdi
-
-       jnz     .Loop64
-
-       movl    $5,%ecx
-       .p2align 4
-.Loop2:        
-       decl   %ecx
-
-       movq        (%rsi), %rax
-       movq      8 (%rsi), %rbx
-       movq     16 (%rsi), %rdx
-       movq     24 (%rsi), %r8
-       movq     32 (%rsi), %r9
-       movq     40 (%rsi), %r10
-       movq     48 (%rsi), %r11
-       movq     56 (%rsi), %r12
-
-       movq     %rax,    (%rdi)
-       movq     %rbx,  8 (%rdi)
-       movq     %rdx, 16 (%rdi)
-       movq     %r8,  24 (%rdi)
-       movq     %r9,  32 (%rdi)
-       movq     %r10, 40 (%rdi)
-       movq     %r11, 48 (%rdi)
-       movq     %r12, 56 (%rdi)
-       
-       leaq    64(%rdi),%rdi                   
-       leaq    64(%rsi),%rsi                   
-       
-       jnz     .Loop2          
-       
-       movq    (%rsp),%rbx
-       movq    1*8(%rsp),%r12
-       movq    2*8(%rsp),%r13
-       addq    $3*8,%rsp
-       ret
-       
-       /* C stepping K8 run faster using the string copy instructions.
-          It is also a lot simpler. Use this when possible */
-
-#include <asm/cpufeature.h>            
-               
-       .section .altinstructions,"a"
-       .align 8
-       .quad  copy_page
-       .quad  copy_page_c
-       .byte  X86_FEATURE_K8_C
-       .byte  copy_page_c_end-copy_page_c
-       .byte  copy_page_c_end-copy_page_c
-       .previous
-
-       .section .altinstr_replacement,"ax"
-copy_page_c:
        movl $4096/8,%ecx
        rep 
        movsq 
        ret
-copy_page_c_end:
-       .previous
index c6c46494fef50bec9f061ce6a679d017e90ac921..92dd80544602053fc245b5112bd55f7184315e2e 100644 (file)
@@ -11,6 +11,8 @@
  * 
  * Output:
  * rax original destination
+ * 
+ * TODO: check best memcpy for PSC
  */    
 
        .globl __memcpy
        .p2align 4
 __memcpy:
 memcpy:                
-       pushq %rbx
-       movq %rdi,%rax
-
-       movl %edx,%ecx
-       shrl $6,%ecx
-       jz .Lhandle_tail
-       
-       .p2align 4
-.Lloop_64:
-       decl %ecx
-       
-       movq (%rsi),%r11
-       movq 8(%rsi),%r8
-
-       movq %r11,(%rdi)
-       movq %r8,1*8(%rdi)
-
-       movq 2*8(%rsi),%r9
-       movq 3*8(%rsi),%r10
-
-       movq %r9,2*8(%rdi)
-       movq %r10,3*8(%rdi)
-               
-       movq 4*8(%rsi),%r11
-       movq 5*8(%rsi),%r8
-
-       movq %r11,4*8(%rdi)
-       movq %r8,5*8(%rdi)
-
-       movq 6*8(%rsi),%r9
-       movq 7*8(%rsi),%r10
-
-       movq %r9,6*8(%rdi)
-       movq %r10,7*8(%rdi)
-
-       leaq 64(%rsi),%rsi
-       leaq 64(%rdi),%rdi
-       jnz  .Lloop_64
-
-.Lhandle_tail:
-       movl %edx,%ecx
-       andl $63,%ecx
-       shrl $3,%ecx
-       jz   .Lhandle_7
-       .p2align 4
-.Lloop_8: 
-       decl %ecx
-       movq (%rsi),%r8
-       movq %r8,(%rdi) 
-       leaq 8(%rdi),%rdi
-       leaq 8(%rsi),%rsi
-       jnz  .Lloop_8
-
-.Lhandle_7:
-       movl %edx,%ecx
-       andl $7,%ecx
-       jz .Lende
-       .p2align 4
-.Lloop_1:
-       movb (%rsi),%r8b
-       movb %r8b,(%rdi) 
-       incq %rdi
-       incq %rsi
-       decl %ecx
-       jnz .Lloop_1
-       
-.Lende:        
-       popq %rbx
-       ret
-.Lfinal:
-       
-       /* C stepping K8 run faster using the string copy instructions.
-          It is also a lot simpler. Use this when possible */
-       
-       .section .altinstructions,"a"
-       .align 8
-       .quad  memcpy
-       .quad  memcpy_c
-       .byte  X86_FEATURE_K8_C
-       .byte  .Lfinal-memcpy
-       .byte  memcpy_c_end-memcpy_c    
-       .previous
-
-       .section .altinstr_replacement,"ax"
- /* rdi        destination
-  * rsi source
-  * rdx count
-  */                   
-memcpy_c:
        movq %rdi,%rax
        movl %edx,%ecx
        shrl $3,%ecx
@@ -117,5 +30,3 @@ memcpy_c:
        rep
        movsb
        ret
-memcpy_c_end:
-       .previous
index 4b4c40638640ee8128510155b36dc5550044098a..2aa48f24ed1e48974680b5354ede86e826d5f0a4 100644 (file)
        .p2align 4
 memset:        
 __memset:
-       movq %rdi,%r10
-       movq %rdx,%r11
-
-       /* expand byte value  */
-       movzbl %sil,%ecx
-       movabs $0x0101010101010101,%rax
-       mul    %rcx             /* with rax, clobbers rdx */
-
-       /* align dst */
-       movl  %edi,%r9d         
-       andl  $7,%r9d   
-       jnz  .Lbad_alignment
-.Lafter_bad_alignment:
-       
-       movl %r11d,%ecx
-       shrl $6,%ecx
-       jz       .Lhandle_tail
-
-       .p2align 4
-.Lloop_64:     
-       decl   %ecx
-       movq  %rax,(%rdi) 
-       movq  %rax,8(%rdi) 
-       movq  %rax,16(%rdi) 
-       movq  %rax,24(%rdi) 
-       movq  %rax,32(%rdi) 
-       movq  %rax,40(%rdi) 
-       movq  %rax,48(%rdi) 
-       movq  %rax,56(%rdi) 
-       leaq  64(%rdi),%rdi
-       jnz    .Lloop_64
-
-       /* Handle tail in loops. The loops should be faster than hard
-          to predict jump tables. */ 
-       .p2align 4         
-.Lhandle_tail:
-       movl    %r11d,%ecx
-       andl    $63&(~7),%ecx
-       jz              .Lhandle_7
-       shrl    $3,%ecx
-       .p2align 4
-.Lloop_8:
-       decl   %ecx
-       movq  %rax,(%rdi)
-       leaq  8(%rdi),%rdi
-       jnz    .Lloop_8
-
-.Lhandle_7:
-       movl    %r11d,%ecx
-       andl    $7,%ecx
-       jz      .Lende
-       .p2align 4
-.Lloop_1:
-       decl    %ecx
-       movb    %al,(%rdi)
-       leaq    1(%rdi),%rdi
-       jnz     .Lloop_1
-       
-.Lende:        
-       movq    %r10,%rax
-       ret
-
-.Lbad_alignment:
-       cmpq $7,%r11
-       jbe     .Lhandle_7
-       movq %rax,(%rdi)        /* unaligned store */
-       movq $8,%r8                     
-       subq %r9,%r8 
-       addq %r8,%rdi
-       subq %r8,%r11
-       jmp .Lafter_bad_alignment
-
-       /* C stepping K8 run faster using the string instructions.
-          It is also a lot simpler. Use this when possible */
-
-#include <asm/cpufeature.h>    
-               
-       .section .altinstructions,"a"
-       .align 8
-       .quad  memset
-       .quad  memset_c
-       .byte  X86_FEATURE_K8_C
-       .byte  memset_c_end-memset_c
-       .byte  memset_c_end-memset_c
-       .previous
-
-       .section .altinstr_replacement,"ax"
- /* rdi        destination
-  * rsi value
-  * rdx count
-  */                   
-memset_c:      
        movq %rdi,%r9
        movl %edx,%r8d
        andl $7,%r8d            
@@ -121,5 +29,3 @@ memset_c:
        stosb
        movq %r9,%rax
        ret
-memset_c_end:
-       .previous
index b75b872ec154f8e004fc04a29375eb97f7f468bb..3a63707a698ba34d954770d5a5a7b3016ac53c03 100644 (file)
@@ -308,18 +308,6 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
        unsigned long flags;
        siginfo_t info;
 
-#ifdef CONFIG_CHECKING
-       { 
-               unsigned long gs; 
-               struct x8664_pda *pda = cpu_pda + stack_smp_processor_id(); 
-               rdmsrl(MSR_GS_BASE, gs); 
-               if (gs != (unsigned long)pda) { 
-                       wrmsrl(MSR_GS_BASE, pda); 
-                       printk("page_fault: wrong gs %lx expected %p\n", gs, pda);
-               }
-       }
-#endif
-
        /* get the address */
        __asm__("movq %%cr2,%0":"=r" (address));
        if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
@@ -571,3 +559,10 @@ do_sigbus:
        force_sig_info(SIGBUS, &info, tsk);
        return;
 }
+
+static int __init enable_pagefaulttrace(char *str)
+{
+       page_fault_trace = 1;
+       return 0;
+}
+__setup("pagefaulttrace", enable_pagefaulttrace);
index e60a1a848de8f622ce87bd7616b7c32b0dea6e0e..286f6a624c3ace5d3f33c5fb36258979c57dc80f 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/pagemap.h>
 #include <linux/bootmem.h>
 #include <linux/proc_fs.h>
+#include <linux/pci.h>
 
 #include <asm/processor.h>
 #include <asm/system.h>
 #include <asm/mmu_context.h>
 #include <asm/proto.h>
 #include <asm/smp.h>
+#include <asm/sections.h>
 
 #ifndef Dprintk
 #define Dprintk(x...)
 #endif
 
-#ifdef CONFIG_GART_IOMMU
-extern int swiotlb;
-#endif
-
-extern char _stext[];
+static unsigned long dma_reserve __initdata;
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
@@ -86,9 +84,6 @@ void show_mem(void)
 
 /* References to section boundaries */
 
-extern char _text, _etext, _edata, __bss_start, _end[];
-extern char __init_begin, __init_end;
-
 int after_bootmem;
 
 static void *spp_getpage(void)
@@ -308,42 +303,81 @@ void __init init_memory_mapping(unsigned long start, unsigned long end)
               table_end<<PAGE_SHIFT);
 }
 
-extern struct x8664_pda cpu_pda[NR_CPUS];
+void __cpuinit zap_low_mappings(int cpu)
+{
+       if (cpu == 0) {
+               pgd_t *pgd = pgd_offset_k(0UL);
+               pgd_clear(pgd);
+       } else {
+               /*
+                * For AP's, zap the low identity mappings by changing the cr3
+                * to init_level4_pgt and doing local flush tlb all
+                */
+               asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
+       }
+       __flush_tlb_all();
+}
 
-/* Assumes all CPUs still execute in init_mm */
-void zap_low_mappings(void)
+/* Compute zone sizes for the DMA and DMA32 zones in a node. */
+__init void
+size_zones(unsigned long *z, unsigned long *h,
+          unsigned long start_pfn, unsigned long end_pfn)
 {
-       pgd_t *pgd = pgd_offset_k(0UL);
-       pgd_clear(pgd);
-       flush_tlb_all();
+       int i;
+       unsigned long w;
+
+       for (i = 0; i < MAX_NR_ZONES; i++)
+               z[i] = 0;
+
+       if (start_pfn < MAX_DMA_PFN)
+               z[ZONE_DMA] = MAX_DMA_PFN - start_pfn;
+       if (start_pfn < MAX_DMA32_PFN) {
+               unsigned long dma32_pfn = MAX_DMA32_PFN;
+               if (dma32_pfn > end_pfn)
+                       dma32_pfn = end_pfn;
+               z[ZONE_DMA32] = dma32_pfn - start_pfn;
+       }
+       z[ZONE_NORMAL] = end_pfn - start_pfn;
+
+       /* Remove lower zones from higher ones. */
+       w = 0;
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               if (z[i])
+                       z[i] -= w;
+               w += z[i];
+       }
+
+       /* Compute holes */
+       w = 0;
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               unsigned long s = w;
+               w += z[i];
+               h[i] = e820_hole_size(s, w);
+       }
+
+       /* Add the space pace needed for mem_map to the holes too. */
+       for (i = 0; i < MAX_NR_ZONES; i++)
+               h[i] += (z[i] * sizeof(struct page)) / PAGE_SIZE;
+
+       /* The 16MB DMA zone has the kernel and other misc mappings.
+          Account them too */
+       if (h[ZONE_DMA]) {
+               h[ZONE_DMA] += dma_reserve;
+               if (h[ZONE_DMA] >= z[ZONE_DMA]) {
+                       printk(KERN_WARNING
+                               "Kernel too large and filling up ZONE_DMA?\n");
+                       h[ZONE_DMA] = z[ZONE_DMA];
+               }
+       }
 }
 
 #ifndef CONFIG_NUMA
 void __init paging_init(void)
 {
-       {
-               unsigned long zones_size[MAX_NR_ZONES];
-               unsigned long holes[MAX_NR_ZONES];
-               unsigned int max_dma;
-
-               memset(zones_size, 0, sizeof(zones_size));
-               memset(holes, 0, sizeof(holes));
-
-               max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-
-               if (end_pfn < max_dma) {
-                       zones_size[ZONE_DMA] = end_pfn;
-                       holes[ZONE_DMA] = e820_hole_size(0, end_pfn);
-               } else {
-                       zones_size[ZONE_DMA] = max_dma;
-                       holes[ZONE_DMA] = e820_hole_size(0, max_dma);
-                       zones_size[ZONE_NORMAL] = end_pfn - max_dma;
-                       holes[ZONE_NORMAL] = e820_hole_size(max_dma, end_pfn);
-               }
-               free_area_init_node(0, NODE_DATA(0), zones_size,
-                        __pa(PAGE_OFFSET) >> PAGE_SHIFT, holes);
-       }
-       return;
+       unsigned long zones[MAX_NR_ZONES], holes[MAX_NR_ZONES];
+       size_zones(zones, holes, 0, end_pfn);
+       free_area_init_node(0, NODE_DATA(0), zones,
+                           __pa(PAGE_OFFSET) >> PAGE_SHIFT, holes);
 }
 #endif
 
@@ -438,19 +472,16 @@ void __init mem_init(void)
                datasize >> 10,
                initsize >> 10);
 
+#ifdef CONFIG_SMP
        /*
-        * Subtle. SMP is doing its boot stuff late (because it has to
-        * fork idle threads) - but it also needs low mappings for the
-        * protected-mode entry to work. We zap these entries only after
-        * the WP-bit has been tested.
+        * Sync boot_level4_pgt mappings with the init_level4_pgt
+        * except for the low identity mappings which are already zapped
+        * in init_level4_pgt. This sync-up is essential for AP's bringup
         */
-#ifndef CONFIG_SMP
-       zap_low_mappings();
+       memcpy(boot_level4_pgt+1, init_level4_pgt+1, (PTRS_PER_PGD-1)*sizeof(pgd_t));
 #endif
 }
 
-extern char __initdata_begin[], __initdata_end[];
-
 void free_initmem(void)
 {
        unsigned long addr;
@@ -464,7 +495,7 @@ void free_initmem(void)
                totalram_pages++;
        }
        memset(__initdata_begin, 0xba, __initdata_end - __initdata_begin);
-       printk ("Freeing unused kernel memory: %luk freed\n", (&__init_end - &__init_begin) >> 10);
+       printk ("Freeing unused kernel memory: %luk freed\n", (__init_end - __init_begin) >> 10);
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD
@@ -491,6 +522,8 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
 #else                  
        reserve_bootmem(phys, len);    
 #endif
+       if (phys+len <= MAX_DMA_PFN*PAGE_SIZE)
+               dma_reserve += len / PAGE_SIZE;
 }
 
 int kern_addr_valid(unsigned long addr) 
@@ -532,10 +565,6 @@ extern int exception_trace, page_fault_trace;
 static ctl_table debug_table2[] = {
        { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL,
          proc_dointvec },
-#ifdef CONFIG_CHECKING
-       { 100, "page-fault-trace", &page_fault_trace, sizeof(int), 0644, NULL,
-         proc_dointvec },
-#endif
        { 0, }
 }; 
 
index 65417b040c1bffd171f0ce46d590a57e174c742b..a5663e0bb01cad0a23fb9deab8b415829256c10f 100644 (file)
@@ -108,6 +108,7 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
                limit >>= 16; 
                limit <<= 24; 
                limit |= (1<<24)-1;
+               limit++;
 
                if (limit > end_pfn << PAGE_SHIFT)
                        limit = end_pfn << PAGE_SHIFT;
index 2148038210017df1dbdbf4b286079cb4d3ce6a12..a828a01739cc791015d1bd02e8e04a555bdf288f 100644 (file)
@@ -38,38 +38,57 @@ cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly;
 
 int numa_off __initdata;
 
-int __init compute_hash_shift(struct node *nodes, int numnodes)
+
+/*
+ * Given a shift value, try to populate memnodemap[]
+ * Returns :
+ * 1 if OK
+ * 0 if memnodmap[] too small (of shift too small)
+ * -1 if node overlap or lost ram (shift too big)
+ */
+static int __init populate_memnodemap(
+       const struct node *nodes, int numnodes, int shift)
 {
        int i; 
-       int shift = 20;
-       unsigned long addr,maxend=0;
-       
-       for (i = 0; i < numnodes; i++)
-               if ((nodes[i].start != nodes[i].end) && (nodes[i].end > maxend))
-                               maxend = nodes[i].end;
+       int res = -1;
+       unsigned long addr, end;
 
-       while ((1UL << shift) <  (maxend / NODEMAPSIZE))
-               shift++;
-
-       printk (KERN_DEBUG"Using %d for the hash shift. Max adder is %lx \n",
-                       shift,maxend);
-       memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE);
+       memset(memnodemap, 0xff, sizeof(memnodemap));
        for (i = 0; i < numnodes; i++) {
-               if (nodes[i].start == nodes[i].end)
+               addr = nodes[i].start;
+               end = nodes[i].end;
+               if (addr >= end)
                        continue;
-               for (addr = nodes[i].start;
-                    addr < nodes[i].end;
-                    addr += (1UL << shift)) {
-                       if (memnodemap[addr >> shift] != 0xff) {
-                               printk(KERN_INFO
-       "Your memory is not aligned you need to rebuild your kernel "
-       "with a bigger NODEMAPSIZE shift=%d adder=%lu\n",
-                                       shift,addr);
+               if ((end >> shift) >= NODEMAPSIZE)
+                       return 0;
+               do {
+                       if (memnodemap[addr >> shift] != 0xff)
                                return -1;
-                       } 
                        memnodemap[addr >> shift] = i;
-               } 
+                       addr += (1 << shift);
+               } while (addr < end);
+               res = 1;
        } 
+       return res;
+}
+
+int __init compute_hash_shift(struct node *nodes, int numnodes)
+{
+       int shift = 20;
+
+       while (populate_memnodemap(nodes, numnodes, shift + 1) >= 0)
+               shift++;
+
+       printk(KERN_DEBUG "Using %d for the hash shift.\n",
+               shift);
+
+       if (populate_memnodemap(nodes, numnodes, shift) != 1) {
+               printk(KERN_INFO
+       "Your memory is not aligned you need to rebuild your kernel "
+       "with a bigger NODEMAPSIZE shift=%d\n",
+                       shift);
+               return -1;
+       }
        return shift;
 }
 
@@ -94,7 +113,6 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, unsigned long en
        start_pfn = start >> PAGE_SHIFT;
        end_pfn = end >> PAGE_SHIFT;
 
-       memory_present(nodeid, start_pfn, end_pfn);
        nodedata_phys = find_e820_area(start, end, pgdat_size); 
        if (nodedata_phys == -1L) 
                panic("Cannot find memory pgdat in node %d\n", nodeid);
@@ -132,29 +150,14 @@ void __init setup_node_zones(int nodeid)
        unsigned long start_pfn, end_pfn; 
        unsigned long zones[MAX_NR_ZONES];
        unsigned long holes[MAX_NR_ZONES];
-       unsigned long dma_end_pfn;
 
-       memset(zones, 0, sizeof(unsigned long) * MAX_NR_ZONES); 
-       memset(holes, 0, sizeof(unsigned long) * MAX_NR_ZONES);
+       start_pfn = node_start_pfn(nodeid);
+       end_pfn = node_end_pfn(nodeid);
 
-       start_pfn = node_start_pfn(nodeid);
-       end_pfn = node_end_pfn(nodeid);
+       Dprintk(KERN_INFO "setting up node %d %lx-%lx\n",
+               nodeid, start_pfn, end_pfn);
 
-       Dprintk(KERN_INFO "setting up node %d %lx-%lx\n", nodeid, start_pfn, end_pfn);
-       
-       /* All nodes > 0 have a zero length zone DMA */ 
-       dma_end_pfn = __pa(MAX_DMA_ADDRESS) >> PAGE_SHIFT; 
-       if (start_pfn < dma_end_pfn) { 
-               zones[ZONE_DMA] = dma_end_pfn - start_pfn;
-               holes[ZONE_DMA] = e820_hole_size(start_pfn, dma_end_pfn);
-               zones[ZONE_NORMAL] = end_pfn - dma_end_pfn; 
-               holes[ZONE_NORMAL] = e820_hole_size(dma_end_pfn, end_pfn);
-
-       } else { 
-               zones[ZONE_NORMAL] = end_pfn - start_pfn; 
-               holes[ZONE_NORMAL] = e820_hole_size(start_pfn, end_pfn);
-       } 
-    
+       size_zones(zones, holes, start_pfn, end_pfn);
        free_area_init_node(nodeid, NODE_DATA(nodeid), zones,
                            start_pfn, holes);
 } 
@@ -171,7 +174,7 @@ void __init numa_init_array(void)
        for (i = 0; i < NR_CPUS; i++) {
                if (cpu_to_node[i] != NUMA_NO_NODE)
                        continue;
-               cpu_to_node[i] = rr;
+               numa_set_node(i, rr);
                rr = next_node(rr, node_online_map);
                if (rr == MAX_NUMNODES)
                        rr = first_node(node_online_map);
@@ -205,8 +208,6 @@ static int numa_emulation(unsigned long start_pfn, unsigned long end_pfn)
                if (i == numa_fake-1)
                        sz = (end_pfn<<PAGE_SHIFT) - nodes[i].start;
                nodes[i].end = nodes[i].start + sz;
-               if (i != numa_fake-1)
-                       nodes[i].end--;
                printk(KERN_INFO "Faking node %d at %016Lx-%016Lx (%LuMB)\n",
                       i,
                       nodes[i].start, nodes[i].end,
@@ -257,7 +258,7 @@ void __init numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
        nodes_clear(node_online_map);
        node_set_online(0);
        for (i = 0; i < NR_CPUS; i++)
-               cpu_to_node[i] = 0;
+               numa_set_node(i, 0);
        node_to_cpumask[0] = cpumask_of_cpu(0);
        setup_node_bootmem(0, start_pfn << PAGE_SHIFT, end_pfn << PAGE_SHIFT);
 }
@@ -267,6 +268,12 @@ __cpuinit void numa_add_cpu(int cpu)
        set_bit(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
 } 
 
+void __cpuinit numa_set_node(int cpu, int node)
+{
+       cpu_pda[cpu].nodenumber = node;
+       cpu_to_node[cpu] = node;
+}
+
 unsigned long __init numa_free_all_bootmem(void) 
 { 
        int i;
@@ -277,9 +284,26 @@ unsigned long __init numa_free_all_bootmem(void)
        return pages;
 } 
 
+#ifdef CONFIG_SPARSEMEM
+static void __init arch_sparse_init(void)
+{
+       int i;
+
+       for_each_online_node(i)
+               memory_present(i, node_start_pfn(i), node_end_pfn(i));
+
+       sparse_init();
+}
+#else
+#define arch_sparse_init() do {} while (0)
+#endif
+
 void __init paging_init(void)
 { 
        int i;
+
+       arch_sparse_init();
+
        for_each_online_node(i) {
                setup_node_zones(i); 
        }
index 4b2e844c15a75707de27bccac2dcccd750db480c..33340bd1e328dd903be99daecbe65ce9c5a35677 100644 (file)
@@ -71,8 +71,6 @@ static __init void cutoff_node(int i, unsigned long start, unsigned long end)
                        nd->start = nd->end;
        }
        if (nd->end > end) {
-               if (!(end & 0xfff))
-                       end--;
                nd->end = end;
                if (nd->start > nd->end)
                        nd->start = nd->end;
@@ -166,8 +164,6 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
                if (nd->end < end)
                        nd->end = end;
        }
-       if (!(nd->end & 0xfff))
-               nd->end--;
        printk(KERN_INFO "SRAT: Node %u PXM %u %Lx-%Lx\n", node, pxm,
               nd->start, nd->end);
 }
@@ -203,7 +199,7 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
                if (cpu_to_node[i] == NUMA_NO_NODE)
                        continue;
                if (!node_isset(cpu_to_node[i], nodes_parsed))
-                       cpu_to_node[i] = NUMA_NO_NODE; 
+                       numa_set_node(i, NUMA_NO_NODE);
        }
        numa_init_array();
        return 0;
index 96b9bb4a478d0d269456fa4a1515a0f32b082a94..0dc55cc8691bf1cd3917daa10ec38d1f38109a56 100644 (file)
@@ -616,9 +616,10 @@ void iss_net_user_timer_expire(unsigned long _conn)
 }
 
 
-static struct device_driver iss_net_driver = {
-       .name  = DRIVER_NAME,
-       .bus   = &platform_bus_type,
+static struct platform_driver iss_net_driver = {
+       .driver = {
+               .name  = DRIVER_NAME,
+       },
 };
 
 static int driver_registered;
@@ -669,7 +670,7 @@ static int iss_net_configure(int index, char *init)
        /* sysfs register */
 
        if (!driver_registered) {
-               driver_register(&iss_net_driver);
+               platform_driver_register(&iss_net_driver);
                driver_registered = 1;
        }
 
index a78e160b59a3545b8a06b78e2c78e503f1494d24..fbe050124ec514431c19091d395fa9065b2398a4 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/block/as-iosched.c
- *
  *  Anticipatory & deadline i/o scheduler.
  *
  *  Copyright (C) 2002 Jens Axboe <axboe@suse.de>
index ecacca9c877eb286bdc77eb2aea5906cc3235e18..ee0bb41694b05b5fbfc0efd111e60990e8116728 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/block/cfq-iosched.c
- *
  *  CFQ, or complete fairness queueing, disk scheduler.
  *
  *  Based on ideas from a previously unfinished io
@@ -861,8 +859,8 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq,
         * store what was left of this slice, if the queue idled out
         * or was preempted
         */
-       if (time_after(now, cfqq->slice_end))
-               cfqq->slice_left = now - cfqq->slice_end;
+       if (time_after(cfqq->slice_end, now))
+               cfqq->slice_left = cfqq->slice_end - now;
        else
                cfqq->slice_left = 0;
 
@@ -999,7 +997,7 @@ cfq_prio_to_maxrq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
 /*
  * get next queue for service
  */
-static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force)
+static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
 {
        unsigned long now = jiffies;
        struct cfq_queue *cfqq;
@@ -1023,7 +1021,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force)
         */
        if (!RB_EMPTY(&cfqq->sort_list))
                goto keep_queue;
-       else if (!force && cfq_cfqq_class_sync(cfqq) &&
+       else if (cfq_cfqq_class_sync(cfqq) &&
                 time_before(now, cfqq->slice_end)) {
                if (cfq_arm_slice_timer(cfqd, cfqq))
                        return NULL;
@@ -1091,6 +1089,42 @@ __cfq_dispatch_requests(struct cfq_data *cfqd, struct cfq_queue *cfqq,
        return dispatched;
 }
 
+static int
+cfq_forced_dispatch_cfqqs(struct list_head *list)
+{
+       int dispatched = 0;
+       struct cfq_queue *cfqq, *next;
+       struct cfq_rq *crq;
+
+       list_for_each_entry_safe(cfqq, next, list, cfq_list) {
+               while ((crq = cfqq->next_crq)) {
+                       cfq_dispatch_insert(cfqq->cfqd->queue, crq);
+                       dispatched++;
+               }
+               BUG_ON(!list_empty(&cfqq->fifo));
+       }
+       return dispatched;
+}
+
+static int
+cfq_forced_dispatch(struct cfq_data *cfqd)
+{
+       int i, dispatched = 0;
+
+       for (i = 0; i < CFQ_PRIO_LISTS; i++)
+               dispatched += cfq_forced_dispatch_cfqqs(&cfqd->rr_list[i]);
+
+       dispatched += cfq_forced_dispatch_cfqqs(&cfqd->busy_rr);
+       dispatched += cfq_forced_dispatch_cfqqs(&cfqd->cur_rr);
+       dispatched += cfq_forced_dispatch_cfqqs(&cfqd->idle_rr);
+
+       cfq_slice_expired(cfqd, 0);
+
+       BUG_ON(cfqd->busy_queues);
+
+       return dispatched;
+}
+
 static int
 cfq_dispatch_requests(request_queue_t *q, int force)
 {
@@ -1100,7 +1134,10 @@ cfq_dispatch_requests(request_queue_t *q, int force)
        if (!cfqd->busy_queues)
                return 0;
 
-       cfqq = cfq_select_queue(cfqd, force);
+       if (unlikely(force))
+               return cfq_forced_dispatch(cfqd);
+
+       cfqq = cfq_select_queue(cfqd);
        if (cfqq) {
                int max_dispatch;
 
@@ -1115,12 +1152,9 @@ cfq_dispatch_requests(request_queue_t *q, int force)
                cfq_clear_cfqq_wait_request(cfqq);
                del_timer(&cfqd->idle_slice_timer);
 
-               if (!force) {
-                       max_dispatch = cfqd->cfq_quantum;
-                       if (cfq_class_idle(cfqq))
-                               max_dispatch = 1;
-               } else
-                       max_dispatch = INT_MAX;
+               max_dispatch = cfqd->cfq_quantum;
+               if (cfq_class_idle(cfqq))
+                       max_dispatch = 1;
 
                return __cfq_dispatch_requests(cfqd, cfqq, max_dispatch);
        }
index 7929471d7df7efb6a6f885f698da89c8f4c76cf7..9cbec09e8415fa83ecb828c91d30eb43ce16cfec 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/block/deadline-iosched.c
- *
  *  Deadline i/o scheduler.
  *
  *  Copyright (C) 2002 Jens Axboe <axboe@suse.de>
index d4a49a3df829674bbb4bb476f271fc721c6fa9f3..6c3fc8a10bf210f8cfcb8def13981c6274246b11 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/block/elevator.c
- *
  *  Block device elevator/IO-scheduler.
  *
  *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
@@ -155,9 +153,10 @@ static void elevator_setup_default(void)
        /*
         * If the given scheduler is not available, fall back to no-op.
         */
-       if (!(e = elevator_find(chosen_elevator)))
+       if ((e = elevator_find(chosen_elevator)))
+               elevator_put(e);
+       else
                strcpy(chosen_elevator, "noop");
-       elevator_put(e);
 }
 
 static int __init elevator_setup(char *str)
@@ -190,14 +189,14 @@ int elevator_init(request_queue_t *q, char *name)
 
        eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL);
        if (!eq) {
-               elevator_put(e->elevator_type);
+               elevator_put(e);
                return -ENOMEM;
        }
 
        ret = elevator_attach(q, e, eq);
        if (ret) {
                kfree(eq);
-               elevator_put(e->elevator_type);
+               elevator_put(e);
        }
 
        return ret;
@@ -225,6 +224,7 @@ void elv_dispatch_sort(request_queue_t *q, struct request *rq)
 
        if (q->last_merge == rq)
                q->last_merge = NULL;
+       q->nr_sorted--;
 
        boundary = q->end_sector;
 
@@ -283,6 +283,7 @@ void elv_merge_requests(request_queue_t *q, struct request *rq,
 
        if (e->ops->elevator_merge_req_fn)
                e->ops->elevator_merge_req_fn(q, rq, next);
+       q->nr_sorted--;
 
        q->last_merge = rq;
 }
@@ -314,6 +315,20 @@ void elv_requeue_request(request_queue_t *q, struct request *rq)
        __elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 0);
 }
 
+static void elv_drain_elevator(request_queue_t *q)
+{
+       static int printed;
+       while (q->elevator->ops->elevator_dispatch_fn(q, 1))
+               ;
+       if (q->nr_sorted == 0)
+               return;
+       if (printed++ < 10) {
+               printk(KERN_ERR "%s: forced dispatching is broken "
+                      "(nr_sorted=%u), please report this\n",
+                      q->elevator->elevator_type->elevator_name, q->nr_sorted);
+       }
+}
+
 void __elv_add_request(request_queue_t *q, struct request *rq, int where,
                       int plug)
 {
@@ -348,9 +363,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
 
        case ELEVATOR_INSERT_BACK:
                rq->flags |= REQ_SOFTBARRIER;
-
-               while (q->elevator->ops->elevator_dispatch_fn(q, 1))
-                       ;
+               elv_drain_elevator(q);
                list_add_tail(&rq->queuelist, &q->queue_head);
                /*
                 * We kick the queue here for the following reasons.
@@ -369,6 +382,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
        case ELEVATOR_INSERT_SORT:
                BUG_ON(!blk_fs_request(rq));
                rq->flags |= REQ_SORTED;
+               q->nr_sorted++;
                if (q->last_merge == NULL && rq_mergeable(rq))
                        q->last_merge = rq;
                /*
@@ -525,33 +539,19 @@ int elv_queue_empty(request_queue_t *q)
 
 struct request *elv_latter_request(request_queue_t *q, struct request *rq)
 {
-       struct list_head *next;
-
        elevator_t *e = q->elevator;
 
        if (e->ops->elevator_latter_req_fn)
                return e->ops->elevator_latter_req_fn(q, rq);
-
-       next = rq->queuelist.next;
-       if (next != &q->queue_head && next != &rq->queuelist)
-               return list_entry_rq(next);
-
        return NULL;
 }
 
 struct request *elv_former_request(request_queue_t *q, struct request *rq)
 {
-       struct list_head *prev;
-
        elevator_t *e = q->elevator;
 
        if (e->ops->elevator_former_req_fn)
                return e->ops->elevator_former_req_fn(q, rq);
-
-       prev = rq->queuelist.prev;
-       if (prev != &q->queue_head && prev != &rq->queuelist)
-               return list_entry_rq(prev);
-
        return NULL;
 }
 
@@ -691,13 +691,15 @@ static void elevator_switch(request_queue_t *q, struct elevator_type *new_e)
 
        set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
 
-       while (q->elevator->ops->elevator_dispatch_fn(q, 1))
-               ;
+       elv_drain_elevator(q);
 
        while (q->rq.elvpriv) {
+               blk_remove_plug(q);
+               q->request_fn(q);
                spin_unlock_irq(q->queue_lock);
                msleep(10);
                spin_lock_irq(q->queue_lock);
+               elv_drain_elevator(q);
        }
 
        spin_unlock_irq(q->queue_lock);
@@ -744,13 +746,15 @@ error:
 ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count)
 {
        char elevator_name[ELV_NAME_MAX];
+       size_t len;
        struct elevator_type *e;
 
-       memset(elevator_name, 0, sizeof(elevator_name));
-       strncpy(elevator_name, name, sizeof(elevator_name));
+       elevator_name[sizeof(elevator_name) - 1] = '\0';
+       strncpy(elevator_name, name, sizeof(elevator_name) - 1);
+       len = strlen(elevator_name);
 
-       if (elevator_name[strlen(elevator_name) - 1] == '\n')
-               elevator_name[strlen(elevator_name) - 1] = '\0';
+       if (len && elevator_name[len - 1] == '\n')
+               elevator_name[len - 1] = '\0';
 
        e = elevator_get(elevator_name);
        if (!e) {
index 54aec4a1ae13abd6bf55a1f42d42a946e6c2a4b8..f04609d553b8530e97c2d4106d0f21381763d74e 100644 (file)
@@ -391,12 +391,14 @@ static ssize_t disk_stats_read(struct gendisk * disk, char *page)
                "%8u %8u %8llu %8u "
                "%8u %8u %8u"
                "\n",
-               disk_stat_read(disk, ios[0]), disk_stat_read(disk, merges[0]),
-               (unsigned long long)disk_stat_read(disk, sectors[0]),
-               jiffies_to_msecs(disk_stat_read(disk, ticks[0])),
-               disk_stat_read(disk, ios[1]), disk_stat_read(disk, merges[1]),
-               (unsigned long long)disk_stat_read(disk, sectors[1]),
-               jiffies_to_msecs(disk_stat_read(disk, ticks[1])),
+               disk_stat_read(disk, ios[READ]),
+               disk_stat_read(disk, merges[READ]),
+               (unsigned long long)disk_stat_read(disk, sectors[READ]),
+               jiffies_to_msecs(disk_stat_read(disk, ticks[READ])),
+               disk_stat_read(disk, ios[WRITE]),
+               disk_stat_read(disk, merges[WRITE]),
+               (unsigned long long)disk_stat_read(disk, sectors[WRITE]),
+               jiffies_to_msecs(disk_stat_read(disk, ticks[WRITE])),
                disk->in_flight,
                jiffies_to_msecs(disk_stat_read(disk, io_ticks)),
                jiffies_to_msecs(disk_stat_read(disk, time_in_queue)));
index 5f52e30b43f812c75cef8289571e9a1a35bd2808..99c9ca6d5992ab18b3e40fa201423bd3e36a0055 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/block/ll_rw_blk.c
- *
  * Copyright (C) 1991, 1992 Linus Torvalds
  * Copyright (C) 1994,      Karl Keyte: Added support for disk statistics
  * Elevator latency, (C) 2000  Andrea Arcangeli <andrea@suse.de> SuSE
index e54f006e7e603475999cc2465278035ab547c0cf..f370e4a7fe6d7a26e66f988774c002af6b772725 100644 (file)
@@ -7,21 +7,94 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-static void elevator_noop_add_request(request_queue_t *q, struct request *rq)
+struct noop_data {
+       struct list_head queue;
+};
+
+static void noop_merged_requests(request_queue_t *q, struct request *rq,
+                                struct request *next)
+{
+       list_del_init(&next->queuelist);
+}
+
+static int noop_dispatch(request_queue_t *q, int force)
+{
+       struct noop_data *nd = q->elevator->elevator_data;
+
+       if (!list_empty(&nd->queue)) {
+               struct request *rq;
+               rq = list_entry(nd->queue.next, struct request, queuelist);
+               list_del_init(&rq->queuelist);
+               elv_dispatch_sort(q, rq);
+               return 1;
+       }
+       return 0;
+}
+
+static void noop_add_request(request_queue_t *q, struct request *rq)
+{
+       struct noop_data *nd = q->elevator->elevator_data;
+
+       list_add_tail(&rq->queuelist, &nd->queue);
+}
+
+static int noop_queue_empty(request_queue_t *q)
 {
-       rq->flags |= REQ_NOMERGE;
-       elv_dispatch_add_tail(q, rq);
+       struct noop_data *nd = q->elevator->elevator_data;
+
+       return list_empty(&nd->queue);
+}
+
+static struct request *
+noop_former_request(request_queue_t *q, struct request *rq)
+{
+       struct noop_data *nd = q->elevator->elevator_data;
+
+       if (rq->queuelist.prev == &nd->queue)
+               return NULL;
+       return list_entry(rq->queuelist.prev, struct request, queuelist);
+}
+
+static struct request *
+noop_latter_request(request_queue_t *q, struct request *rq)
+{
+       struct noop_data *nd = q->elevator->elevator_data;
+
+       if (rq->queuelist.next == &nd->queue)
+               return NULL;
+       return list_entry(rq->queuelist.next, struct request, queuelist);
 }
 
-static int elevator_noop_dispatch(request_queue_t *q, int force)
+static int noop_init_queue(request_queue_t *q, elevator_t *e)
 {
+       struct noop_data *nd;
+
+       nd = kmalloc(sizeof(*nd), GFP_KERNEL);
+       if (!nd)
+               return -ENOMEM;
+       INIT_LIST_HEAD(&nd->queue);
+       e->elevator_data = nd;
        return 0;
 }
 
+static void noop_exit_queue(elevator_t *e)
+{
+       struct noop_data *nd = e->elevator_data;
+
+       BUG_ON(!list_empty(&nd->queue));
+       kfree(nd);
+}
+
 static struct elevator_type elevator_noop = {
        .ops = {
-               .elevator_dispatch_fn           = elevator_noop_dispatch,
-               .elevator_add_req_fn            = elevator_noop_add_request,
+               .elevator_merge_req_fn          = noop_merged_requests,
+               .elevator_dispatch_fn           = noop_dispatch,
+               .elevator_add_req_fn            = noop_add_request,
+               .elevator_queue_empty_fn        = noop_queue_empty,
+               .elevator_former_req_fn         = noop_former_request,
+               .elevator_latter_req_fn         = noop_latter_request,
+               .elevator_init_fn               = noop_init_queue,
+               .elevator_exit_fn               = noop_exit_queue,
        },
        .elevator_name = "noop",
        .elevator_owner = THIS_MODULE,
index 6a4da417c16b1f996435fd49b8418302ad430406..606f8733a776cf4ab3473db6a8288431f7d9bc84 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/list.h>
 #include <linux/sched.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/device.h>
 #include <linux/proc_fs.h>
 #ifdef CONFIG_X86
@@ -754,7 +755,7 @@ static int __init acpi_init(void)
        result = acpi_bus_init();
 
        if (!result) {
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
                if (!PM_IS_ACTIVE())
                        pm_active = 1;
                else {
index 3937adf4e5e5c04bd9d940648e6dc1d628c9a4f1..aa993715d6445d40c6ca668616b8f203d35a6b2c 100644 (file)
@@ -203,6 +203,7 @@ acpi_handle acpi_get_pci_rootbridge_handle(unsigned int seg, unsigned int bus)
        acpi_get_devices(PCI_ROOT_HID_STRING, find_pci_rootbridge, &find, NULL);
        return find.handle;
 }
+EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle);
 
 /* Get device's handler per its address under its parent */
 struct acpi_find_child {
index 573b6a97bb1f9276f79ad3090c67027047a7549b..70d8a6ec0920f1589525395a1550360a26cbd54f 100644 (file)
@@ -514,8 +514,6 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr)
 
 static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
 {
-       int i;
-
        ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt");
 
        if (!pr)
@@ -524,8 +522,7 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
        if (!pr->pblk)
                return_VALUE(-ENODEV);
 
-       for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
-               memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
+       memset(pr->power.states, 0, sizeof(pr->power.states));
 
        /* if info is obtained from pblk/fadt, type equals state */
        pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -555,13 +552,9 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
 
 static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr)
 {
-       int i;
-
        ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");
 
-       for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
-               memset(&(pr->power.states[i]), 0,
-                      sizeof(struct acpi_processor_cx));
+       memset(pr->power.states, 0, sizeof(pr->power.states));
 
        /* if info is obtained from pblk/fadt, type equals state */
        pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -873,7 +866,8 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
        for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
                if (pr->power.states[i].valid) {
                        pr->power.count = i;
-                       pr->flags.power = 1;
+                       if (pr->power.states[i].type >= ACPI_STATE_C2)
+                               pr->flags.power = 1;
                }
        }
 
index 0cded04680033a95c1cd93ad9ce771d7112651e1..821c81e8cd38bb892cf16094a0135a5fd911dbcb 100644 (file)
@@ -1511,8 +1511,8 @@ static inline short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) {
     // a.k.a. prepare the channel and remember that we have done so.
     
     tx_ch_desc * tx_desc = &memmap->tx_descs[tx_channel];
-    u16 rd_ptr;
-    u16 wr_ptr;
+    u32 rd_ptr;
+    u32 wr_ptr;
     u16 channel = vcc->channel;
     
     unsigned long flags;
index 98f6c02d6790a9d78220ccffa33b616cae91a30d..59dacb6552c0c5b5088c65377f607310d43ee0c8 100644 (file)
@@ -526,18 +526,23 @@ request_firmware_work_func(void *arg)
 {
        struct firmware_work *fw_work = arg;
        const struct firmware *fw;
+       int ret;
        if (!arg) {
                WARN_ON(1);
                return 0;
        }
        daemonize("%s/%s", "firmware", fw_work->name);
-       _request_firmware(&fw, fw_work->name, fw_work->device,
+       ret = _request_firmware(&fw, fw_work->name, fw_work->device,
                fw_work->hotplug);
-       fw_work->cont(fw, fw_work->context);
-       release_firmware(fw);
+       if (ret < 0)
+               fw_work->cont(NULL, fw_work->context);
+       else {
+               fw_work->cont(fw, fw_work->context);
+               release_firmware(fw);
+       }
        module_put(fw_work->module);
        kfree(fw_work);
-       return 0;
+       return ret;
 }
 
 /**
@@ -586,6 +591,8 @@ request_firmware_nowait(
 
        if (ret < 0) {
                fw_work->cont(NULL, fw_work->context);
+               module_put(fw_work->module);
+               kfree(fw_work);
                return ret;
        }
        return 0;
index 6d4736e89f1adacbfe666e12ac23233424e3ad44..8827dafba9451a7f741b9330eb0e87b58210ab3f 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "base.h"
 
+#define to_platform_driver(drv)        (container_of((drv), struct platform_driver, driver))
+
 struct device platform_bus = {
        .bus_id         = "platform",
 };
@@ -354,6 +356,77 @@ error:
        return ERR_PTR(retval);
 }
 
+static int platform_drv_probe(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->probe(dev);
+}
+
+static int platform_drv_remove(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->remove(dev);
+}
+
+static void platform_drv_shutdown(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       drv->shutdown(dev);
+}
+
+static int platform_drv_suspend(struct device *_dev, pm_message_t state)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->suspend(dev, state);
+}
+
+static int platform_drv_resume(struct device *_dev)
+{
+       struct platform_driver *drv = to_platform_driver(_dev->driver);
+       struct platform_device *dev = to_platform_device(_dev);
+
+       return drv->resume(dev);
+}
+
+/**
+ *     platform_driver_register
+ *     @drv: platform driver structure
+ */
+int platform_driver_register(struct platform_driver *drv)
+{
+       drv->driver.bus = &platform_bus_type;
+       if (drv->probe)
+               drv->driver.probe = platform_drv_probe;
+       if (drv->remove)
+               drv->driver.remove = platform_drv_remove;
+       if (drv->shutdown)
+               drv->driver.shutdown = platform_drv_shutdown;
+       if (drv->suspend)
+               drv->driver.suspend = platform_drv_suspend;
+       if (drv->resume)
+               drv->driver.resume = platform_drv_resume;
+       return driver_register(&drv->driver);
+}
+EXPORT_SYMBOL_GPL(platform_driver_register);
+
+/**
+ *     platform_driver_unregister
+ *     @drv: platform driver structure
+ */
+void platform_driver_unregister(struct platform_driver *drv)
+{
+       driver_unregister(&drv->driver);
+}
+EXPORT_SYMBOL_GPL(platform_driver_unregister);
+
 
 /**
  *     platform_match - bind platform device to platform driver.
index 0e1f34fef0c838e26b49e18706dd4c30e8f6bc8b..5d2d649f7e8d517f950ce01a99a2395ef4533f30 100644 (file)
@@ -58,7 +58,6 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <scsi/scsi.h> /* for SCSI_IOCTL_GET_IDLUN */
-typedef void Scsi_Device; /* hack to avoid including scsi.h */
 #include <scsi/scsi_ioctl.h>
 #include <linux/hdreg.h> /* for HDIO_GETGEO */
 #include <linux/blkpg.h>
index a97c80b57737528b3e5cf6b1da2f351584dc14ca..a9e33db46e68b5432627835ea1945f02d40d861c 100644 (file)
@@ -148,6 +148,7 @@ static struct board_type products[] = {
 static ctlr_info_t *hba[MAX_CTLR];
 
 static void do_cciss_request(request_queue_t *q);
+static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs);
 static int cciss_open(struct inode *inode, struct file *filep);
 static int cciss_release(struct inode *inode, struct file *filep);
 static int cciss_ioctl(struct inode *inode, struct file *filep, 
@@ -1016,10 +1017,11 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
                                status = -ENOMEM;
                                goto cleanup1;
                        }
-                       if (ioc->Request.Type.Direction == XFER_WRITE &&
-                               copy_from_user(buff[sg_used], data_ptr, sz)) {
+                       if (ioc->Request.Type.Direction == XFER_WRITE) {
+                               if (copy_from_user(buff[sg_used], data_ptr, sz)) {
                                        status = -ENOMEM;
-                                       goto cleanup1;                  
+                                       goto cleanup1;
+                               }
                        } else {
                                memset(buff[sg_used], 0, sz);
                        }
@@ -1137,8 +1139,15 @@ static int revalidate_allvol(ctlr_info_t *host)
 
        for(i=0; i< NWD; i++) {
                struct gendisk *disk = host->gendisk[i];
-               if (disk->flags & GENHD_FL_UP)
-                       del_gendisk(disk);
+               if (disk) {
+                       request_queue_t *q = disk->queue;
+
+                       if (disk->flags & GENHD_FL_UP)
+                               del_gendisk(disk);
+                       if (q)
+                               blk_cleanup_queue(q);
+                       put_disk(disk);
+               }
        }
 
         /*
@@ -1452,10 +1461,13 @@ static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
         * allows us to delete disk zero but keep the controller registered.
        */
        if (h->gendisk[0] != disk){
-               if (disk->flags & GENHD_FL_UP){
-                       blk_cleanup_queue(disk->queue);
-               del_gendisk(disk);
-                       drv->queue = NULL;
+               if (disk) {
+                       request_queue_t *q = disk->queue;
+                       if (disk->flags & GENHD_FL_UP)
+                               del_gendisk(disk);
+                       if (q)  
+                               blk_cleanup_queue(q);
+                       put_disk(disk); 
                }
        }
 
@@ -1583,6 +1595,24 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff,
                }
        } else if (cmd_type == TYPE_MSG) {
                switch (cmd) {
+               case 0: /* ABORT message */
+                       c->Request.CDBLen = 12;
+                       c->Request.Type.Attribute = ATTR_SIMPLE;
+                       c->Request.Type.Direction = XFER_WRITE;
+                       c->Request.Timeout = 0;
+                       c->Request.CDB[0] = cmd; /* abort */
+                       c->Request.CDB[1] = 0;   /* abort a command */
+                       /* buff contains the tag of the command to abort */
+                       memcpy(&c->Request.CDB[4], buff, 8);
+                       break;
+               case 1: /* RESET message */
+                       c->Request.CDBLen = 12;
+                       c->Request.Type.Attribute = ATTR_SIMPLE;
+                       c->Request.Type.Direction = XFER_WRITE;
+                       c->Request.Timeout = 0;
+                       memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB));
+                       c->Request.CDB[0] = cmd;  /* reset */
+                       c->Request.CDB[1] = 0x04; /* reset a LUN */
                case 3: /* No-Op message */
                        c->Request.CDBLen = 1;
                        c->Request.Type.Attribute = ATTR_SIMPLE;
@@ -1869,6 +1899,52 @@ static unsigned long pollcomplete(int ctlr)
        /* Invalid address to tell caller we ran out of time */
        return 1;
 }
+
+static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete)
+{
+       /* We get in here if sendcmd() is polling for completions
+          and gets some command back that it wasn't expecting -- 
+          something other than that which it just sent down.  
+          Ordinarily, that shouldn't happen, but it can happen when 
+          the scsi tape stuff gets into error handling mode, and
+          starts using sendcmd() to try to abort commands and 
+          reset tape drives.  In that case, sendcmd may pick up
+          completions of commands that were sent to logical drives
+          through the block i/o system, or cciss ioctls completing, etc. 
+          In that case, we need to save those completions for later
+          processing by the interrupt handler.
+       */
+
+#ifdef CONFIG_CISS_SCSI_TAPE
+       struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects;     
+
+       /* If it's not the scsi tape stuff doing error handling, (abort */
+       /* or reset) then we don't expect anything weird. */
+       if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) {
+#endif
+               printk( KERN_WARNING "cciss cciss%d: SendCmd "
+                     "Invalid command list address returned! (%lx)\n",
+                       ctlr, complete);
+               /* not much we can do. */
+#ifdef CONFIG_CISS_SCSI_TAPE
+               return 1;
+       }
+
+       /* We've sent down an abort or reset, but something else
+          has completed */
+       if (srl->ncompletions >= (NR_CMDS + 2)) {
+               /* Uh oh.  No room to save it for later... */
+               printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, "
+                       "reject list overflow, command lost!\n", ctlr);
+               return 1;
+       }
+       /* Save it for later */
+       srl->complete[srl->ncompletions] = complete;
+       srl->ncompletions++;
+#endif
+       return 0;
+}
+
 /*
  * Send a command to the controller, and wait for it to complete.  
  * Only used at init time. 
@@ -1891,7 +1967,7 @@ static int sendcmd(
        unsigned long complete;
        ctlr_info_t *info_p= hba[ctlr];
        u64bit buff_dma_handle;
-       int status;
+       int status, done = 0;
 
        if ((c = cmd_alloc(info_p, 1)) == NULL) {
                printk(KERN_WARNING "cciss: unable to get memory");
@@ -1913,7 +1989,9 @@ resend_cmd1:
         info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF);
        
        /* Make sure there is room in the command FIFO */
-        /* Actually it should be completely empty at this time. */
+        /* Actually it should be completely empty at this time */
+       /* unless we are in here doing error handling for the scsi */
+       /* tape side of the driver. */
         for (i = 200000; i > 0; i--) 
        {
                /* if fifo isn't full go */
@@ -1930,13 +2008,25 @@ resend_cmd1:
          * Send the cmd
          */
         info_p->access.submit_command(info_p, c);
-        complete = pollcomplete(ctlr);
+       done = 0;
+       do {
+               complete = pollcomplete(ctlr);
 
 #ifdef CCISS_DEBUG
-       printk(KERN_DEBUG "cciss: command completed\n");
+               printk(KERN_DEBUG "cciss: command completed\n");
 #endif /* CCISS_DEBUG */
 
-       if (complete != 1) {
+               if (complete == 1) {
+                       printk( KERN_WARNING
+                               "cciss cciss%d: SendCmd Timeout out, "
+                               "No command list address returned!\n",
+                               ctlr);
+                       status = IO_ERROR;
+                       done = 1;
+                       break;
+               }
+
+               /* This will need to change for direct lookup completions */
                if ( (complete & CISS_ERROR_BIT)
                     && (complete & ~CISS_ERROR_BIT) == c->busaddr)
                     {
@@ -1976,6 +2066,10 @@ resend_cmd1:
                                                status = IO_ERROR;
                                                goto cleanup1;
                                        }
+                               } else if (c->err_info->CommandStatus == CMD_UNABORTABLE) {
+                                       printk(KERN_WARNING "cciss%d: command could not be aborted.\n", ctlr);
+                                       status = IO_ERROR;
+                                       goto cleanup1;
                                }
                                printk(KERN_WARNING "ciss ciss%d: sendcmd"
                                " Error %x \n", ctlr, 
@@ -1990,20 +2084,15 @@ resend_cmd1:
                                goto cleanup1;
                        }
                }
+               /* This will need changing for direct lookup completions */
                 if (complete != c->busaddr) {
-                        printk( KERN_WARNING "cciss cciss%d: SendCmd "
-                      "Invalid command list address returned! (%lx)\n",
-                                ctlr, complete);
-                       status = IO_ERROR;
-                       goto cleanup1;
-                }
-        } else {
-                printk( KERN_WARNING
-                        "cciss cciss%d: SendCmd Timeout out, "
-                        "No command list address returned!\n",
-                        ctlr);
-               status = IO_ERROR;
-        }
+                       if (add_sendcmd_reject(cmd, ctlr, complete) != 0) {
+                               BUG(); /* we are pretty much hosed if we get here. */
+                       }
+                       continue;
+                } else
+                       done = 1;
+        } while (!done);
                
 cleanup1:      
        /* unlock the data buffer from DMA */
@@ -2011,6 +2100,11 @@ cleanup1:
        buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
        pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val,
                                c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
+#ifdef CONFIG_CISS_SCSI_TAPE
+       /* if we saved some commands for later, process them now. */
+       if (info_p->scsi_rejects.ncompletions > 0)
+               do_cciss_intr(0, info_p, NULL);
+#endif
        cmd_free(info_p, c, 1);
        return (status);
 } 
@@ -2335,6 +2429,48 @@ startio:
        start_io(h);
 }
 
+static inline unsigned long get_next_completion(ctlr_info_t *h)
+{
+#ifdef CONFIG_CISS_SCSI_TAPE
+       /* Any rejects from sendcmd() lying around? Process them first */
+       if (h->scsi_rejects.ncompletions == 0)
+               return h->access.command_completed(h);
+       else {
+               struct sendcmd_reject_list *srl;
+               int n;
+               srl = &h->scsi_rejects;
+               n = --srl->ncompletions;
+               /* printk("cciss%d: processing saved reject\n", h->ctlr); */
+               printk("p");
+               return srl->complete[n];
+       }
+#else
+       return h->access.command_completed(h);
+#endif
+}
+
+static inline int interrupt_pending(ctlr_info_t *h)
+{
+#ifdef CONFIG_CISS_SCSI_TAPE
+       return ( h->access.intr_pending(h) 
+               || (h->scsi_rejects.ncompletions > 0));
+#else
+       return h->access.intr_pending(h);
+#endif
+}
+
+static inline long interrupt_not_for_us(ctlr_info_t *h)
+{
+#ifdef CONFIG_CISS_SCSI_TAPE
+       return (((h->access.intr_pending(h) == 0) || 
+                (h->interrupts_enabled == 0)) 
+             && (h->scsi_rejects.ncompletions == 0));
+#else
+       return (((h->access.intr_pending(h) == 0) || 
+                (h->interrupts_enabled == 0)));
+#endif
+}
+
 static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
 {
        ctlr_info_t *h = dev_id;
@@ -2344,19 +2480,15 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
        int j;
        int start_queue = h->next_to_run;
 
-       /* Is this interrupt for us? */
-       if (( h->access.intr_pending(h) == 0) || (h->interrupts_enabled == 0))
+       if (interrupt_not_for_us(h))
                return IRQ_NONE;
-
        /*
         * If there are completed commands in the completion queue,
         * we had better do something about it.
         */
        spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
-       while( h->access.intr_pending(h))
-       {
-               while((a = h->access.command_completed(h)) != FIFO_EMPTY) 
-               {
+       while (interrupt_pending(h)) {
+               while((a = get_next_completion(h)) != FIFO_EMPTY) {
                        a1 = a;
                        if ((a & 0x04)) {
                                a2 = (a >> 3);
@@ -2963,7 +3095,15 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
                 printk( KERN_ERR "cciss: out of memory");
                goto clean4;
        }
-
+#ifdef CONFIG_CISS_SCSI_TAPE
+       hba[i]->scsi_rejects.complete = 
+               kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) * 
+                       (NR_CMDS + 5), GFP_KERNEL);
+       if (hba[i]->scsi_rejects.complete == NULL) {
+                printk( KERN_ERR "cciss: out of memory");
+               goto clean4;
+       }
+#endif
        spin_lock_init(&hba[i]->lock);
 
        /* Initialize the pdev driver private data. 
@@ -3031,6 +3171,10 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        return(1);
 
 clean4:
+#ifdef CONFIG_CISS_SCSI_TAPE
+       if(hba[i]->scsi_rejects.complete)
+               kfree(hba[i]->scsi_rejects.complete);
+#endif
        kfree(hba[i]->cmd_pool_bits);
        if(hba[i]->cmd_pool)
                pci_free_consistent(hba[i]->pdev,
@@ -3092,9 +3236,14 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
        /* remove it from the disk list */
        for (j = 0; j < NWD; j++) {
                struct gendisk *disk = hba[i]->gendisk[j];
-               if (disk->flags & GENHD_FL_UP) {
-                       del_gendisk(disk);
-                       blk_cleanup_queue(disk->queue);
+               if (disk) {
+                       request_queue_t *q = disk->queue;
+
+                       if (disk->flags & GENHD_FL_UP) 
+                               del_gendisk(disk);
+                       if (q)
+                               blk_cleanup_queue(q);
+                       put_disk(disk);
                }
        }
 
@@ -3103,6 +3252,9 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
        pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
                hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle);
        kfree(hba[i]->cmd_pool_bits);
+#ifdef CONFIG_CISS_SCSI_TAPE
+       kfree(hba[i]->scsi_rejects.complete);
+#endif
        release_io_mem(hba[i]);
        free_hba(i);
 }      
index ef277baee9fdc565834a04dda71f1da3014bba72..3b0858c83897f4fc5c4d25cc0450b6864c33cffc 100644 (file)
@@ -44,6 +44,14 @@ typedef struct _drive_info_struct
                                  */
 } drive_info_struct;
 
+#ifdef CONFIG_CISS_SCSI_TAPE
+
+struct sendcmd_reject_list {
+       int ncompletions;
+       unsigned long *complete; /* array of NR_CMDS tags */
+};
+
+#endif
 struct ctlr_info 
 {
        int     ctlr;
@@ -100,6 +108,9 @@ struct ctlr_info
        struct gendisk   *gendisk[NWD];
 #ifdef CONFIG_CISS_SCSI_TAPE
        void *scsi_ctlr; /* ptr to structure containing scsi related stuff */
+       /* list of block side commands the scsi error handling sucked up */
+       /* and saved for later processing */
+       struct sendcmd_reject_list scsi_rejects;
 #endif
        unsigned char alive;
 };
index ec27976a57da1285c5b2e0f3be357cc91c63038f..2942d32280a5e93a2628a8dce0f99cebc8928f6f 100644 (file)
@@ -42,6 +42,9 @@
 
 #include "cciss_scsi.h"
 
+#define CCISS_ABORT_MSG 0x00
+#define CCISS_RESET_MSG 0x01
+
 /* some prototypes... */ 
 static int sendcmd(
        __u8    cmd,
@@ -67,6 +70,8 @@ static int cciss_scsi_proc_info(
 
 static int cciss_scsi_queue_command (struct scsi_cmnd *cmd,
                void (* done)(struct scsi_cmnd *));
+static int cciss_eh_device_reset_handler(struct scsi_cmnd *);
+static int cciss_eh_abort_handler(struct scsi_cmnd *);
 
 static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR] = {
        { .name = "cciss0", .ndevices = 0 },
@@ -90,6 +95,9 @@ static struct scsi_host_template cciss_driver_template = {
        .sg_tablesize           = MAXSGENTRIES,
        .cmd_per_lun            = 1,
        .use_clustering         = DISABLE_CLUSTERING,
+       /* Can't have eh_bus_reset_handler or eh_host_reset_handler for cciss */
+       .eh_device_reset_handler= cciss_eh_device_reset_handler,
+       .eh_abort_handler       = cciss_eh_abort_handler,
 };
 
 #pragma pack(1)
@@ -1448,6 +1456,78 @@ cciss_proc_tape_report(int ctlr, unsigned char *buffer, off_t *pos, off_t *len)
        *pos += size; *len += size;
 }
 
+/* Need at least one of these error handlers to keep ../scsi/hosts.c from 
+ * complaining.  Doing a host- or bus-reset can't do anything good here. 
+ * Despite what it might say in scsi_error.c, there may well be commands
+ * on the controller, as the cciss driver registers twice, once as a block
+ * device for the logical drives, and once as a scsi device, for any tape
+ * drives.  So we know there are no commands out on the tape drives, but we
+ * don't know there are no commands on the controller, and it is likely 
+ * that there probably are, as the cciss block device is most commonly used
+ * as a boot device (embedded controller on HP/Compaq systems.)
+*/
+
+static int cciss_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
+{
+       int rc;
+       CommandList_struct *cmd_in_trouble;
+       ctlr_info_t **c;
+       int ctlr;
+
+       /* find the controller to which the command to be aborted was sent */
+       c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0];       
+       if (c == NULL) /* paranoia */
+               return FAILED;
+       ctlr = (*c)->ctlr;
+       printk(KERN_WARNING "cciss%d: resetting tape drive or medium changer.\n", ctlr);
+
+       /* find the command that's giving us trouble */
+       cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble;
+       if (cmd_in_trouble == NULL) { /* paranoia */
+               return FAILED;
+       }
+       /* send a reset to the SCSI LUN which the command was sent to */
+       rc = sendcmd(CCISS_RESET_MSG, ctlr, NULL, 0, 2, 0, 0, 
+               (unsigned char *) &cmd_in_trouble->Header.LUN.LunAddrBytes[0], 
+               TYPE_MSG);
+       /* sendcmd turned off interrputs on the board, turn 'em back on. */
+       (*c)->access.set_intr_mask(*c, CCISS_INTR_ON);
+       if (rc == 0)
+               return SUCCESS;
+       printk(KERN_WARNING "cciss%d: resetting device failed.\n", ctlr);
+       return FAILED;
+}
+
+static int  cciss_eh_abort_handler(struct scsi_cmnd *scsicmd)
+{
+       int rc;
+       CommandList_struct *cmd_to_abort;
+       ctlr_info_t **c;
+       int ctlr;
+
+       /* find the controller to which the command to be aborted was sent */
+       c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0];       
+       if (c == NULL) /* paranoia */
+               return FAILED;
+       ctlr = (*c)->ctlr;
+       printk(KERN_WARNING "cciss%d: aborting tardy SCSI cmd\n", ctlr);
+
+       /* find the command to be aborted */
+       cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble;
+       if (cmd_to_abort == NULL) /* paranoia */
+               return FAILED;
+       rc = sendcmd(CCISS_ABORT_MSG, ctlr, &cmd_to_abort->Header.Tag, 
+               0, 2, 0, 0, 
+               (unsigned char *) &cmd_to_abort->Header.LUN.LunAddrBytes[0], 
+               TYPE_MSG);
+       /* sendcmd turned off interrputs on the board, turn 'em back on. */
+       (*c)->access.set_intr_mask(*c, CCISS_INTR_ON);
+       if (rc == 0)
+               return SUCCESS;
+       return FAILED;
+
+}
+
 #else /* no CONFIG_CISS_SCSI_TAPE */
 
 /* If no tape support, then these become defined out of existence */
index 28002de783b62cabd88e2c779501afda5a2d7dd9..13b8a9bed66e03652d29f0a5dd9ae8f92a08069d 100644 (file)
  * features to asm/floppy.h.
  */
 
+/*
+ * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
+ */
+
 /*
  * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
  * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
@@ -158,10 +162,6 @@ static int print_unex = 1;
 #define FDPATCHES
 #include <linux/fdreg.h>
 
-/*
- * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
- */
-
 #include <linux/fd.h>
 #include <linux/hdreg.h>
 
index 59e5982a5db35bb0b2c18a2ebe6ca7870bd71b67..c0233efabebae2216eabeabda378bba0aafce661 100644 (file)
@@ -1188,7 +1188,7 @@ static void pkt_count_states(struct pktcdvd_device *pd, int *states)
        struct packet_data *pkt;
        int i;
 
-       for (i = 0; i <= PACKET_NUM_STATES; i++)
+       for (i = 0; i < PACKET_NUM_STATES; i++)
                states[i] = 0;
 
        spin_lock(&pd->cdrw.active_list_lock);
index fdf4370db994ca6f17be96070a0b2153a087764a..970f70d498f4c814e1cf3362e33d7e23ac53c299 100644 (file)
@@ -735,7 +735,7 @@ config SGI_IP27_RTC
 
 config GEN_RTC
        tristate "Generic /dev/rtc emulation"
-       depends on RTC!=y && !IA64 && !ARM && !PPC64 && !M32R && !SPARC32 && !SPARC64
+       depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC32 && !SPARC64
        ---help---
          If you say Y here and create a character special file /dev/rtc with
          major number 10 and minor number 135 using mknod ("man mknod"), you
index ba54b58725781e4678a41409318c0e45ff72b7ad..b02fc2267159675c32e8e6a58c27ab8173a9161f 100644 (file)
@@ -389,7 +389,6 @@ static struct pci_device_id agp_ali_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_ali_pci_table);
 
 static struct pci_driver agp_ali_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-ali",
        .id_table       = agp_ali_pci_table,
        .probe          = agp_ali_probe,
index 40fcd88b2ceac6dbd759300b930bb8f62153d520..1f776651ac64af098b5a449c58132a8b1d42c4c3 100644 (file)
@@ -515,7 +515,6 @@ static struct pci_device_id agp_amdk7_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_amdk7_pci_table);
 
 static struct pci_driver agp_amdk7_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-amdk7",
        .id_table       = agp_amdk7_pci_table,
        .probe          = agp_amdk7_probe,
index 8f748fddca9456d9cdb591d63d67aea049dc3e27..76589782adcbf2f2f2372b919c6b49490bc4d593 100644 (file)
@@ -57,9 +57,8 @@ static int nr_garts;
 static struct pci_dev * hammers[MAX_HAMMER_GARTS];
 
 static struct resource *aperture_resource;
-static int __initdata agp_try_unsupported;
+static int __initdata agp_try_unsupported = 1;
 
-static int gart_iterator;
 #define for_each_nb() for(gart_iterator=0;gart_iterator<nr_garts;gart_iterator++)
 
 static void flush_amd64_tlb(struct pci_dev *dev)
@@ -73,6 +72,7 @@ static void flush_amd64_tlb(struct pci_dev *dev)
 
 static void amd64_tlbflush(struct agp_memory *temp)
 {
+       int gart_iterator;
        for_each_nb()
                flush_amd64_tlb(hammers[gart_iterator]);
 }
@@ -222,6 +222,7 @@ static struct aper_size_info_32 amd_8151_sizes[7] =
 static int amd_8151_configure(void)
 {
        unsigned long gatt_bus = virt_to_gart(agp_bridge->gatt_table_real);
+       int gart_iterator;
 
        /* Configure AGP regs in each x86-64 host bridge. */
        for_each_nb() {
@@ -235,7 +236,7 @@ static int amd_8151_configure(void)
 static void amd64_cleanup(void)
 {
        u32 tmp;
-
+       int gart_iterator;
        for_each_nb() {
                /* disable gart translation */
                pci_read_config_dword (hammers[gart_iterator], AMD64_GARTAPERTURECTL, &tmp);
@@ -697,13 +698,22 @@ static struct pci_device_id agp_amd64_pci_table[] = {
        .subvendor      = PCI_ANY_ID,
        .subdevice      = PCI_ANY_ID,
        },
+       /* ALI/ULI M1695 */
+       {
+       .class          = (PCI_CLASS_BRIDGE_HOST << 8),
+       .class_mask     = ~0,
+       .vendor         = PCI_VENDOR_ID_AL,
+       .device         = 0x1689,
+       .subvendor      = PCI_ANY_ID,
+       .subdevice      = PCI_ANY_ID,
+       },
+
        { }
 };
 
 MODULE_DEVICE_TABLE(pci, agp_amd64_pci_table);
 
 static struct pci_driver agp_amd64_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-amd64",
        .id_table       = agp_amd64_pci_table,
        .probe          = agp_amd64_probe,
index fbd415565463426bf299188b47d5b482f6d4d47f..53372a83b6758420e7c586cdd20ceb79e412050b 100644 (file)
@@ -521,7 +521,6 @@ static struct pci_device_id agp_ati_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_ati_pci_table);
 
 static struct pci_driver agp_ati_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-ati",
        .id_table       = agp_ati_pci_table,
        .probe          = agp_ati_probe,
index d41e0a62e32efe77017abf86570d2f4147b75e7b..e7aea77a60f93c1d05dada059a9c2a358718ed17 100644 (file)
@@ -429,7 +429,6 @@ static struct pci_device_id agp_efficeon_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_efficeon_pci_table);
 
 static struct pci_driver agp_efficeon_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-efficeon",
        .id_table       = agp_efficeon_pci_table,
        .probe          = agp_efficeon_probe,
index 34a444658ffeec33620788608a0ddb646d6cc997..8ee19a4a6bce4741b75ecb9e1adb21bfe4d1c017 100644 (file)
@@ -622,7 +622,6 @@ static struct pci_device_id agp_intel_i460_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_intel_i460_pci_table);
 
 static struct pci_driver agp_intel_i460_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-intel-i460",
        .id_table       = agp_intel_i460_pci_table,
        .probe          = agp_intel_i460_probe,
index 027161ab88e9bff25321c8c1d5811ac0f8559e6b..e7bed5047dcc9b8da874ef2e4007e795cc847a87 100644 (file)
@@ -1827,7 +1827,6 @@ static struct pci_device_id agp_intel_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
 
 static struct pci_driver agp_intel_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-intel",
        .id_table       = agp_intel_pci_table,
        .probe          = agp_intel_probe,
index 3aed0c5e2f9256ebadcf6670caa91d8b393d6842..80dafa3030bd5433a9e128dc62820ea6cc95f180 100644 (file)
@@ -398,7 +398,6 @@ static struct pci_device_id agp_nvidia_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_nvidia_pci_table);
 
 static struct pci_driver agp_nvidia_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-nvidia",
        .id_table       = agp_nvidia_pci_table,
        .probe          = agp_nvidia_probe,
index a701361a889084b20278a4c55aa0676516778143..ebc05554045c73b16f099d81aad774ad3b478fb6 100644 (file)
@@ -332,7 +332,6 @@ static struct pci_device_id agp_sis_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_sis_pci_table);
 
 static struct pci_driver agp_sis_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-sis",
        .id_table       = agp_sis_pci_table,
        .probe          = agp_sis_probe,
index 5a5392dd1254765de3b7345e317bbe9dac5878a4..3f8f7fa6b0ff0177d626a9be477cfade0fe70552 100644 (file)
@@ -545,7 +545,6 @@ static struct pci_device_id agp_serverworks_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_serverworks_pci_table);
 
 static struct pci_driver agp_serverworks_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-serverworks",
        .id_table       = agp_serverworks_pci_table,
        .probe          = agp_serverworks_probe,
index 183c50acab279860a9a3b399c3de277b9df60f49..50947e38501a1903bf98b6376f4f3efc05ba2895 100644 (file)
@@ -557,6 +557,10 @@ static struct agp_device_ids uninorth_agp_device_ids[] __devinitdata = {
                .device_id      = PCI_DEVICE_ID_APPLE_U3H_AGP,
                .chipset_name   = "U3H",
        },
+       {
+               .device_id      = PCI_DEVICE_ID_APPLE_IPID2_AGP,
+               .chipset_name   = "UniNorth/Intrepid2",
+       },
 };
 
 static int __devinit agp_uninorth_probe(struct pci_dev *pdev,
@@ -658,7 +662,6 @@ static struct pci_device_id agp_uninorth_pci_table[] = {
 MODULE_DEVICE_TABLE(pci, agp_uninorth_pci_table);
 
 static struct pci_driver agp_uninorth_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-uninorth",
        .id_table       = agp_uninorth_pci_table,
        .probe          = agp_uninorth_probe,
index 5d9a13700074401ddf98e14b52ab249e69ab3d2c..c847df575cf5b96437b73dfb64311122a16326bf 100644 (file)
@@ -518,7 +518,6 @@ MODULE_DEVICE_TABLE(pci, agp_via_pci_table);
 
 
 static struct pci_driver agp_via_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "agpgart-via",
        .id_table       = agp_via_pci_table,
        .probe          = agp_via_probe,
index b7a0e4d6b9344168441ef60e6c942f8575d06770..407708a001e421ea0322ee908074a09381e2125a 100644 (file)
@@ -3113,7 +3113,6 @@ MODULE_DEVICE_TABLE(pci, epca_pci_tbl);
 int __init init_PCI (void)
 {      /* Begin init_PCI */
        memset (&epca_driver, 0, sizeof (epca_driver));
-       epca_driver.owner = THIS_MODULE;
        epca_driver.name = "epca";
        epca_driver.id_table = epca_pci_tbl;
        epca_driver.probe = epca_init_one;
index 54af20cd9a2c7de1238edaa96e7dfac4bfb723e8..c706ff162771425f361e0ce9b9a1d8584b3e6232 100644 (file)
@@ -33,6 +33,7 @@
 #include "../lowlevel/ftape-rw.h"
 #include "../lowlevel/ftape-read.h"
 #include "../lowlevel/ftape-tracing.h"
+#include "../lowlevel/ftape-buffer.h"
 
 /*  DMA'able memory allocation stuff.
  */
index 6c4b3f986d0ccf26828fe08d61a21810786a6287..f3c3aaf4560e86d07161fb2b8255882c9bf74599 100644 (file)
@@ -99,7 +99,9 @@ struct smm_regs {
 
 static inline char *i8k_get_dmi_data(int field)
 {
-       return dmi_get_system_info(field) ? : "N/A";
+       char *dmi_data = dmi_get_system_info(field);
+
+       return dmi_data && *dmi_data ? dmi_data : "?";
 }
 
 /*
@@ -396,7 +398,7 @@ static int i8k_proc_show(struct seq_file *seq, void *offset)
        return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n",
                          I8K_PROC_FMT,
                          bios_version,
-                         dmi_get_system_info(DMI_PRODUCT_SERIAL) ? : "N/A",
+                         i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
                          cpu_temp,
                          left_fan, right_fan, left_speed, right_speed,
                          ac_power, fn_key);
index c1d06ba449b60455fcffdeb908fca20f4952df8d..6b302a930e5fad66204630d1fafb4421178b7fdd 100644 (file)
@@ -48,7 +48,7 @@
 
 #define PFX "IPMI message handler: "
 
-#define IPMI_DRIVER_VERSION "36.0"
+#define IPMI_DRIVER_VERSION "38.0"
 
 static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);
 static int ipmi_init_msghandler(void);
@@ -2648,7 +2648,7 @@ void ipmi_smi_msg_received(ipmi_smi_t          intf,
        spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
        if (!list_empty(&intf->waiting_msgs)) {
                list_add_tail(&msg->link, &intf->waiting_msgs);
-               spin_unlock(&intf->waiting_msgs_lock);
+               spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
                goto out;
        }
        spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
@@ -2657,9 +2657,9 @@ void ipmi_smi_msg_received(ipmi_smi_t          intf,
        if (rv > 0) {
                /* Could not handle the message now, just add it to a
                    list to handle later. */
-               spin_lock(&intf->waiting_msgs_lock);
+               spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
                list_add_tail(&msg->link, &intf->waiting_msgs);
-               spin_unlock(&intf->waiting_msgs_lock);
+               spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
        } else if (rv == 0) {
                ipmi_free_smi_msg(msg);
        }
index ea89dca3dbb58f16b057ea9878173059b6611e6b..01a1f6badb53e428c00dbdb7b4e3190513d48e8e 100644 (file)
@@ -2203,7 +2203,7 @@ static void setup_xaction_handlers(struct smi_info *smi_info)
 
 static inline void wait_for_timer_and_thread(struct smi_info *smi_info)
 {
-       if (smi_info->thread != ERR_PTR(-ENOMEM))
+       if (smi_info->thread != NULL && smi_info->thread != ERR_PTR(-ENOMEM))
                kthread_stop(smi_info->thread);
        del_timer_sync(&smi_info->si_timer);
 }
index d22bfdc13563f722ab869043127fcf8778fcdeab..27c1179ee52749a7062c597e71f506321eeb7287 100644 (file)
@@ -18,5 +18,29 @@ config SYNCLINK_CS
          The module will be called synclinkmp.  If you want to do that, say M
          here.
 
+config CARDMAN_4000
+       tristate "Omnikey Cardman 4000 support"
+       depends on PCMCIA
+       help
+         Enable support for the Omnikey Cardman 4000 PCMCIA Smartcard
+         reader.
+
+         This kernel driver requires additional userspace support, either
+         by the vendor-provided PC/SC ifd_handler (http://www.omnikey.com/),
+         or via the cm4000 backend of OpenCT (http://www.opensc.com/).
+
+config CARDMAN_4040
+       tristate "Omnikey CardMan 4040 support"
+       depends on PCMCIA
+       help
+         Enable support for the Omnikey CardMan 4040 PCMCIA Smartcard
+         reader.
+
+         This card is basically a USB CCID device connected to a FIFO
+         in I/O space.  To use the kernel driver, you will need either the
+         PC/SC ifdhandler provided from the Omnikey homepage
+         (http://www.omnikey.com/), or a current development version of OpenCT
+         (http://www.opensc.org/).
+
 endmenu
 
index 1fcd4c591958043cbb653efd4f35bfb8dd45ebcc..0aae20985d5732059700e7fb50dec7d6573682a2 100644 (file)
@@ -5,3 +5,5 @@
 #
 
 obj-$(CONFIG_SYNCLINK_CS) += synclink_cs.o
+obj-$(CONFIG_CARDMAN_4000) += cm4000_cs.o
+obj-$(CONFIG_CARDMAN_4040) += cm4040_cs.o
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
new file mode 100644 (file)
index 0000000..ef011ef
--- /dev/null
@@ -0,0 +1,2078 @@
+ /*
+  * A driver for the PCMCIA Smartcard Reader "Omnikey CardMan Mobile 4000"
+  *
+  * cm4000_cs.c support.linux@omnikey.com
+  *
+  * Tue Oct 23 11:32:43 GMT 2001 herp - cleaned up header files
+  * Sun Jan 20 10:11:15 MET 2002 herp - added modversion header files
+  * Thu Nov 14 16:34:11 GMT 2002 mh   - added PPS functionality
+  * Tue Nov 19 16:36:27 GMT 2002 mh   - added SUSPEND/RESUME functionailty
+  * Wed Jul 28 12:55:01 CEST 2004 mh  - kernel 2.6 adjustments
+  *
+  * current version: 2.4.0gm4
+  *
+  * (C) 2000,2001,2002,2003,2004 Omnikey AG
+  *
+  * (C) 2005 Harald Welte <laforge@gnumonks.org>
+  *    - Adhere to Kernel CodingStyle
+  *    - Port to 2.6.13 "new" style PCMCIA
+  *    - Check for copy_{from,to}_user return values
+  *    - Use nonseekable_open()
+  *
+  * All rights reserved. Licensed under dual BSD/GPL license.
+  */
+
+/* #define PCMCIA_DEBUG 6 */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/delay.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#include <pcmcia/cs_types.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ciscode.h>
+#include <pcmcia/ds.h>
+
+#include <linux/cm4000_cs.h>
+
+/* #define ATR_CSUM */
+
+#ifdef PCMCIA_DEBUG
+#define reader_to_dev(x)       (&handle_to_dev(x->link.handle))
+static int pc_debug = PCMCIA_DEBUG;
+module_param(pc_debug, int, 0600);
+#define DEBUGP(n, rdr, x, args...) do {                                \
+       if (pc_debug >= (n))                                            \
+               dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x,     \
+                          __FUNCTION__ , ## args);                     \
+       } while (0)
+#else
+#define DEBUGP(n, rdr, x, args...)
+#endif
+static char *version = "cm4000_cs.c v2.4.0gm5 - All bugs added by Harald Welte";
+
+#define        T_1SEC          (HZ)
+#define        T_10MSEC        msecs_to_jiffies(10)
+#define        T_20MSEC        msecs_to_jiffies(20)
+#define        T_40MSEC        msecs_to_jiffies(40)
+#define        T_50MSEC        msecs_to_jiffies(50)
+#define        T_100MSEC       msecs_to_jiffies(100)
+#define        T_500MSEC       msecs_to_jiffies(500)
+
+static void cm4000_detach(dev_link_t *link);
+static void cm4000_release(dev_link_t *link);
+
+static int major;              /* major number we get from the kernel */
+
+/* note: the first state has to have number 0 always */
+
+#define        M_FETCH_ATR     0
+#define        M_TIMEOUT_WAIT  1
+#define        M_READ_ATR_LEN  2
+#define        M_READ_ATR      3
+#define        M_ATR_PRESENT   4
+#define        M_BAD_CARD      5
+#define M_CARDOFF      6
+
+#define        LOCK_IO                 0
+#define        LOCK_MONITOR            1
+
+#define IS_AUTOPPS_ACT          6
+#define        IS_PROCBYTE_PRESENT      7
+#define        IS_INVREV                8
+#define IS_ANY_T0               9
+#define        IS_ANY_T1               10
+#define        IS_ATR_PRESENT          11
+#define        IS_ATR_VALID            12
+#define        IS_CMM_ABSENT           13
+#define        IS_BAD_LENGTH           14
+#define        IS_BAD_CSUM             15
+#define        IS_BAD_CARD             16
+
+#define REG_FLAGS0(x)          (x + 0)
+#define REG_FLAGS1(x)          (x + 1)
+#define REG_NUM_BYTES(x)       (x + 2)
+#define REG_BUF_ADDR(x)                (x + 3)
+#define REG_BUF_DATA(x)                (x + 4)
+#define REG_NUM_SEND(x)                (x + 5)
+#define REG_BAUDRATE(x)                (x + 6)
+#define REG_STOPBITS(x)                (x + 7)
+
+struct cm4000_dev {
+       dev_link_t link;                /* pcmcia link */
+       dev_node_t node;                /* OS node (major,minor) */
+
+       unsigned char atr[MAX_ATR];
+       unsigned char rbuf[512];
+       unsigned char sbuf[512];
+
+       wait_queue_head_t devq;         /* when removing cardman must not be
+                                          zeroed! */
+
+       wait_queue_head_t ioq;          /* if IO is locked, wait on this Q */
+       wait_queue_head_t atrq;         /* wait for ATR valid */
+       wait_queue_head_t readq;        /* used by write to wake blk.read */
+
+       /* warning: do not move this fields.
+        * initialising to zero depends on it - see ZERO_DEV below.  */
+       unsigned char atr_csum;
+       unsigned char atr_len_retry;
+       unsigned short atr_len;
+       unsigned short rlen;    /* bytes avail. after write */
+       unsigned short rpos;    /* latest read pos. write zeroes */
+       unsigned char procbyte; /* T=0 procedure byte */
+       unsigned char mstate;   /* state of card monitor */
+       unsigned char cwarn;    /* slow down warning */
+       unsigned char flags0;   /* cardman IO-flags 0 */
+       unsigned char flags1;   /* cardman IO-flags 1 */
+       unsigned int mdelay;    /* variable monitor speeds, in jiffies */
+
+       unsigned int baudv;     /* baud value for speed */
+       unsigned char ta1;
+       unsigned char proto;    /* T=0, T=1, ... */
+       unsigned long flags;    /* lock+flags (MONITOR,IO,ATR) * for concurrent
+                                  access */
+
+       unsigned char pts[4];
+
+       struct timer_list timer;        /* used to keep monitor running */
+       int monitor_running;
+};
+
+#define        ZERO_DEV(dev)                                           \
+       memset(&dev->atr_csum,0,                                \
+               sizeof(struct cm4000_dev) -                     \
+               /*link*/ sizeof(dev_link_t) -                   \
+               /*node*/ sizeof(dev_node_t) -                   \
+               /*atr*/ MAX_ATR*sizeof(char) -                  \
+               /*rbuf*/ 512*sizeof(char) -                     \
+               /*sbuf*/ 512*sizeof(char) -                     \
+               /*queue*/ 4*sizeof(wait_queue_head_t))
+
+static dev_info_t dev_info = MODULE_NAME;
+static dev_link_t *dev_table[CM4000_MAX_DEV];
+
+/* This table doesn't use spaces after the comma between fields and thus
+ * violates CodingStyle.  However, I don't really think wrapping it around will
+ * make it any clearer to read -HW */
+static unsigned char fi_di_table[10][14] = {
+/*FI     00   01   02   03   04   05   06   07   08   09   10   11   12   13 */
+/*DI */
+/* 0 */ {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
+/* 1 */ {0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x91,0x11,0x11,0x11,0x11},
+/* 2 */ {0x02,0x12,0x22,0x32,0x11,0x11,0x11,0x11,0x11,0x92,0xA2,0xB2,0x11,0x11},
+/* 3 */ {0x03,0x13,0x23,0x33,0x43,0x53,0x63,0x11,0x11,0x93,0xA3,0xB3,0xC3,0xD3},
+/* 4 */ {0x04,0x14,0x24,0x34,0x44,0x54,0x64,0x11,0x11,0x94,0xA4,0xB4,0xC4,0xD4},
+/* 5 */ {0x00,0x15,0x25,0x35,0x45,0x55,0x65,0x11,0x11,0x95,0xA5,0xB5,0xC5,0xD5},
+/* 6 */ {0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x11,0x11,0x96,0xA6,0xB6,0xC6,0xD6},
+/* 7 */ {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
+/* 8 */ {0x08,0x11,0x28,0x38,0x48,0x58,0x68,0x11,0x11,0x98,0xA8,0xB8,0xC8,0xD8},
+/* 9 */ {0x09,0x19,0x29,0x39,0x49,0x59,0x69,0x11,0x11,0x99,0xA9,0xB9,0xC9,0xD9}
+};
+
+#ifndef PCMCIA_DEBUG
+#define        xoutb   outb
+#define        xinb    inb
+#else
+static inline void xoutb(unsigned char val, unsigned short port)
+{
+       if (pc_debug >= 7)
+               printk(KERN_DEBUG "outb(val=%.2x,port=%.4x)\n", val, port);
+       outb(val, port);
+}
+static inline unsigned char xinb(unsigned short port)
+{
+       unsigned char val;
+
+       val = inb(port);
+       if (pc_debug >= 7)
+               printk(KERN_DEBUG "%.2x=inb(%.4x)\n", val, port);
+
+       return val;
+}
+#endif
+
+#define        b_0000  15
+#define        b_0001  14
+#define        b_0010  13
+#define        b_0011  12
+#define        b_0100  11
+#define        b_0101  10
+#define        b_0110  9
+#define        b_0111  8
+#define        b_1000  7
+#define        b_1001  6
+#define        b_1010  5
+#define        b_1011  4
+#define        b_1100  3
+#define        b_1101  2
+#define        b_1110  1
+#define        b_1111  0
+
+static unsigned char irtab[16] = {
+       b_0000, b_1000, b_0100, b_1100,
+       b_0010, b_1010, b_0110, b_1110,
+       b_0001, b_1001, b_0101, b_1101,
+       b_0011, b_1011, b_0111, b_1111
+};
+
+static void str_invert_revert(unsigned char *b, int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++)
+               b[i] = (irtab[b[i] & 0x0f] << 4) | irtab[b[i] >> 4];
+}
+
+static unsigned char invert_revert(unsigned char ch)
+{
+       return (irtab[ch & 0x0f] << 4) | irtab[ch >> 4];
+}
+
+#define        ATRLENCK(dev,pos) \
+       if (pos>=dev->atr_len || pos>=MAX_ATR) \
+               goto return_0;
+
+static unsigned int calc_baudv(unsigned char fidi)
+{
+       unsigned int wcrcf, wbrcf, fi_rfu, di_rfu;
+
+       fi_rfu = 372;
+       di_rfu = 1;
+
+       /* FI */
+       switch ((fidi >> 4) & 0x0F) {
+       case 0x00:
+               wcrcf = 372;
+               break;
+       case 0x01:
+               wcrcf = 372;
+               break;
+       case 0x02:
+               wcrcf = 558;
+               break;
+       case 0x03:
+               wcrcf = 744;
+               break;
+       case 0x04:
+               wcrcf = 1116;
+               break;
+       case 0x05:
+               wcrcf = 1488;
+               break;
+       case 0x06:
+               wcrcf = 1860;
+               break;
+       case 0x07:
+               wcrcf = fi_rfu;
+               break;
+       case 0x08:
+               wcrcf = fi_rfu;
+               break;
+       case 0x09:
+               wcrcf = 512;
+               break;
+       case 0x0A:
+               wcrcf = 768;
+               break;
+       case 0x0B:
+               wcrcf = 1024;
+               break;
+       case 0x0C:
+               wcrcf = 1536;
+               break;
+       case 0x0D:
+               wcrcf = 2048;
+               break;
+       default:
+               wcrcf = fi_rfu;
+               break;
+       }
+
+       /* DI */
+       switch (fidi & 0x0F) {
+       case 0x00:
+               wbrcf = di_rfu;
+               break;
+       case 0x01:
+               wbrcf = 1;
+               break;
+       case 0x02:
+               wbrcf = 2;
+               break;
+       case 0x03:
+               wbrcf = 4;
+               break;
+       case 0x04:
+               wbrcf = 8;
+               break;
+       case 0x05:
+               wbrcf = 16;
+               break;
+       case 0x06:
+               wbrcf = 32;
+               break;
+       case 0x07:
+               wbrcf = di_rfu;
+               break;
+       case 0x08:
+               wbrcf = 12;
+               break;
+       case 0x09:
+               wbrcf = 20;
+               break;
+       default:
+               wbrcf = di_rfu;
+               break;
+       }
+
+       return (wcrcf / wbrcf);
+}
+
+static unsigned short io_read_num_rec_bytes(ioaddr_t iobase, unsigned short *s)
+{
+       unsigned short tmp;
+
+       tmp = *s = 0;
+       do {
+               *s = tmp;
+               tmp = inb(REG_NUM_BYTES(iobase)) |
+                               (inb(REG_FLAGS0(iobase)) & 4 ? 0x100 : 0);
+       } while (tmp != *s);
+
+       return *s;
+}
+
+static int parse_atr(struct cm4000_dev *dev)
+{
+       unsigned char any_t1, any_t0;
+       unsigned char ch, ifno;
+       int ix, done;
+
+       DEBUGP(3, dev, "-> parse_atr: dev->atr_len = %i\n", dev->atr_len);
+
+       if (dev->atr_len < 3) {
+               DEBUGP(5, dev, "parse_atr: atr_len < 3\n");
+               return 0;
+       }
+
+       if (dev->atr[0] == 0x3f)
+               set_bit(IS_INVREV, &dev->flags);
+       else
+               clear_bit(IS_INVREV, &dev->flags);
+       ix = 1;
+       ifno = 1;
+       ch = dev->atr[1];
+       dev->proto = 0;         /* XXX PROTO */
+       any_t1 = any_t0 = done = 0;
+       dev->ta1 = 0x11;        /* defaults to 9600 baud */
+       do {
+               if (ifno == 1 && (ch & 0x10)) {
+                       /* read first interface byte and TA1 is present */
+                       dev->ta1 = dev->atr[2];
+                       DEBUGP(5, dev, "Card says FiDi is 0x%.2x\n", dev->ta1);
+                       ifno++;
+               } else if ((ifno == 2) && (ch & 0x10)) { /* TA(2) */
+                       dev->ta1 = 0x11;
+                       ifno++;
+               }
+
+               DEBUGP(5, dev, "Yi=%.2x\n", ch & 0xf0);
+               ix += ((ch & 0x10) >> 4)        /* no of int.face chars */
+                   +((ch & 0x20) >> 5)
+                   + ((ch & 0x40) >> 6)
+                   + ((ch & 0x80) >> 7);
+               /* ATRLENCK(dev,ix); */
+               if (ch & 0x80) {        /* TDi */
+                       ch = dev->atr[ix];
+                       if ((ch & 0x0f)) {
+                               any_t1 = 1;
+                               DEBUGP(5, dev, "card is capable of T=1\n");
+                       } else {
+                               any_t0 = 1;
+                               DEBUGP(5, dev, "card is capable of T=0\n");
+                       }
+               } else
+                       done = 1;
+       } while (!done);
+
+       DEBUGP(5, dev, "ix=%d noHist=%d any_t1=%d\n",
+             ix, dev->atr[1] & 15, any_t1);
+       if (ix + 1 + (dev->atr[1] & 0x0f) + any_t1 != dev->atr_len) {
+               DEBUGP(5, dev, "length error\n");
+               return 0;
+       }
+       if (any_t0)
+               set_bit(IS_ANY_T0, &dev->flags);
+
+       if (any_t1) {           /* compute csum */
+               dev->atr_csum = 0;
+#ifdef ATR_CSUM
+               for (i = 1; i < dev->atr_len; i++)
+                       dev->atr_csum ^= dev->atr[i];
+               if (dev->atr_csum) {
+                       set_bit(IS_BAD_CSUM, &dev->flags);
+                       DEBUGP(5, dev, "bad checksum\n");
+                       goto return_0;
+               }
+#endif
+               if (any_t0 == 0)
+                       dev->proto = 1; /* XXX PROTO */
+               set_bit(IS_ANY_T1, &dev->flags);
+       }
+
+       return 1;
+}
+
+struct card_fixup {
+       char atr[12];
+       u_int8_t atr_len;
+       u_int8_t stopbits;
+};
+
+static struct card_fixup card_fixups[] = {
+       {       /* ACOS */
+               .atr = { 0x3b, 0xb3, 0x11, 0x00, 0x00, 0x41, 0x01 },
+               .atr_len = 7,
+               .stopbits = 0x03,
+       },
+       {       /* Motorola */
+               .atr = {0x3b, 0x76, 0x13, 0x00, 0x00, 0x80, 0x62, 0x07,
+                       0x41, 0x81, 0x81 },
+               .atr_len = 11,
+               .stopbits = 0x04,
+       },
+};
+
+static void set_cardparameter(struct cm4000_dev *dev)
+{
+       int i;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+       u_int8_t stopbits = 0x02; /* ISO default */
+
+       DEBUGP(3, dev, "-> set_cardparameter\n");
+
+       dev->flags1 = dev->flags1 | (((dev->baudv - 1) & 0x0100) >> 8);
+       xoutb(dev->flags1, REG_FLAGS1(iobase));
+       DEBUGP(5, dev, "flags1 = 0x%02x\n", dev->flags1);
+
+       /* set baudrate */
+       xoutb((unsigned char)((dev->baudv - 1) & 0xFF), REG_BAUDRATE(iobase));
+
+       DEBUGP(5, dev, "baudv = %i -> write 0x%02x\n", dev->baudv,
+             ((dev->baudv - 1) & 0xFF));
+
+       /* set stopbits */
+       for (i = 0; i < ARRAY_SIZE(card_fixups); i++) {
+               if (!memcmp(dev->atr, card_fixups[i].atr,
+                           card_fixups[i].atr_len))
+                       stopbits = card_fixups[i].stopbits;
+       }
+       xoutb(stopbits, REG_STOPBITS(iobase));
+
+       DEBUGP(3, dev, "<- set_cardparameter\n");
+}
+
+static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
+{
+
+       unsigned long tmp, i;
+       unsigned short num_bytes_read;
+       unsigned char pts_reply[4];
+       ssize_t rc;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+
+       rc = 0;
+
+       DEBUGP(3, dev, "-> set_protocol\n");
+       DEBUGP(5, dev, "ptsreq->Protocol = 0x%.8x, ptsreq->Flags=0x%.8x, "
+                "ptsreq->pts1=0x%.2x, ptsreq->pts2=0x%.2x, "
+                "ptsreq->pts3=0x%.2x\n", (unsigned int)ptsreq->protocol,
+                (unsigned int)ptsreq->flags, ptsreq->pts1, ptsreq->pts2,
+                ptsreq->pts3);
+
+       /* Fill PTS structure */
+       dev->pts[0] = 0xff;
+       dev->pts[1] = 0x00;
+       tmp = ptsreq->protocol;
+       while ((tmp = (tmp >> 1)) > 0)
+               dev->pts[1]++;
+       dev->proto = dev->pts[1];       /* Set new protocol */
+       dev->pts[1] = (0x01 << 4) | (dev->pts[1]);
+
+       /* Correct Fi/Di according to CM4000 Fi/Di table */
+       DEBUGP(5, dev, "Ta(1) from ATR is 0x%.2x\n", dev->ta1);
+       /* set Fi/Di according to ATR TA(1) */
+       dev->pts[2] = fi_di_table[dev->ta1 & 0x0F][(dev->ta1 >> 4) & 0x0F];
+
+       /* Calculate PCK character */
+       dev->pts[3] = dev->pts[0] ^ dev->pts[1] ^ dev->pts[2];
+
+       DEBUGP(5, dev, "pts0=%.2x, pts1=%.2x, pts2=%.2x, pts3=%.2x\n",
+              dev->pts[0], dev->pts[1], dev->pts[2], dev->pts[3]);
+
+       /* check card convention */
+       if (test_bit(IS_INVREV, &dev->flags))
+               str_invert_revert(dev->pts, 4);
+
+       /* reset SM */
+       xoutb(0x80, REG_FLAGS0(iobase));
+
+       /* Enable access to the message buffer */
+       DEBUGP(5, dev, "Enable access to the messages buffer\n");
+       dev->flags1 = 0x20      /* T_Active */
+           | (test_bit(IS_INVREV, &dev->flags) ? 0x02 : 0x00) /* inv parity */
+           | ((dev->baudv >> 8) & 0x01);       /* MSB-baud */
+       xoutb(dev->flags1, REG_FLAGS1(iobase));
+
+       DEBUGP(5, dev, "Enable message buffer -> flags1 = 0x%.2x\n",
+              dev->flags1);
+
+       /* write challenge to the buffer */
+       DEBUGP(5, dev, "Write challenge to buffer: ");
+       for (i = 0; i < 4; i++) {
+               xoutb(i, REG_BUF_ADDR(iobase));
+               xoutb(dev->pts[i], REG_BUF_DATA(iobase));       /* buf data */
+#ifdef PCMCIA_DEBUG
+               if (pc_debug >= 5)
+                       printk("0x%.2x ", dev->pts[i]);
+       }
+       if (pc_debug >= 5)
+               printk("\n");
+#else
+       }
+#endif
+
+       /* set number of bytes to write */
+       DEBUGP(5, dev, "Set number of bytes to write\n");
+       xoutb(0x04, REG_NUM_SEND(iobase));
+
+       /* Trigger CARDMAN CONTROLLER */
+       xoutb(0x50, REG_FLAGS0(iobase));
+
+       /* Monitor progress */
+       /* wait for xmit done */
+       DEBUGP(5, dev, "Waiting for NumRecBytes getting valid\n");
+
+       for (i = 0; i < 100; i++) {
+               if (inb(REG_FLAGS0(iobase)) & 0x08) {
+                       DEBUGP(5, dev, "NumRecBytes is valid\n");
+                       break;
+               }
+               mdelay(10);
+       }
+       if (i == 100) {
+               DEBUGP(5, dev, "Timeout waiting for NumRecBytes getting "
+                      "valid\n");
+               rc = -EIO;
+               goto exit_setprotocol;
+       }
+
+       DEBUGP(5, dev, "Reading NumRecBytes\n");
+       for (i = 0; i < 100; i++) {
+               io_read_num_rec_bytes(iobase, &num_bytes_read);
+               if (num_bytes_read >= 4) {
+                       DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
+                       break;
+               }
+               mdelay(10);
+       }
+
+       /* check whether it is a short PTS reply? */
+       if (num_bytes_read == 3)
+               i = 0;
+
+       if (i == 100) {
+               DEBUGP(5, dev, "Timeout reading num_bytes_read\n");
+               rc = -EIO;
+               goto exit_setprotocol;
+       }
+
+       DEBUGP(5, dev, "Reset the CARDMAN CONTROLLER\n");
+       xoutb(0x80, REG_FLAGS0(iobase));
+
+       /* Read PPS reply */
+       DEBUGP(5, dev, "Read PPS reply\n");
+       for (i = 0; i < num_bytes_read; i++) {
+               xoutb(i, REG_BUF_ADDR(iobase));
+               pts_reply[i] = inb(REG_BUF_DATA(iobase));
+       }
+
+#ifdef PCMCIA_DEBUG
+       DEBUGP(2, dev, "PTSreply: ");
+       for (i = 0; i < num_bytes_read; i++) {
+               if (pc_debug >= 5)
+                       printk("0x%.2x ", pts_reply[i]);
+       }
+       printk("\n");
+#endif /* PCMCIA_DEBUG */
+
+       DEBUGP(5, dev, "Clear Tactive in Flags1\n");
+       xoutb(0x20, REG_FLAGS1(iobase));
+
+       /* Compare ptsreq and ptsreply */
+       if ((dev->pts[0] == pts_reply[0]) &&
+           (dev->pts[1] == pts_reply[1]) &&
+           (dev->pts[2] == pts_reply[2]) && (dev->pts[3] == pts_reply[3])) {
+               /* setcardparameter according to PPS */
+               dev->baudv = calc_baudv(dev->pts[2]);
+               set_cardparameter(dev);
+       } else if ((dev->pts[0] == pts_reply[0]) &&
+                  ((dev->pts[1] & 0xef) == pts_reply[1]) &&
+                  ((pts_reply[0] ^ pts_reply[1]) == pts_reply[2])) {
+               /* short PTS reply, set card parameter to default values */
+               dev->baudv = calc_baudv(0x11);
+               set_cardparameter(dev);
+       } else
+               rc = -EIO;
+
+exit_setprotocol:
+       DEBUGP(3, dev, "<- set_protocol\n");
+       return rc;
+}
+
+static int io_detect_cm4000(ioaddr_t iobase, struct cm4000_dev *dev)
+{
+
+       /* note: statemachine is assumed to be reset */
+       if (inb(REG_FLAGS0(iobase)) & 8) {
+               clear_bit(IS_ATR_VALID, &dev->flags);
+               set_bit(IS_CMM_ABSENT, &dev->flags);
+               return 0;       /* detect CMM = 1 -> failure */
+       }
+       /* xoutb(0x40, REG_FLAGS1(iobase)); detectCMM */
+       xoutb(dev->flags1 | 0x40, REG_FLAGS1(iobase));
+       if ((inb(REG_FLAGS0(iobase)) & 8) == 0) {
+               clear_bit(IS_ATR_VALID, &dev->flags);
+               set_bit(IS_CMM_ABSENT, &dev->flags);
+               return 0;       /* detect CMM=0 -> failure */
+       }
+       /* clear detectCMM again by restoring original flags1 */
+       xoutb(dev->flags1, REG_FLAGS1(iobase));
+       return 1;
+}
+
+static void terminate_monitor(struct cm4000_dev *dev)
+{
+
+       /* tell the monitor to stop and wait until
+        * it terminates.
+        */
+       DEBUGP(3, dev, "-> terminate_monitor\n");
+       wait_event_interruptible(dev->devq,
+                                test_and_set_bit(LOCK_MONITOR,
+                                                 (void *)&dev->flags));
+
+       /* now, LOCK_MONITOR has been set.
+        * allow a last cycle in the monitor.
+        * the monitor will indicate that it has
+        * finished by clearing this bit.
+        */
+       DEBUGP(5, dev, "Now allow last cycle of monitor!\n");
+       while (test_bit(LOCK_MONITOR, (void *)&dev->flags))
+               msleep(25);
+
+       DEBUGP(5, dev, "Delete timer\n");
+       del_timer_sync(&dev->timer);
+#ifdef PCMCIA_DEBUG
+       dev->monitor_running = 0;
+#endif
+
+       DEBUGP(3, dev, "<- terminate_monitor\n");
+}
+
+/*
+ * monitor the card every 50msec. as a side-effect, retrieve the
+ * atr once a card is inserted. another side-effect of retrieving the
+ * atr is that the card will be powered on, so there is no need to
+ * power on the card explictely from the application: the driver
+ * is already doing that for you.
+ */
+
+static void monitor_card(unsigned long p)
+{
+       struct cm4000_dev *dev = (struct cm4000_dev *) p;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+       unsigned short s;
+       struct ptsreq ptsreq;
+       int i, atrc;
+
+       DEBUGP(7, dev, "->  monitor_card\n");
+
+       /* if someone has set the lock for us: we're done! */
+       if (test_and_set_bit(LOCK_MONITOR, &dev->flags)) {
+               DEBUGP(4, dev, "About to stop monitor\n");
+               /* no */
+               dev->rlen =
+                   dev->rpos =
+                   dev->atr_csum = dev->atr_len_retry = dev->cwarn = 0;
+               dev->mstate = M_FETCH_ATR;
+               clear_bit(LOCK_MONITOR, &dev->flags);
+               /* close et al. are sleeping on devq, so wake it */
+               wake_up_interruptible(&dev->devq);
+               DEBUGP(2, dev, "<- monitor_card (we are done now)\n");
+               return;
+       }
+
+       /* try to lock io: if it is already locked, just add another timer */
+       if (test_and_set_bit(LOCK_IO, (void *)&dev->flags)) {
+               DEBUGP(4, dev, "Couldn't get IO lock\n");
+               goto return_with_timer;
+       }
+
+       /* is a card/a reader inserted at all ? */
+       dev->flags0 = xinb(REG_FLAGS0(iobase));
+       DEBUGP(7, dev, "dev->flags0 = 0x%2x\n", dev->flags0);
+       DEBUGP(7, dev, "smartcard present: %s\n",
+              dev->flags0 & 1 ? "yes" : "no");
+       DEBUGP(7, dev, "cardman present: %s\n",
+              dev->flags0 == 0xff ? "no" : "yes");
+
+       if ((dev->flags0 & 1) == 0      /* no smartcard inserted */
+           || dev->flags0 == 0xff) {   /* no cardman inserted */
+               /* no */
+               dev->rlen =
+                   dev->rpos =
+                   dev->atr_csum = dev->atr_len_retry = dev->cwarn = 0;
+               dev->mstate = M_FETCH_ATR;
+
+               dev->flags &= 0x000000ff; /* only keep IO and MONITOR locks */
+
+               if (dev->flags0 == 0xff) {
+                       DEBUGP(4, dev, "set IS_CMM_ABSENT bit\n");
+                       set_bit(IS_CMM_ABSENT, &dev->flags);
+               } else if (test_bit(IS_CMM_ABSENT, &dev->flags)) {
+                       DEBUGP(4, dev, "clear IS_CMM_ABSENT bit "
+                              "(card is removed)\n");
+                       clear_bit(IS_CMM_ABSENT, &dev->flags);
+               }
+
+               goto release_io;
+       } else if ((dev->flags0 & 1) && test_bit(IS_CMM_ABSENT, &dev->flags)) {
+               /* cardman and card present but cardman was absent before
+                * (after suspend with inserted card) */
+               DEBUGP(4, dev, "clear IS_CMM_ABSENT bit (card is inserted)\n");
+               clear_bit(IS_CMM_ABSENT, &dev->flags);
+       }
+
+       if (test_bit(IS_ATR_VALID, &dev->flags) == 1) {
+               DEBUGP(7, dev, "believe ATR is already valid (do nothing)\n");
+               goto release_io;
+       }
+
+       switch (dev->mstate) {
+               unsigned char flags0;
+       case M_CARDOFF:
+               DEBUGP(4, dev, "M_CARDOFF\n");
+               flags0 = inb(REG_FLAGS0(iobase));
+               if (flags0 & 0x02) {
+                       /* wait until Flags0 indicate power is off */
+                       dev->mdelay = T_10MSEC;
+               } else {
+                       /* Flags0 indicate power off and no card inserted now;
+                        * Reset CARDMAN CONTROLLER */
+                       xoutb(0x80, REG_FLAGS0(iobase));
+
+                       /* prepare for fetching ATR again: after card off ATR
+                        * is read again automatically */
+                       dev->rlen =
+                           dev->rpos =
+                           dev->atr_csum =
+                           dev->atr_len_retry = dev->cwarn = 0;
+                       dev->mstate = M_FETCH_ATR;
+
+                       /* minimal gap between CARDOFF and read ATR is 50msec */
+                       dev->mdelay = T_50MSEC;
+               }
+               break;
+       case M_FETCH_ATR:
+               DEBUGP(4, dev, "M_FETCH_ATR\n");
+               xoutb(0x80, REG_FLAGS0(iobase));
+               DEBUGP(4, dev, "Reset BAUDV to 9600\n");
+               dev->baudv = 0x173;     /* 9600 */
+               xoutb(0x02, REG_STOPBITS(iobase));      /* stopbits=2 */
+               xoutb(0x73, REG_BAUDRATE(iobase));      /* baud value */
+               xoutb(0x21, REG_FLAGS1(iobase));        /* T_Active=1, baud
+                                                          value */
+               /* warm start vs. power on: */
+               xoutb(dev->flags0 & 2 ? 0x46 : 0x44, REG_FLAGS0(iobase));
+               dev->mdelay = T_40MSEC;
+               dev->mstate = M_TIMEOUT_WAIT;
+               break;
+       case M_TIMEOUT_WAIT:
+               DEBUGP(4, dev, "M_TIMEOUT_WAIT\n");
+               /* numRecBytes */
+               io_read_num_rec_bytes(iobase, &dev->atr_len);
+               dev->mdelay = T_10MSEC;
+               dev->mstate = M_READ_ATR_LEN;
+               break;
+       case M_READ_ATR_LEN:
+               DEBUGP(4, dev, "M_READ_ATR_LEN\n");
+               /* infinite loop possible, since there is no timeout */
+
+#define        MAX_ATR_LEN_RETRY       100
+
+               if (dev->atr_len == io_read_num_rec_bytes(iobase, &s)) {
+                       if (dev->atr_len_retry++ >= MAX_ATR_LEN_RETRY) {                                        /* + XX msec */
+                               dev->mdelay = T_10MSEC;
+                               dev->mstate = M_READ_ATR;
+                       }
+               } else {
+                       dev->atr_len = s;
+                       dev->atr_len_retry = 0; /* set new timeout */
+               }
+
+               DEBUGP(4, dev, "Current ATR_LEN = %i\n", dev->atr_len);
+               break;
+       case M_READ_ATR:
+               DEBUGP(4, dev, "M_READ_ATR\n");
+               xoutb(0x80, REG_FLAGS0(iobase));        /* reset SM */
+               for (i = 0; i < dev->atr_len; i++) {
+                       xoutb(i, REG_BUF_ADDR(iobase));
+                       dev->atr[i] = inb(REG_BUF_DATA(iobase));
+               }
+               /* Deactivate T_Active flags */
+               DEBUGP(4, dev, "Deactivate T_Active flags\n");
+               dev->flags1 = 0x01;
+               xoutb(dev->flags1, REG_FLAGS1(iobase));
+
+               /* atr is present (which doesnt mean it's valid) */
+               set_bit(IS_ATR_PRESENT, &dev->flags);
+               if (dev->atr[0] == 0x03)
+                       str_invert_revert(dev->atr, dev->atr_len);
+               atrc = parse_atr(dev);
+               if (atrc == 0) {        /* atr invalid */
+                       dev->mdelay = 0;
+                       dev->mstate = M_BAD_CARD;
+               } else {
+                       dev->mdelay = T_50MSEC;
+                       dev->mstate = M_ATR_PRESENT;
+                       set_bit(IS_ATR_VALID, &dev->flags);
+               }
+
+               if (test_bit(IS_ATR_VALID, &dev->flags) == 1) {
+                       DEBUGP(4, dev, "monitor_card: ATR valid\n");
+                       /* if ta1 == 0x11, no PPS necessary (default values) */
+                       /* do not do PPS with multi protocol cards */
+                       if ((test_bit(IS_AUTOPPS_ACT, &dev->flags) == 0) &&
+                           (dev->ta1 != 0x11) &&
+                           !(test_bit(IS_ANY_T0, &dev->flags) &&
+                           test_bit(IS_ANY_T1, &dev->flags))) {
+                               DEBUGP(4, dev, "Perform AUTOPPS\n");
+                               set_bit(IS_AUTOPPS_ACT, &dev->flags);
+                               ptsreq.protocol = ptsreq.protocol =
+                                   (0x01 << dev->proto);
+                               ptsreq.flags = 0x01;
+                               ptsreq.pts1 = 0x00;
+                               ptsreq.pts2 = 0x00;
+                               ptsreq.pts3 = 0x00;
+                               if (set_protocol(dev, &ptsreq) == 0) {
+                                       DEBUGP(4, dev, "AUTOPPS ret SUCC\n");
+                                       clear_bit(IS_AUTOPPS_ACT, &dev->flags);
+                                       wake_up_interruptible(&dev->atrq);
+                               } else {
+                                       DEBUGP(4, dev, "AUTOPPS failed: "
+                                              "repower using defaults\n");
+                                       /* prepare for repowering  */
+                                       clear_bit(IS_ATR_PRESENT, &dev->flags);
+                                       clear_bit(IS_ATR_VALID, &dev->flags);
+                                       dev->rlen =
+                                           dev->rpos =
+                                           dev->atr_csum =
+                                           dev->atr_len_retry = dev->cwarn = 0;
+                                       dev->mstate = M_FETCH_ATR;
+
+                                       dev->mdelay = T_50MSEC;
+                               }
+                       } else {
+                               /* for cards which use slightly different
+                                * params (extra guard time) */
+                               set_cardparameter(dev);
+                               if (test_bit(IS_AUTOPPS_ACT, &dev->flags) == 1)
+                                       DEBUGP(4, dev, "AUTOPPS already active "
+                                              "2nd try:use default values\n");
+                               if (dev->ta1 == 0x11)
+                                       DEBUGP(4, dev, "No AUTOPPS necessary "
+                                              "TA(1)==0x11\n");
+                               if (test_bit(IS_ANY_T0, &dev->flags)
+                                   && test_bit(IS_ANY_T1, &dev->flags))
+                                       DEBUGP(4, dev, "Do NOT perform AUTOPPS "
+                                              "with multiprotocol cards\n");
+                               clear_bit(IS_AUTOPPS_ACT, &dev->flags);
+                               wake_up_interruptible(&dev->atrq);
+                       }
+               } else {
+                       DEBUGP(4, dev, "ATR invalid\n");
+                       wake_up_interruptible(&dev->atrq);
+               }
+               break;
+       case M_BAD_CARD:
+               DEBUGP(4, dev, "M_BAD_CARD\n");
+               /* slow down warning, but prompt immediately after insertion */
+               if (dev->cwarn == 0 || dev->cwarn == 10) {
+                       set_bit(IS_BAD_CARD, &dev->flags);
+                       printk(KERN_WARNING MODULE_NAME ": device %s: ",
+                              dev->node.dev_name);
+                       if (test_bit(IS_BAD_CSUM, &dev->flags)) {
+                               DEBUGP(4, dev, "ATR checksum (0x%.2x, should "
+                                      "be zero) failed\n", dev->atr_csum);
+                       }
+#ifdef PCMCIA_DEBUG
+                       else if (test_bit(IS_BAD_LENGTH, &dev->flags)) {
+                               DEBUGP(4, dev, "ATR length error\n");
+                       } else {
+                               DEBUGP(4, dev, "card damaged or wrong way "
+                                       "inserted\n");
+                       }
+#endif
+                       dev->cwarn = 0;
+                       wake_up_interruptible(&dev->atrq);      /* wake open */
+               }
+               dev->cwarn++;
+               dev->mdelay = T_100MSEC;
+               dev->mstate = M_FETCH_ATR;
+               break;
+       default:
+               DEBUGP(7, dev, "Unknown action\n");
+               break;          /* nothing */
+       }
+
+release_io:
+       DEBUGP(7, dev, "release_io\n");
+       clear_bit(LOCK_IO, &dev->flags);
+       wake_up_interruptible(&dev->ioq);       /* whoever needs IO */
+
+return_with_timer:
+       DEBUGP(7, dev, "<- monitor_card (returns with timer)\n");
+       dev->timer.expires = jiffies + dev->mdelay;
+       add_timer(&dev->timer);
+       clear_bit(LOCK_MONITOR, &dev->flags);
+}
+
+/* Interface to userland (file_operations) */
+
+static ssize_t cmm_read(struct file *filp, __user char *buf, size_t count,
+                       loff_t *ppos)
+{
+       struct cm4000_dev *dev = filp->private_data;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+       ssize_t rc;
+       int i, j, k;
+
+       DEBUGP(2, dev, "-> cmm_read(%s,%d)\n", current->comm, current->pid);
+
+       if (count == 0)         /* according to manpage */
+               return 0;
+
+       if ((dev->link.state & DEV_PRESENT) == 0 ||     /* socket removed */
+           test_bit(IS_CMM_ABSENT, &dev->flags))
+               return -ENODEV;
+
+       if (test_bit(IS_BAD_CSUM, &dev->flags))
+               return -EIO;
+
+       /* also see the note about this in cmm_write */
+       if (wait_event_interruptible
+           (dev->atrq,
+            ((filp->f_flags & O_NONBLOCK)
+             || (test_bit(IS_ATR_PRESENT, (void *)&dev->flags) != 0)))) {
+               if (filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+               return -ERESTARTSYS;
+       }
+
+       if (test_bit(IS_ATR_VALID, &dev->flags) == 0)
+               return -EIO;
+
+       /* this one implements blocking IO */
+       if (wait_event_interruptible
+           (dev->readq,
+            ((filp->f_flags & O_NONBLOCK) || (dev->rpos < dev->rlen)))) {
+               if (filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+               return -ERESTARTSYS;
+       }
+
+       /* lock io */
+       if (wait_event_interruptible
+           (dev->ioq,
+            ((filp->f_flags & O_NONBLOCK)
+             || (test_and_set_bit(LOCK_IO, (void *)&dev->flags) == 0)))) {
+               if (filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+               return -ERESTARTSYS;
+       }
+
+       rc = 0;
+       dev->flags0 = inb(REG_FLAGS0(iobase));
+       if ((dev->flags0 & 1) == 0      /* no smartcard inserted */
+           || dev->flags0 == 0xff) {   /* no cardman inserted */
+               clear_bit(IS_ATR_VALID, &dev->flags);
+               if (dev->flags0 & 1) {
+                       set_bit(IS_CMM_ABSENT, &dev->flags);
+                       rc = -ENODEV;
+               }
+               rc = -EIO;
+               goto release_io;
+       }
+
+       DEBUGP(4, dev, "begin read answer\n");
+       j = min(count, (size_t)(dev->rlen - dev->rpos));
+       k = dev->rpos;
+       if (k + j > 255)
+               j = 256 - k;
+       DEBUGP(4, dev, "read1 j=%d\n", j);
+       for (i = 0; i < j; i++) {
+               xoutb(k++, REG_BUF_ADDR(iobase));
+               dev->rbuf[i] = xinb(REG_BUF_DATA(iobase));
+       }
+       j = min(count, (size_t)(dev->rlen - dev->rpos));
+       if (k + j > 255) {
+               DEBUGP(4, dev, "read2 j=%d\n", j);
+               dev->flags1 |= 0x10;    /* MSB buf addr set */
+               xoutb(dev->flags1, REG_FLAGS1(iobase));
+               for (; i < j; i++) {
+                       xoutb(k++, REG_BUF_ADDR(iobase));
+                       dev->rbuf[i] = xinb(REG_BUF_DATA(iobase));
+               }
+       }
+
+       if (dev->proto == 0 && count > dev->rlen - dev->rpos) {
+               DEBUGP(4, dev, "T=0 and count > buffer\n");
+               dev->rbuf[i] = dev->rbuf[i - 1];
+               dev->rbuf[i - 1] = dev->procbyte;
+               j++;
+       }
+       count = j;
+
+       dev->rpos = dev->rlen + 1;
+
+       /* Clear T1Active */
+       DEBUGP(4, dev, "Clear T1Active\n");
+       dev->flags1 &= 0xdf;
+       xoutb(dev->flags1, REG_FLAGS1(iobase));
+
+       xoutb(0, REG_FLAGS1(iobase));   /* clear detectCMM */
+       /* last check before exit */
+       if (!io_detect_cm4000(iobase, dev))
+               count = -ENODEV;
+
+       if (test_bit(IS_INVREV, &dev->flags) && count > 0)
+               str_invert_revert(dev->rbuf, count);
+
+       if (copy_to_user(buf, dev->rbuf, count))
+               return -EFAULT;
+
+release_io:
+       clear_bit(LOCK_IO, &dev->flags);
+       wake_up_interruptible(&dev->ioq);
+
+       DEBUGP(2, dev, "<- cmm_read returns: rc = %Zi\n",
+              (rc < 0 ? rc : count));
+       return rc < 0 ? rc : count;
+}
+
+static ssize_t cmm_write(struct file *filp, const char __user *buf,
+                        size_t count, loff_t *ppos)
+{
+       struct cm4000_dev *dev = (struct cm4000_dev *) filp->private_data;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+       unsigned short s;
+       unsigned char tmp;
+       unsigned char infolen;
+       unsigned char sendT0;
+       unsigned short nsend;
+       unsigned short nr;
+       ssize_t rc;
+       int i;
+
+       DEBUGP(2, dev, "-> cmm_write(%s,%d)\n", current->comm, current->pid);
+
+       if (count == 0)         /* according to manpage */
+               return 0;
+
+       if (dev->proto == 0 && count < 4) {
+               /* T0 must have at least 4 bytes */
+               DEBUGP(4, dev, "T0 short write\n");
+               return -EIO;
+       }
+
+       nr = count & 0x1ff;     /* max bytes to write */
+
+       sendT0 = dev->proto ? 0 : nr > 5 ? 0x08 : 0;
+
+       if ((dev->link.state & DEV_PRESENT) == 0 ||     /* socket removed */
+           test_bit(IS_CMM_ABSENT, &dev->flags))
+               return -ENODEV;
+
+       if (test_bit(IS_BAD_CSUM, &dev->flags)) {
+               DEBUGP(4, dev, "bad csum\n");
+               return -EIO;
+       }
+
+       /*
+        * wait for atr to become valid.
+        * note: it is important to lock this code. if we dont, the monitor
+        * could be run between test_bit and the the call the sleep on the
+        * atr-queue.  if *then* the monitor detects atr valid, it will wake up
+        * any process on the atr-queue, *but* since we have been interrupted,
+        * we do not yet sleep on this queue. this would result in a missed
+        * wake_up and the calling process would sleep forever (until
+        * interrupted).  also, do *not* restore_flags before sleep_on, because
+        * this could result in the same situation!
+        */
+       if (wait_event_interruptible
+           (dev->atrq,
+            ((filp->f_flags & O_NONBLOCK)
+             || (test_bit(IS_ATR_PRESENT, (void *)&dev->flags) != 0)))) {
+               if (filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+               return -ERESTARTSYS;
+       }
+
+       if (test_bit(IS_ATR_VALID, &dev->flags) == 0) { /* invalid atr */
+               DEBUGP(4, dev, "invalid ATR\n");
+               return -EIO;
+       }
+
+       /* lock io */
+       if (wait_event_interruptible
+           (dev->ioq,
+            ((filp->f_flags & O_NONBLOCK)
+             || (test_and_set_bit(LOCK_IO, (void *)&dev->flags) == 0)))) {
+               if (filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+               return -ERESTARTSYS;
+       }
+
+       if (copy_from_user(dev->sbuf, buf, ((count > 512) ? 512 : count)))
+               return -EFAULT;
+
+       rc = 0;
+       dev->flags0 = inb(REG_FLAGS0(iobase));
+       if ((dev->flags0 & 1) == 0      /* no smartcard inserted */
+           || dev->flags0 == 0xff) {   /* no cardman inserted */
+               clear_bit(IS_ATR_VALID, &dev->flags);
+               if (dev->flags0 & 1) {
+                       set_bit(IS_CMM_ABSENT, &dev->flags);
+                       rc = -ENODEV;
+               } else {
+                       DEBUGP(4, dev, "IO error\n");
+                       rc = -EIO;
+               }
+               goto release_io;
+       }
+
+       xoutb(0x80, REG_FLAGS0(iobase));        /* reset SM  */
+
+       if (!io_detect_cm4000(iobase, dev)) {
+               rc = -ENODEV;
+               goto release_io;
+       }
+
+       /* reflect T=0 send/read mode in flags1 */
+       dev->flags1 |= (sendT0);
+
+       set_cardparameter(dev);
+
+       /* dummy read, reset flag procedure received */
+       tmp = inb(REG_FLAGS1(iobase));
+
+       dev->flags1 = 0x20      /* T_Active */
+           | (sendT0)
+           | (test_bit(IS_INVREV, &dev->flags) ? 2 : 0)/* inverse parity  */
+           | (((dev->baudv - 1) & 0x0100) >> 8);       /* MSB-Baud */
+       DEBUGP(1, dev, "set dev->flags1 = 0x%.2x\n", dev->flags1);
+       xoutb(dev->flags1, REG_FLAGS1(iobase));
+
+       /* xmit data */
+       DEBUGP(4, dev, "Xmit data\n");
+       for (i = 0; i < nr; i++) {
+               if (i >= 256) {
+                       dev->flags1 = 0x20      /* T_Active */
+                           | (sendT0)  /* SendT0 */
+                               /* inverse parity: */
+                           | (test_bit(IS_INVREV, &dev->flags) ? 2 : 0)
+                           | (((dev->baudv - 1) & 0x0100) >> 8) /* MSB-Baud */
+                           | 0x10;     /* set address high */
+                       DEBUGP(4, dev, "dev->flags = 0x%.2x - set address "
+                              "high\n", dev->flags1);
+                       xoutb(dev->flags1, REG_FLAGS1(iobase));
+               }
+               if (test_bit(IS_INVREV, &dev->flags)) {
+                       DEBUGP(4, dev, "Apply inverse convention for 0x%.2x "
+                               "-> 0x%.2x\n", (unsigned char)dev->sbuf[i],
+                             invert_revert(dev->sbuf[i]));
+                       xoutb(i, REG_BUF_ADDR(iobase));
+                       xoutb(invert_revert(dev->sbuf[i]),
+                             REG_BUF_DATA(iobase));
+               } else {
+                       xoutb(i, REG_BUF_ADDR(iobase));
+                       xoutb(dev->sbuf[i], REG_BUF_DATA(iobase));
+               }
+       }
+       DEBUGP(4, dev, "Xmit done\n");
+
+       if (dev->proto == 0) {
+               /* T=0 proto: 0 byte reply  */
+               if (nr == 4) {
+                       DEBUGP(4, dev, "T=0 assumes 0 byte reply\n");
+                       xoutb(i, REG_BUF_ADDR(iobase));
+                       if (test_bit(IS_INVREV, &dev->flags))
+                               xoutb(0xff, REG_BUF_DATA(iobase));
+                       else
+                               xoutb(0x00, REG_BUF_DATA(iobase));
+               }
+
+               /* numSendBytes */
+               if (sendT0)
+                       nsend = nr;
+               else {
+                       if (nr == 4)
+                               nsend = 5;
+                       else {
+                               nsend = 5 + (unsigned char)dev->sbuf[4];
+                               if (dev->sbuf[4] == 0)
+                                       nsend += 0x100;
+                       }
+               }
+       } else
+               nsend = nr;
+
+       /* T0: output procedure byte */
+       if (test_bit(IS_INVREV, &dev->flags)) {
+               DEBUGP(4, dev, "T=0 set Procedure byte (inverse-reverse) "
+                      "0x%.2x\n", invert_revert(dev->sbuf[1]));
+               xoutb(invert_revert(dev->sbuf[1]), REG_NUM_BYTES(iobase));
+       } else {
+               DEBUGP(4, dev, "T=0 set Procedure byte 0x%.2x\n", dev->sbuf[1]);
+               xoutb(dev->sbuf[1], REG_NUM_BYTES(iobase));
+       }
+
+       DEBUGP(1, dev, "set NumSendBytes = 0x%.2x\n",
+              (unsigned char)(nsend & 0xff));
+       xoutb((unsigned char)(nsend & 0xff), REG_NUM_SEND(iobase));
+
+       DEBUGP(1, dev, "Trigger CARDMAN CONTROLLER (0x%.2x)\n",
+              0x40     /* SM_Active */
+             | (dev->flags0 & 2 ? 0 : 4)       /* power on if needed */
+             |(dev->proto ? 0x10 : 0x08)       /* T=1/T=0 */
+             |(nsend & 0x100) >> 8 /* MSB numSendBytes */ );
+       xoutb(0x40              /* SM_Active */
+             | (dev->flags0 & 2 ? 0 : 4)       /* power on if needed */
+             |(dev->proto ? 0x10 : 0x08)       /* T=1/T=0 */
+             |(nsend & 0x100) >> 8,    /* MSB numSendBytes */
+             REG_FLAGS0(iobase));
+
+       /* wait for xmit done */
+       if (dev->proto == 1) {
+               DEBUGP(4, dev, "Wait for xmit done\n");
+               for (i = 0; i < 1000; i++) {
+                       if (inb(REG_FLAGS0(iobase)) & 0x08)
+                               break;
+                       msleep_interruptible(10);
+               }
+               if (i == 1000) {
+                       DEBUGP(4, dev, "timeout waiting for xmit done\n");
+                       rc = -EIO;
+                       goto release_io;
+               }
+       }
+
+       /* T=1: wait for infoLen */
+
+       infolen = 0;
+       if (dev->proto) {
+               /* wait until infoLen is valid */
+               for (i = 0; i < 6000; i++) {    /* max waiting time of 1 min */
+                       io_read_num_rec_bytes(iobase, &s);
+                       if (s >= 3) {
+                               infolen = inb(REG_FLAGS1(iobase));
+                               DEBUGP(4, dev, "infolen=%d\n", infolen);
+                               break;
+                       }
+                       msleep_interruptible(10);
+               }
+               if (i == 6000) {
+                       DEBUGP(4, dev, "timeout waiting for infoLen\n");
+                       rc = -EIO;
+                       goto release_io;
+               }
+       } else
+               clear_bit(IS_PROCBYTE_PRESENT, &dev->flags);
+
+       /* numRecBytes | bit9 of numRecytes */
+       io_read_num_rec_bytes(iobase, &dev->rlen);
+       for (i = 0; i < 600; i++) {     /* max waiting time of 2 sec */
+               if (dev->proto) {
+                       if (dev->rlen >= infolen + 4)
+                               break;
+               }
+               msleep_interruptible(10);
+               /* numRecBytes | bit9 of numRecytes */
+               io_read_num_rec_bytes(iobase, &s);
+               if (s > dev->rlen) {
+                       DEBUGP(1, dev, "NumRecBytes inc (reset timeout)\n");
+                       i = 0;  /* reset timeout */
+                       dev->rlen = s;
+               }
+               /* T=0: we are done when numRecBytes doesn't
+                *      increment any more and NoProcedureByte
+                *      is set and numRecBytes == bytes sent + 6
+                *      (header bytes + data + 1 for sw2)
+                *      except when the card replies an error
+                *      which means, no data will be sent back.
+                */
+               else if (dev->proto == 0) {
+                       if ((inb(REG_BUF_ADDR(iobase)) & 0x80)) {
+                               /* no procedure byte received since last read */
+                               DEBUGP(1, dev, "NoProcedure byte set\n");
+                               /* i=0; */
+                       } else {
+                               /* procedure byte received since last read */
+                               DEBUGP(1, dev, "NoProcedure byte unset "
+                                       "(reset timeout)\n");
+                               dev->procbyte = inb(REG_FLAGS1(iobase));
+                               DEBUGP(1, dev, "Read procedure byte 0x%.2x\n",
+                                     dev->procbyte);
+                               i = 0;  /* resettimeout */
+                       }
+                       if (inb(REG_FLAGS0(iobase)) & 0x08) {
+                               DEBUGP(1, dev, "T0Done flag (read reply)\n");
+                               break;
+                       }
+               }
+               if (dev->proto)
+                       infolen = inb(REG_FLAGS1(iobase));
+       }
+       if (i == 600) {
+               DEBUGP(1, dev, "timeout waiting for numRecBytes\n");
+               rc = -EIO;
+               goto release_io;
+       } else {
+               if (dev->proto == 0) {
+                       DEBUGP(1, dev, "Wait for T0Done bit to be  set\n");
+                       for (i = 0; i < 1000; i++) {
+                               if (inb(REG_FLAGS0(iobase)) & 0x08)
+                                       break;
+                               msleep_interruptible(10);
+                       }
+                       if (i == 1000) {
+                               DEBUGP(1, dev, "timeout waiting for T0Done\n");
+                               rc = -EIO;
+                               goto release_io;
+                       }
+
+                       dev->procbyte = inb(REG_FLAGS1(iobase));
+                       DEBUGP(4, dev, "Read procedure byte 0x%.2x\n",
+                             dev->procbyte);
+
+                       io_read_num_rec_bytes(iobase, &dev->rlen);
+                       DEBUGP(4, dev, "Read NumRecBytes = %i\n", dev->rlen);
+
+               }
+       }
+       /* T=1: read offset=zero, T=0: read offset=after challenge */
+       dev->rpos = dev->proto ? 0 : nr == 4 ? 5 : nr > dev->rlen ? 5 : nr;
+       DEBUGP(4, dev, "dev->rlen = %i,  dev->rpos = %i, nr = %i\n",
+             dev->rlen, dev->rpos, nr);
+
+release_io:
+       DEBUGP(4, dev, "Reset SM\n");
+       xoutb(0x80, REG_FLAGS0(iobase));        /* reset SM */
+
+       if (rc < 0) {
+               DEBUGP(4, dev, "Write failed but clear T_Active\n");
+               dev->flags1 &= 0xdf;
+               xoutb(dev->flags1, REG_FLAGS1(iobase));
+       }
+
+       clear_bit(LOCK_IO, &dev->flags);
+       wake_up_interruptible(&dev->ioq);
+       wake_up_interruptible(&dev->readq);     /* tell read we have data */
+
+       /* ITSEC E2: clear write buffer */
+       memset((char *)dev->sbuf, 0, 512);
+
+       /* return error or actually written bytes */
+       DEBUGP(2, dev, "<- cmm_write\n");
+       return rc < 0 ? rc : nr;
+}
+
+static void start_monitor(struct cm4000_dev *dev)
+{
+       DEBUGP(3, dev, "-> start_monitor\n");
+       if (!dev->monitor_running) {
+               DEBUGP(5, dev, "create, init and add timer\n");
+               init_timer(&dev->timer);
+               dev->monitor_running = 1;
+               dev->timer.expires = jiffies;
+               dev->timer.data = (unsigned long) dev;
+               dev->timer.function = monitor_card;
+               add_timer(&dev->timer);
+       } else
+               DEBUGP(5, dev, "monitor already running\n");
+       DEBUGP(3, dev, "<- start_monitor\n");
+}
+
+static void stop_monitor(struct cm4000_dev *dev)
+{
+       DEBUGP(3, dev, "-> stop_monitor\n");
+       if (dev->monitor_running) {
+               DEBUGP(5, dev, "stopping monitor\n");
+               terminate_monitor(dev);
+               /* reset monitor SM */
+               clear_bit(IS_ATR_VALID, &dev->flags);
+               clear_bit(IS_ATR_PRESENT, &dev->flags);
+       } else
+               DEBUGP(5, dev, "monitor already stopped\n");
+       DEBUGP(3, dev, "<- stop_monitor\n");
+}
+
+static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+                    unsigned long arg)
+{
+       struct cm4000_dev *dev = filp->private_data;
+       ioaddr_t iobase = dev->link.io.BasePort1;
+       dev_link_t *link;
+       int size;
+       int rc;
+#ifdef PCMCIA_DEBUG
+       char *ioctl_names[CM_IOC_MAXNR + 1] = {
+               [_IOC_NR(CM_IOCGSTATUS)] "CM_IOCGSTATUS",
+               [_IOC_NR(CM_IOCGATR)] "CM_IOCGATR",
+               [_IOC_NR(CM_IOCARDOFF)] "CM_IOCARDOFF",
+               [_IOC_NR(CM_IOCSPTS)] "CM_IOCSPTS",
+               [_IOC_NR(CM_IOSDBGLVL)] "CM4000_DBGLVL",
+       };
+#endif
+       DEBUGP(3, dev, "cmm_ioctl(device=%d.%d) %s\n", imajor(inode),
+              iminor(inode), ioctl_names[_IOC_NR(cmd)]);
+
+       link = dev_table[iminor(inode)];
+       if (!(DEV_OK(link))) {
+               DEBUGP(4, dev, "DEV_OK false\n");
+               return -ENODEV;
+       }
+
+       if (test_bit(IS_CMM_ABSENT, &dev->flags)) {
+               DEBUGP(4, dev, "CMM_ABSENT flag set\n");
+               return -ENODEV;
+       }
+
+       if (_IOC_TYPE(cmd) != CM_IOC_MAGIC) {
+               DEBUGP(4, dev, "ioctype mismatch\n");
+               return -EINVAL;
+       }
+       if (_IOC_NR(cmd) > CM_IOC_MAXNR) {
+               DEBUGP(4, dev, "iocnr mismatch\n");
+               return -EINVAL;
+       }
+       size = _IOC_SIZE(cmd);
+       rc = 0;
+       DEBUGP(4, dev, "iocdir=%.4x iocr=%.4x iocw=%.4x iocsize=%d cmd=%.4x\n",
+             _IOC_DIR(cmd), _IOC_READ, _IOC_WRITE, size, cmd);
+
+       if (_IOC_DIR(cmd) & _IOC_READ) {
+               if (!access_ok(VERIFY_WRITE, (void *)arg, size))
+                       return -EFAULT;
+       }
+       if (_IOC_DIR(cmd) & _IOC_WRITE) {
+               if (!access_ok(VERIFY_READ, (void *)arg, size))
+                       return -EFAULT;
+       }
+
+       switch (cmd) {
+       case CM_IOCGSTATUS:
+               DEBUGP(4, dev, " ... in CM_IOCGSTATUS\n");
+               {
+                       int status;
+
+                       /* clear other bits, but leave inserted & powered as
+                        * they are */
+                       status = dev->flags0 & 3;
+                       if (test_bit(IS_ATR_PRESENT, &dev->flags))
+                               status |= CM_ATR_PRESENT;
+                       if (test_bit(IS_ATR_VALID, &dev->flags))
+                               status |= CM_ATR_VALID;
+                       if (test_bit(IS_CMM_ABSENT, &dev->flags))
+                               status |= CM_NO_READER;
+                       if (test_bit(IS_BAD_CARD, &dev->flags))
+                               status |= CM_BAD_CARD;
+                       if (copy_to_user((int *)arg, &status, sizeof(int)))
+                               return -EFAULT;
+               }
+               return 0;
+       case CM_IOCGATR:
+               DEBUGP(4, dev, "... in CM_IOCGATR\n");
+               {
+                       struct atreq *atreq = (struct atreq *) arg;
+                       int tmp;
+                       /* allow nonblocking io and being interrupted */
+                       if (wait_event_interruptible
+                           (dev->atrq,
+                            ((filp->f_flags & O_NONBLOCK)
+                             || (test_bit(IS_ATR_PRESENT, (void *)&dev->flags)
+                                 != 0)))) {
+                               if (filp->f_flags & O_NONBLOCK)
+                                       return -EAGAIN;
+                               return -ERESTARTSYS;
+                       }
+
+                       if (test_bit(IS_ATR_VALID, &dev->flags) == 0) {
+                               tmp = -1;
+                               if (copy_to_user(&(atreq->atr_len), &tmp,
+                                                sizeof(int)))
+                                       return -EFAULT;
+                       } else {
+                               if (copy_to_user(atreq->atr, dev->atr,
+                                                dev->atr_len))
+                                       return -EFAULT;
+
+                               tmp = dev->atr_len;
+                               if (copy_to_user(&(atreq->atr_len), &tmp, sizeof(int)))
+                                       return -EFAULT;
+                       }
+                       return 0;
+               }
+       case CM_IOCARDOFF:
+
+#ifdef PCMCIA_DEBUG
+               DEBUGP(4, dev, "... in CM_IOCARDOFF\n");
+               if (dev->flags0 & 0x01) {
+                       DEBUGP(4, dev, "    Card inserted\n");
+               } else {
+                       DEBUGP(2, dev, "    No card inserted\n");
+               }
+               if (dev->flags0 & 0x02) {
+                       DEBUGP(4, dev, "    Card powered\n");
+               } else {
+                       DEBUGP(2, dev, "    Card not powered\n");
+               }
+#endif
+
+               /* is a card inserted and powered? */
+               if ((dev->flags0 & 0x01) && (dev->flags0 & 0x02)) {
+
+                       /* get IO lock */
+                       if (wait_event_interruptible
+                           (dev->ioq,
+                            ((filp->f_flags & O_NONBLOCK)
+                             || (test_and_set_bit(LOCK_IO, (void *)&dev->flags)
+                                 == 0)))) {
+                               if (filp->f_flags & O_NONBLOCK)
+                                       return -EAGAIN;
+                               return -ERESTARTSYS;
+                       }
+                       /* Set Flags0 = 0x42 */
+                       DEBUGP(4, dev, "Set Flags0=0x42 \n");
+                       xoutb(0x42, REG_FLAGS0(iobase));
+                       clear_bit(IS_ATR_PRESENT, &dev->flags);
+                       clear_bit(IS_ATR_VALID, &dev->flags);
+                       dev->mstate = M_CARDOFF;
+                       clear_bit(LOCK_IO, &dev->flags);
+                       if (wait_event_interruptible
+                           (dev->atrq,
+                            ((filp->f_flags & O_NONBLOCK)
+                             || (test_bit(IS_ATR_VALID, (void *)&dev->flags) !=
+                                 0)))) {
+                               if (filp->f_flags & O_NONBLOCK)
+                                       return -EAGAIN;
+                               return -ERESTARTSYS;
+                       }
+               }
+               /* release lock */
+               clear_bit(LOCK_IO, &dev->flags);
+               wake_up_interruptible(&dev->ioq);
+
+               return 0;
+       case CM_IOCSPTS:
+               {
+                       struct ptsreq krnptsreq;
+
+                       if (copy_from_user(&krnptsreq, (struct ptsreq *) arg,
+                                          sizeof(struct ptsreq)))
+                               return -EFAULT;
+
+                       rc = 0;
+                       DEBUGP(4, dev, "... in CM_IOCSPTS\n");
+                       /* wait for ATR to get valid */
+                       if (wait_event_interruptible
+                           (dev->atrq,
+                            ((filp->f_flags & O_NONBLOCK)
+                             || (test_bit(IS_ATR_PRESENT, (void *)&dev->flags)
+                                 != 0)))) {
+                               if (filp->f_flags & O_NONBLOCK)
+                                       return -EAGAIN;
+                               return -ERESTARTSYS;
+                       }
+                       /* get IO lock */
+                       if (wait_event_interruptible
+                           (dev->ioq,
+                            ((filp->f_flags & O_NONBLOCK)
+                             || (test_and_set_bit(LOCK_IO, (void *)&dev->flags)
+                                 == 0)))) {
+                               if (filp->f_flags & O_NONBLOCK)
+                                       return -EAGAIN;
+                               return -ERESTARTSYS;
+                       }
+
+                       if ((rc = set_protocol(dev, &krnptsreq)) != 0) {
+                               /* auto power_on again */
+                               dev->mstate = M_FETCH_ATR;
+                               clear_bit(IS_ATR_VALID, &dev->flags);
+                       }
+                       /* release lock */
+                       clear_bit(LOCK_IO, &dev->flags);
+                       wake_up_interruptible(&dev->ioq);
+
+               }
+               return rc;
+#ifdef PCMCIA_DEBUG
+       case CM_IOSDBGLVL:      /* set debug log level */
+               {
+                       int old_pc_debug = 0;
+
+                       old_pc_debug = pc_debug;
+                       if (copy_from_user(&pc_debug, (int *)arg, sizeof(int)))
+                               return -EFAULT;
+
+                       if (old_pc_debug != pc_debug)
+                               DEBUGP(0, dev, "Changed debug log level "
+                                      "to %i\n", pc_debug);
+               }
+               return rc;
+#endif
+       default:
+               DEBUGP(4, dev, "... in default (unknown IOCTL code)\n");
+               return -EINVAL;
+       }
+}
+
+static int cmm_open(struct inode *inode, struct file *filp)
+{
+       struct cm4000_dev *dev;
+       dev_link_t *link;
+       int rc, minor = iminor(inode);
+
+       if (minor >= CM4000_MAX_DEV)
+               return -ENODEV;
+
+       link = dev_table[minor];
+       if (link == NULL || !(DEV_OK(link)))
+               return -ENODEV;
+
+       if (link->open)
+               return -EBUSY;
+
+       dev = link->priv;
+       filp->private_data = dev;
+
+       DEBUGP(2, dev, "-> cmm_open(device=%d.%d process=%s,%d)\n",
+             imajor(inode), minor, current->comm, current->pid);
+
+       /* init device variables, they may be "polluted" after close
+        * or, the device may never have been closed (i.e. open failed)
+        */
+
+       ZERO_DEV(dev);
+
+       /* opening will always block since the
+        * monitor will be started by open, which
+        * means we have to wait for ATR becoming
+        * vaild = block until valid (or card
+        * inserted)
+        */
+       if (filp->f_flags & O_NONBLOCK)
+               return -EAGAIN;
+
+       dev->mdelay = T_50MSEC;
+
+       /* start monitoring the cardstatus */
+       start_monitor(dev);
+
+       link->open = 1;         /* only one open per device */
+       rc = 0;
+
+       DEBUGP(2, dev, "<- cmm_open\n");
+       return nonseekable_open(inode, filp);
+}
+
+static int cmm_close(struct inode *inode, struct file *filp)
+{
+       struct cm4000_dev *dev;
+       dev_link_t *link;
+       int minor = iminor(inode);
+
+       if (minor >= CM4000_MAX_DEV)
+               return -ENODEV;
+
+       link = dev_table[minor];
+       if (link == NULL)
+               return -ENODEV;
+
+       dev = link->priv;
+
+       DEBUGP(2, dev, "-> cmm_close(maj/min=%d.%d)\n",
+              imajor(inode), minor);
+
+       stop_monitor(dev);
+
+       ZERO_DEV(dev);
+
+       link->open = 0;         /* only one open per device */
+       wake_up(&dev->devq);    /* socket removed? */
+
+       DEBUGP(2, dev, "cmm_close\n");
+       return 0;
+}
+
+static void cmm_cm4000_release(dev_link_t * link)
+{
+       struct cm4000_dev *dev = link->priv;
+
+       /* dont terminate the monitor, rather rely on
+        * close doing that for us.
+        */
+       DEBUGP(3, dev, "-> cmm_cm4000_release\n");
+       while (link->open) {
+               printk(KERN_INFO MODULE_NAME ": delaying release until "
+                      "process has terminated\n");
+               /* note: don't interrupt us:
+                * close the applications which own
+                * the devices _first_ !
+                */
+               wait_event(dev->devq, (link->open == 0));
+       }
+       /* dev->devq=NULL;      this cannot be zeroed earlier */
+       DEBUGP(3, dev, "<- cmm_cm4000_release\n");
+       return;
+}
+
+/*==== Interface to PCMCIA Layer =======================================*/
+
+static void cm4000_config(dev_link_t * link, int devno)
+{
+       client_handle_t handle = link->handle;
+       struct cm4000_dev *dev;
+       tuple_t tuple;
+       cisparse_t parse;
+       config_info_t conf;
+       u_char buf[64];
+       int fail_fn, fail_rc;
+       int rc;
+
+       /* read the config-tuples */
+       tuple.DesiredTuple = CISTPL_CONFIG;
+       tuple.Attributes = 0;
+       tuple.TupleData = buf;
+       tuple.TupleDataMax = sizeof(buf);
+       tuple.TupleOffset = 0;
+
+       if ((fail_rc = pcmcia_get_first_tuple(handle, &tuple)) != CS_SUCCESS) {
+               fail_fn = GetFirstTuple;
+               goto cs_failed;
+       }
+       if ((fail_rc = pcmcia_get_tuple_data(handle, &tuple)) != CS_SUCCESS) {
+               fail_fn = GetTupleData;
+               goto cs_failed;
+       }
+       if ((fail_rc =
+            pcmcia_parse_tuple(handle, &tuple, &parse)) != CS_SUCCESS) {
+               fail_fn = ParseTuple;
+               goto cs_failed;
+       }
+       if ((fail_rc =
+            pcmcia_get_configuration_info(handle, &conf)) != CS_SUCCESS) {
+               fail_fn = GetConfigurationInfo;
+               goto cs_failed;
+       }
+
+       link->state |= DEV_CONFIG;
+       link->conf.ConfigBase = parse.config.base;
+       link->conf.Present = parse.config.rmask[0];
+       link->conf.Vcc = conf.Vcc;
+
+       link->io.BasePort2 = 0;
+       link->io.NumPorts2 = 0;
+       link->io.Attributes2 = 0;
+       tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+       for (rc = pcmcia_get_first_tuple(handle, &tuple);
+            rc == CS_SUCCESS; rc = pcmcia_get_next_tuple(handle, &tuple)) {
+
+               rc = pcmcia_get_tuple_data(handle, &tuple);
+               if (rc != CS_SUCCESS)
+                       continue;
+               rc = pcmcia_parse_tuple(handle, &tuple, &parse);
+               if (rc != CS_SUCCESS)
+                       continue;
+
+               link->conf.ConfigIndex = parse.cftable_entry.index;
+
+               if (!parse.cftable_entry.io.nwin)
+                       continue;
+
+               /* Get the IOaddr */
+               link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
+               link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
+               link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+               if (!(parse.cftable_entry.io.flags & CISTPL_IO_8BIT))
+                       link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+               if (!(parse.cftable_entry.io.flags & CISTPL_IO_16BIT))
+                       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+               link->io.IOAddrLines = parse.cftable_entry.io.flags
+                   & CISTPL_IO_LINES_MASK;
+
+               rc = pcmcia_request_io(handle, &link->io);
+               if (rc == CS_SUCCESS)
+                       break;  /* we are done */
+       }
+       if (rc != CS_SUCCESS)
+               goto cs_release;
+
+       link->conf.IntType = 00000002;
+
+       if ((fail_rc =
+            pcmcia_request_configuration(handle, &link->conf)) != CS_SUCCESS) {
+               fail_fn = RequestConfiguration;
+               goto cs_release;
+       }
+
+       dev = link->priv;
+       sprintf(dev->node.dev_name, DEVICE_NAME "%d", devno);
+       dev->node.major = major;
+       dev->node.minor = devno;
+       dev->node.next = NULL;
+       link->dev = &dev->node;
+       link->state &= ~DEV_CONFIG_PENDING;
+
+       return;
+
+cs_failed:
+       cs_error(handle, fail_fn, fail_rc);
+cs_release:
+       cm4000_release(link);
+
+       link->state &= ~DEV_CONFIG_PENDING;
+}
+
+static int cm4000_event(event_t event, int priority,
+                       event_callback_args_t *args)
+{
+       dev_link_t *link;
+       struct cm4000_dev *dev;
+       int devno;
+
+       link = args->client_data;
+       dev = link->priv;
+
+       DEBUGP(3, dev, "-> cm4000_event\n");
+       for (devno = 0; devno < CM4000_MAX_DEV; devno++)
+               if (dev_table[devno] == link)
+                       break;
+
+       if (devno == CM4000_MAX_DEV)
+               return CS_BAD_ADAPTER;
+
+       switch (event) {
+       case CS_EVENT_CARD_INSERTION:
+               DEBUGP(5, dev, "CS_EVENT_CARD_INSERTION\n");
+               link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+               cm4000_config(link, devno);
+               break;
+       case CS_EVENT_CARD_REMOVAL:
+               DEBUGP(5, dev, "CS_EVENT_CARD_REMOVAL\n");
+               link->state &= ~DEV_PRESENT;
+               stop_monitor(dev);
+               break;
+       case CS_EVENT_PM_SUSPEND:
+               DEBUGP(5, dev, "CS_EVENT_PM_SUSPEND "
+                     "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
+               link->state |= DEV_SUSPEND;
+               /* fall-through */
+       case CS_EVENT_RESET_PHYSICAL:
+               DEBUGP(5, dev, "CS_EVENT_RESET_PHYSICAL\n");
+               if (link->state & DEV_CONFIG) {
+                       DEBUGP(5, dev, "ReleaseConfiguration\n");
+                       pcmcia_release_configuration(link->handle);
+               }
+               stop_monitor(dev);
+               break;
+       case CS_EVENT_PM_RESUME:
+               DEBUGP(5, dev, "CS_EVENT_PM_RESUME "
+                     "(fall-through to CS_EVENT_CARD_RESET)\n");
+               link->state &= ~DEV_SUSPEND;
+               /* fall-through */
+       case CS_EVENT_CARD_RESET:
+               DEBUGP(5, dev, "CS_EVENT_CARD_RESET\n");
+               if ((link->state & DEV_CONFIG)) {
+                       DEBUGP(5, dev, "RequestConfiguration\n");
+                       pcmcia_request_configuration(link->handle, &link->conf);
+               }
+               if (link->open)
+                       start_monitor(dev);
+               break;
+       default:
+               DEBUGP(5, dev, "unknown event %.2x\n", event);
+               break;
+       }
+       DEBUGP(3, dev, "<- cm4000_event\n");
+       return CS_SUCCESS;
+}
+
+static void cm4000_release(dev_link_t *link)
+{
+       cmm_cm4000_release(link->priv); /* delay release until device closed */
+       pcmcia_release_configuration(link->handle);
+       pcmcia_release_io(link->handle, &link->io);
+}
+
+static dev_link_t *cm4000_attach(void)
+{
+       struct cm4000_dev *dev;
+       dev_link_t *link;
+       client_reg_t client_reg;
+       int i;
+
+       for (i = 0; i < CM4000_MAX_DEV; i++)
+               if (dev_table[i] == NULL)
+                       break;
+
+       if (i == CM4000_MAX_DEV) {
+               printk(KERN_NOTICE MODULE_NAME ": all devices in use\n");
+               return NULL;
+       }
+
+       /* create a new cm4000_cs device */
+       dev = kzalloc(sizeof(struct cm4000_dev), GFP_KERNEL);
+       if (dev == NULL)
+               return NULL;
+
+       link = &dev->link;
+       link->priv = dev;
+       link->conf.IntType = INT_MEMORY_AND_IO;
+       dev_table[i] = link;
+
+       /* register with card services */
+       client_reg.dev_info = &dev_info;
+       client_reg.EventMask =
+           CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
+           CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
+           CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
+       client_reg.Version = 0x0210;
+       client_reg.event_callback_args.client_data = link;
+
+       i = pcmcia_register_client(&link->handle, &client_reg);
+       if (i) {
+               cs_error(link->handle, RegisterClient, i);
+               cm4000_detach(link);
+               return NULL;
+       }
+
+       init_waitqueue_head(&dev->devq);
+       init_waitqueue_head(&dev->ioq);
+       init_waitqueue_head(&dev->atrq);
+       init_waitqueue_head(&dev->readq);
+
+       return link;
+}
+
+static void cm4000_detach_by_devno(int devno, dev_link_t * link)
+{
+       struct cm4000_dev *dev = link->priv;
+
+       DEBUGP(3, dev, "-> detach_by_devno(devno=%d)\n", devno);
+
+       if (link->state & DEV_CONFIG) {
+               DEBUGP(5, dev, "device still configured (try to release it)\n");
+               cm4000_release(link);
+       }
+
+       if (link->handle) {
+               pcmcia_deregister_client(link->handle);
+       }
+
+       dev_table[devno] = NULL;
+       kfree(dev);
+       return;
+}
+
+static void cm4000_detach(dev_link_t * link)
+{
+       int i;
+
+       /* find device */
+       for (i = 0; i < CM4000_MAX_DEV; i++)
+               if (dev_table[i] == link)
+                       break;
+
+       if (i == CM4000_MAX_DEV)
+               return;
+
+       cm4000_detach_by_devno(i, link);
+       return;
+}
+
+static struct file_operations cm4000_fops = {
+       .owner  = THIS_MODULE,
+       .read   = cmm_read,
+       .write  = cmm_write,
+       .ioctl  = cmm_ioctl,
+       .open   = cmm_open,
+       .release= cmm_close,
+};
+
+static struct pcmcia_device_id cm4000_ids[] = {
+       PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0002),
+       PCMCIA_DEVICE_PROD_ID12("CardMan", "4000", 0x2FB368CA, 0xA2BD8C39),
+       PCMCIA_DEVICE_NULL,
+};
+MODULE_DEVICE_TABLE(pcmcia, cm4000_ids);
+
+static struct pcmcia_driver cm4000_driver = {
+       .owner    = THIS_MODULE,
+       .drv      = {
+               .name = "cm4000_cs",
+               },
+       .attach   = cm4000_attach,
+       .detach   = cm4000_detach,
+       .event    = cm4000_event,
+       .id_table = cm4000_ids,
+};
+
+static int __init cmm_init(void)
+{
+       printk(KERN_INFO "%s\n", version);
+       pcmcia_register_driver(&cm4000_driver);
+       major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
+       if (major < 0) {
+               printk(KERN_WARNING MODULE_NAME
+                       ": could not get major number\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+static void __exit cmm_exit(void)
+{
+       int i;
+
+       printk(KERN_INFO MODULE_NAME ": unloading\n");
+       pcmcia_unregister_driver(&cm4000_driver);
+       for (i = 0; i < CM4000_MAX_DEV; i++)
+               if (dev_table[i])
+                       cm4000_detach_by_devno(i, dev_table[i]);
+       unregister_chrdev(major, DEVICE_NAME);
+};
+
+module_init(cmm_init);
+module_exit(cmm_exit);
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
new file mode 100644 (file)
index 0000000..4c698d9
--- /dev/null
@@ -0,0 +1,841 @@
+/*
+ * A driver for the Omnikey PCMCIA smartcard reader CardMan 4040
+ *
+ * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
+ *
+ * (C) 2005 Harald Welte <laforge@gnumonks.org>
+ *     - add support for poll()
+ *     - driver cleanup
+ *     - add waitqueues
+ *     - adhere to linux kernel coding style and policies
+ *     - support 2.6.13 "new style" pcmcia interface
+ *
+ * The device basically is a USB CCID compliant device that has been
+ * attached to an I/O-Mapped FIFO.
+ *
+ * All rights reserved, Dual BSD/GPL Licensed.
+ */
+
+/* #define PCMCIA_DEBUG 6 */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/delay.h>
+#include <linux/poll.h>
+#include <linux/wait.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#include <pcmcia/cs_types.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ciscode.h>
+#include <pcmcia/ds.h>
+
+#include "cm4040_cs.h"
+
+
+#ifdef PCMCIA_DEBUG
+#define reader_to_dev(x)       (&handle_to_dev(x->link.handle))
+static int pc_debug = PCMCIA_DEBUG;
+module_param(pc_debug, int, 0600);
+#define DEBUGP(n, rdr, x, args...) do {                                \
+       if (pc_debug >= (n))                                            \
+               dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x,     \
+                          __FUNCTION__ , ##args);                      \
+       } while (0)
+#else
+#define DEBUGP(n, rdr, x, args...)
+#endif
+
+static char *version =
+"OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte";
+
+#define        CCID_DRIVER_BULK_DEFAULT_TIMEOUT        (150*HZ)
+#define        CCID_DRIVER_ASYNC_POWERUP_TIMEOUT       (35*HZ)
+#define        CCID_DRIVER_MINIMUM_TIMEOUT             (3*HZ)
+#define READ_WRITE_BUFFER_SIZE 512
+#define POLL_LOOP_COUNT                                1000
+
+/* how often to poll for fifo status change */
+#define POLL_PERIOD                            msecs_to_jiffies(10)
+
+static void reader_release(dev_link_t *link);
+static void reader_detach(dev_link_t *link);
+
+static int major;
+
+#define                BS_READABLE     0x01
+#define                BS_WRITABLE     0x02
+
+struct reader_dev {
+       dev_link_t              link;
+       dev_node_t              node;
+       wait_queue_head_t       devq;
+       wait_queue_head_t       poll_wait;
+       wait_queue_head_t       read_wait;
+       wait_queue_head_t       write_wait;
+       unsigned long           buffer_status;
+       unsigned long           timeout;
+       unsigned char           s_buf[READ_WRITE_BUFFER_SIZE];
+       unsigned char           r_buf[READ_WRITE_BUFFER_SIZE];
+       struct timer_list       poll_timer;
+};
+
+static dev_info_t dev_info = MODULE_NAME;
+static dev_link_t *dev_table[CM_MAX_DEV];
+
+#ifndef PCMCIA_DEBUG
+#define        xoutb   outb
+#define        xinb    inb
+#else
+static inline void xoutb(unsigned char val, unsigned short port)
+{
+       if (pc_debug >= 7)
+               printk(KERN_DEBUG "outb(val=%.2x,port=%.4x)\n", val, port);
+       outb(val, port);
+}
+
+static inline unsigned char xinb(unsigned short port)
+{
+       unsigned char val;
+
+       val = inb(port);
+       if (pc_debug >= 7)
+               printk(KERN_DEBUG "%.2x=inb(%.4x)\n", val, port);
+       return val;
+}
+#endif
+
+/* poll the device fifo status register.  not to be confused with
+ * the poll syscall. */
+static void cm4040_do_poll(unsigned long dummy)
+{
+       struct reader_dev *dev = (struct reader_dev *) dummy;
+       unsigned int obs = xinb(dev->link.io.BasePort1
+                               + REG_OFFSET_BUFFER_STATUS);
+
+       if ((obs & BSR_BULK_IN_FULL)) {
+               set_bit(BS_READABLE, &dev->buffer_status);
+               DEBUGP(4, dev, "waking up read_wait\n");
+               wake_up_interruptible(&dev->read_wait);
+       } else
+               clear_bit(BS_READABLE, &dev->buffer_status);
+
+       if (!(obs & BSR_BULK_OUT_FULL)) {
+               set_bit(BS_WRITABLE, &dev->buffer_status);
+               DEBUGP(4, dev, "waking up write_wait\n");
+               wake_up_interruptible(&dev->write_wait);
+       } else
+               clear_bit(BS_WRITABLE, &dev->buffer_status);
+
+       if (dev->buffer_status)
+               wake_up_interruptible(&dev->poll_wait);
+
+       mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);
+}
+
+static void cm4040_stop_poll(struct reader_dev *dev)
+{
+       del_timer_sync(&dev->poll_timer);
+}
+
+static int wait_for_bulk_out_ready(struct reader_dev *dev)
+{
+       int i, rc;
+       int iobase = dev->link.io.BasePort1;
+
+       for (i = 0; i < POLL_LOOP_COUNT; i++) {
+               if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
+                   & BSR_BULK_OUT_FULL) == 0) {
+                       DEBUGP(4, dev, "BulkOut empty (i=%d)\n", i);
+                       return 1;
+               }
+       }
+
+       DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",
+               dev->timeout);
+       rc = wait_event_interruptible_timeout(dev->write_wait,
+                                             test_and_clear_bit(BS_WRITABLE,
+                                                      &dev->buffer_status),
+                                             dev->timeout);
+
+       if (rc > 0)
+               DEBUGP(4, dev, "woke up: BulkOut empty\n");
+       else if (rc == 0)
+               DEBUGP(4, dev, "woke up: BulkOut full, returning 0 :(\n");
+       else if (rc < 0)
+               DEBUGP(4, dev, "woke up: signal arrived\n");
+
+       return rc;
+}
+
+/* Write to Sync Control Register */
+static int write_sync_reg(unsigned char val, struct reader_dev *dev)
+{
+       int iobase = dev->link.io.BasePort1;
+       int rc;
+
+       rc = wait_for_bulk_out_ready(dev);
+       if (rc <= 0)
+               return rc;
+
+       xoutb(val, iobase + REG_OFFSET_SYNC_CONTROL);
+       rc = wait_for_bulk_out_ready(dev);
+       if (rc <= 0)
+               return rc;
+
+       return 1;
+}
+
+static int wait_for_bulk_in_ready(struct reader_dev *dev)
+{
+       int i, rc;
+       int iobase = dev->link.io.BasePort1;
+
+       for (i = 0; i < POLL_LOOP_COUNT; i++) {
+               if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
+                   & BSR_BULK_IN_FULL) == BSR_BULK_IN_FULL) {
+                       DEBUGP(3, dev, "BulkIn full (i=%d)\n", i);
+                       return 1;
+               }
+       }
+
+       DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",
+               dev->timeout);
+       rc = wait_event_interruptible_timeout(dev->read_wait,
+                                             test_and_clear_bit(BS_READABLE,
+                                                       &dev->buffer_status),
+                                             dev->timeout);
+       if (rc > 0)
+               DEBUGP(4, dev, "woke up: BulkIn full\n");
+       else if (rc == 0)
+               DEBUGP(4, dev, "woke up: BulkIn not full, returning 0 :(\n");
+       else if (rc < 0)
+               DEBUGP(4, dev, "woke up: signal arrived\n");
+
+       return rc;
+}
+
+static ssize_t cm4040_read(struct file *filp, char __user *buf,
+                       size_t count, loff_t *ppos)
+{
+       struct reader_dev *dev = filp->private_data;
+       int iobase = dev->link.io.BasePort1;
+       size_t bytes_to_read;
+       unsigned long i;
+       size_t min_bytes_to_read;
+       int rc;
+       unsigned char uc;
+
+       DEBUGP(2, dev, "-> cm4040_read(%s,%d)\n", current->comm, current->pid);
+
+       if (count == 0)
+               return 0;
+
+       if (count < 10)
+               return -EFAULT;
+
+       if (filp->f_flags & O_NONBLOCK) {
+               DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
+               DEBUGP(2, dev, "<- cm4040_read (failure)\n");
+               return -EAGAIN;
+       }
+
+       if ((dev->link.state & DEV_PRESENT)==0)
+               return -ENODEV;
+
+       for (i = 0; i < 5; i++) {
+               rc = wait_for_bulk_in_ready(dev);
+               if (rc <= 0) {
+                       DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
+                       DEBUGP(2, dev, "<- cm4040_read (failed)\n");
+                       if (rc == -ERESTARTSYS)
+                               return rc;
+                       return -EIO;
+               }
+               dev->r_buf[i] = xinb(iobase + REG_OFFSET_BULK_IN);
+#ifdef PCMCIA_DEBUG
+               if (pc_debug >= 6)
+                       printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);
+       }
+       printk("\n");
+#else
+       }
+#endif
+
+       bytes_to_read = 5 + le32_to_cpu(*(__le32 *)&dev->r_buf[1]);
+
+       DEBUGP(6, dev, "BytesToRead=%lu\n", bytes_to_read);
+
+       min_bytes_to_read = min(count, bytes_to_read + 5);
+
+       DEBUGP(6, dev, "Min=%lu\n", min_bytes_to_read);
+
+       for (i = 0; i < (min_bytes_to_read-5); i++) {
+               rc = wait_for_bulk_in_ready(dev);
+               if (rc <= 0) {
+                       DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
+                       DEBUGP(2, dev, "<- cm4040_read (failed)\n");
+                       if (rc == -ERESTARTSYS)
+                               return rc;
+                       return -EIO;
+               }
+               dev->r_buf[i+5] = xinb(iobase + REG_OFFSET_BULK_IN);
+#ifdef PCMCIA_DEBUG
+               if (pc_debug >= 6)
+                       printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);
+       }
+       printk("\n");
+#else
+       }
+#endif
+
+       *ppos = min_bytes_to_read;
+       if (copy_to_user(buf, dev->r_buf, min_bytes_to_read))
+               return -EFAULT;
+
+       rc = wait_for_bulk_in_ready(dev);
+       if (rc <= 0) {
+               DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
+               DEBUGP(2, dev, "<- cm4040_read (failed)\n");
+               if (rc == -ERESTARTSYS)
+                       return rc;
+               return -EIO;
+       }
+
+       rc = write_sync_reg(SCR_READER_TO_HOST_DONE, dev);
+       if (rc <= 0) {
+               DEBUGP(5, dev, "write_sync_reg c=%.2x\n", rc);
+               DEBUGP(2, dev, "<- cm4040_read (failed)\n");
+               if (rc == -ERESTARTSYS)
+                       return rc;
+               else
+                       return -EIO;
+       }
+
+       uc = xinb(iobase + REG_OFFSET_BULK_IN);
+
+       DEBUGP(2, dev, "<- cm4040_read (successfully)\n");
+       return min_bytes_to_read;
+}
+
+static ssize_t cm4040_write(struct file *filp, const char __user *buf,
+                        size_t count, loff_t *ppos)
+{
+       struct reader_dev *dev = filp->private_data;
+       int iobase = dev->link.io.BasePort1;
+       ssize_t rc;
+       int i;
+       unsigned int bytes_to_write;
+
+       DEBUGP(2, dev, "-> cm4040_write(%s,%d)\n", current->comm, current->pid);
+
+       if (count == 0) {
+               DEBUGP(2, dev, "<- cm4040_write empty read (successfully)\n");
+               return 0;
+       }
+
+       if (count < 5) {
+               DEBUGP(2, dev, "<- cm4040_write buffersize=%Zd < 5\n", count);
+               return -EIO;
+       }
+
+       if (filp->f_flags & O_NONBLOCK) {
+               DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
+               DEBUGP(4, dev, "<- cm4040_write (failure)\n");
+               return -EAGAIN;
+       }
+
+       if ((dev->link.state & DEV_PRESENT) == 0)
+               return -ENODEV;
+
+       bytes_to_write = count;
+       if (copy_from_user(dev->s_buf, buf, bytes_to_write))
+               return -EFAULT;
+
+       switch (dev->s_buf[0]) {
+               case CMD_PC_TO_RDR_XFRBLOCK:
+               case CMD_PC_TO_RDR_SECURE:
+               case CMD_PC_TO_RDR_TEST_SECURE:
+               case CMD_PC_TO_RDR_OK_SECURE:
+                       dev->timeout = CCID_DRIVER_BULK_DEFAULT_TIMEOUT;
+                       break;
+
+               case CMD_PC_TO_RDR_ICCPOWERON:
+                       dev->timeout = CCID_DRIVER_ASYNC_POWERUP_TIMEOUT;
+                       break;
+
+               case CMD_PC_TO_RDR_GETSLOTSTATUS:
+               case CMD_PC_TO_RDR_ICCPOWEROFF:
+               case CMD_PC_TO_RDR_GETPARAMETERS:
+               case CMD_PC_TO_RDR_RESETPARAMETERS:
+               case CMD_PC_TO_RDR_SETPARAMETERS:
+               case CMD_PC_TO_RDR_ESCAPE:
+               case CMD_PC_TO_RDR_ICCCLOCK:
+               default:
+                       dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;
+                       break;
+       }
+
+       rc = write_sync_reg(SCR_HOST_TO_READER_START, dev);
+       if (rc <= 0) {
+               DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);
+               DEBUGP(2, dev, "<- cm4040_write (failed)\n");
+               if (rc == -ERESTARTSYS)
+                       return rc;
+               else
+                       return -EIO;
+       }
+
+       DEBUGP(4, dev, "start \n");
+
+       for (i = 0; i < bytes_to_write; i++) {
+               rc = wait_for_bulk_out_ready(dev);
+               if (rc <= 0) {
+                       DEBUGP(5, dev, "wait_for_bulk_out_ready rc=%.2Zx\n",
+                              rc);
+                       DEBUGP(2, dev, "<- cm4040_write (failed)\n");
+                       if (rc == -ERESTARTSYS)
+                               return rc;
+                       else
+                               return -EIO;
+               }
+
+               xoutb(dev->s_buf[i],iobase + REG_OFFSET_BULK_OUT);
+       }
+       DEBUGP(4, dev, "end\n");
+
+       rc = write_sync_reg(SCR_HOST_TO_READER_DONE, dev);
+
+       if (rc <= 0) {
+               DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);
+               DEBUGP(2, dev, "<- cm4040_write (failed)\n");
+               if (rc == -ERESTARTSYS)
+                       return rc;
+               else
+                       return -EIO;
+       }
+
+       DEBUGP(2, dev, "<- cm4040_write (successfully)\n");
+       return count;
+}
+
+static unsigned int cm4040_poll(struct file *filp, poll_table *wait)
+{
+       struct reader_dev *dev = filp->private_data;
+       unsigned int mask = 0;
+
+       poll_wait(filp, &dev->poll_wait, wait);
+
+       if (test_and_clear_bit(BS_READABLE, &dev->buffer_status))
+               mask |= POLLIN | POLLRDNORM;
+       if (test_and_clear_bit(BS_WRITABLE, &dev->buffer_status))
+               mask |= POLLOUT | POLLWRNORM;
+
+       DEBUGP(2, dev, "<- cm4040_poll(%u)\n", mask);
+
+       return mask;
+}
+
+static int cm4040_open(struct inode *inode, struct file *filp)
+{
+       struct reader_dev *dev;
+       dev_link_t *link;
+       int minor = iminor(inode);
+
+       if (minor >= CM_MAX_DEV)
+               return -ENODEV;
+
+       link = dev_table[minor];
+       if (link == NULL || !(DEV_OK(link)))
+               return -ENODEV;
+
+       if (link->open)
+               return -EBUSY;
+
+       dev = link->priv;
+       filp->private_data = dev;
+
+       if (filp->f_flags & O_NONBLOCK) {
+               DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
+               return -EAGAIN;
+       }
+
+       link->open = 1;
+
+       dev->poll_timer.data = (unsigned long) dev;
+       mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);
+
+       DEBUGP(2, dev, "<- cm4040_open (successfully)\n");
+       return nonseekable_open(inode, filp);
+}
+
+static int cm4040_close(struct inode *inode, struct file *filp)
+{
+       struct reader_dev *dev = filp->private_data;
+       dev_link_t *link;
+       int minor = iminor(inode);
+
+       DEBUGP(2, dev, "-> cm4040_close(maj/min=%d.%d)\n", imajor(inode),
+             iminor(inode));
+
+       if (minor >= CM_MAX_DEV)
+               return -ENODEV;
+
+       link = dev_table[minor];
+       if (link == NULL)
+               return -ENODEV;
+
+       cm4040_stop_poll(dev);
+
+       link->open = 0;
+       wake_up(&dev->devq);
+
+       DEBUGP(2, dev, "<- cm4040_close\n");
+       return 0;
+}
+
+static void cm4040_reader_release(dev_link_t *link)
+{
+       struct reader_dev *dev = link->priv;
+
+       DEBUGP(3, dev, "-> cm4040_reader_release\n");
+       while (link->open) {
+               DEBUGP(3, dev, KERN_INFO MODULE_NAME ": delaying release "
+                      "until process has terminated\n");
+               wait_event(dev->devq, (link->open == 0));
+       }
+       DEBUGP(3, dev, "<- cm4040_reader_release\n");
+       return;
+}
+
+static void reader_config(dev_link_t *link, int devno)
+{
+       client_handle_t handle;
+       struct reader_dev *dev;
+       tuple_t tuple;
+       cisparse_t parse;
+       config_info_t conf;
+       u_char buf[64];
+       int fail_fn, fail_rc;
+       int rc;
+
+       handle = link->handle;
+
+       tuple.DesiredTuple = CISTPL_CONFIG;
+       tuple.Attributes = 0;
+       tuple.TupleData = buf;
+       tuple.TupleDataMax = sizeof(buf);
+       tuple.TupleOffset = 0;
+
+       if ((fail_rc = pcmcia_get_first_tuple(handle, &tuple)) != CS_SUCCESS) {
+               fail_fn = GetFirstTuple;
+               goto cs_failed;
+       }
+       if ((fail_rc = pcmcia_get_tuple_data(handle, &tuple)) != CS_SUCCESS) {
+               fail_fn = GetTupleData;
+               goto cs_failed;
+       }
+       if ((fail_rc = pcmcia_parse_tuple(handle, &tuple, &parse))
+                                                       != CS_SUCCESS) {
+               fail_fn = ParseTuple;
+               goto cs_failed;
+       }
+       if ((fail_rc = pcmcia_get_configuration_info(handle, &conf))
+                                                       != CS_SUCCESS) {
+               fail_fn = GetConfigurationInfo;
+               goto cs_failed;
+       }
+
+       link->state |= DEV_CONFIG;
+       link->conf.ConfigBase = parse.config.base;
+       link->conf.Present = parse.config.rmask[0];
+       link->conf.Vcc = conf.Vcc;
+
+       link->io.BasePort2 = 0;
+       link->io.NumPorts2 = 0;
+       link->io.Attributes2 = 0;
+       tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+       for (rc = pcmcia_get_first_tuple(handle, &tuple);
+            rc == CS_SUCCESS;
+            rc = pcmcia_get_next_tuple(handle, &tuple)) {
+               rc = pcmcia_get_tuple_data(handle, &tuple);
+               if (rc != CS_SUCCESS)
+                       continue;
+               rc = pcmcia_parse_tuple(handle, &tuple, &parse);
+               if (rc != CS_SUCCESS)
+                       continue;
+
+               link->conf.ConfigIndex = parse.cftable_entry.index;
+
+               if (!parse.cftable_entry.io.nwin)
+                       continue;
+
+               link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
+               link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
+               link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+               if (!(parse.cftable_entry.io.flags & CISTPL_IO_8BIT))
+                       link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+               if (!(parse.cftable_entry.io.flags & CISTPL_IO_16BIT))
+                       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+               link->io.IOAddrLines = parse.cftable_entry.io.flags
+                                               & CISTPL_IO_LINES_MASK;
+               rc = pcmcia_request_io(handle, &link->io);
+
+               dev_printk(KERN_INFO, &handle_to_dev(handle), "foo");
+               if (rc == CS_SUCCESS)
+                       break;
+               else
+                       dev_printk(KERN_INFO, &handle_to_dev(handle),
+                                  "pcmcia_request_io failed 0x%x\n", rc);
+       }
+       if (rc != CS_SUCCESS)
+               goto cs_release;
+
+       link->conf.IntType = 00000002;
+
+       if ((fail_rc = pcmcia_request_configuration(handle,&link->conf))
+                                                               !=CS_SUCCESS) {
+               fail_fn = RequestConfiguration;
+               dev_printk(KERN_INFO, &handle_to_dev(handle),
+                          "pcmcia_request_configuration failed 0x%x\n",
+                          fail_rc);
+               goto cs_release;
+       }
+
+       dev = link->priv;
+       sprintf(dev->node.dev_name, DEVICE_NAME "%d", devno);
+       dev->node.major = major;
+       dev->node.minor = devno;
+       dev->node.next = NULL;
+       link->dev = &dev->node;
+       link->state &= ~DEV_CONFIG_PENDING;
+
+       DEBUGP(2, dev, "device " DEVICE_NAME "%d at 0x%.4x-0x%.4x\n", devno,
+             link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1);
+       DEBUGP(2, dev, "<- reader_config (succ)\n");
+
+       return;
+
+cs_failed:
+       cs_error(handle, fail_fn, fail_rc);
+cs_release:
+       reader_release(link);
+       link->state &= ~DEV_CONFIG_PENDING;
+}
+
+static int reader_event(event_t event, int priority,
+                       event_callback_args_t *args)
+{
+       dev_link_t *link;
+       struct reader_dev *dev;
+       int devno;
+
+       link = args->client_data;
+       dev = link->priv;
+       DEBUGP(3, dev, "-> reader_event\n");
+       for (devno = 0; devno < CM_MAX_DEV; devno++) {
+               if (dev_table[devno] == link)
+                       break;
+       }
+       if (devno == CM_MAX_DEV)
+               return CS_BAD_ADAPTER;
+
+       switch (event) {
+               case CS_EVENT_CARD_INSERTION:
+                       DEBUGP(5, dev, "CS_EVENT_CARD_INSERTION\n");
+                       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+                       reader_config(link, devno);
+                       break;
+               case CS_EVENT_CARD_REMOVAL:
+                       DEBUGP(5, dev, "CS_EVENT_CARD_REMOVAL\n");
+                       link->state &= ~DEV_PRESENT;
+                       break;
+               case CS_EVENT_PM_SUSPEND:
+                       DEBUGP(5, dev, "CS_EVENT_PM_SUSPEND "
+                             "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
+                       link->state |= DEV_SUSPEND;
+
+               case CS_EVENT_RESET_PHYSICAL:
+                       DEBUGP(5, dev, "CS_EVENT_RESET_PHYSICAL\n");
+                       if (link->state & DEV_CONFIG) {
+                               DEBUGP(5, dev, "ReleaseConfiguration\n");
+                               pcmcia_release_configuration(link->handle);
+                       }
+                       break;
+               case CS_EVENT_PM_RESUME:
+                       DEBUGP(5, dev, "CS_EVENT_PM_RESUME "
+                             "(fall-through to CS_EVENT_CARD_RESET)\n");
+                       link->state &= ~DEV_SUSPEND;
+
+               case CS_EVENT_CARD_RESET:
+                       DEBUGP(5, dev, "CS_EVENT_CARD_RESET\n");
+                       if ((link->state & DEV_CONFIG)) {
+                               DEBUGP(5, dev, "RequestConfiguration\n");
+                               pcmcia_request_configuration(link->handle,
+                                                            &link->conf);
+                       }
+                       break;
+               default:
+                       DEBUGP(5, dev, "reader_event: unknown event %.2x\n",
+                              event);
+                       break;
+       }
+       DEBUGP(3, dev, "<- reader_event\n");
+       return CS_SUCCESS;
+}
+
+static void reader_release(dev_link_t *link)
+{
+       cm4040_reader_release(link->priv);
+       pcmcia_release_configuration(link->handle);
+       pcmcia_release_io(link->handle, &link->io);
+}
+
+static dev_link_t *reader_attach(void)
+{
+       struct reader_dev *dev;
+       dev_link_t *link;
+       client_reg_t client_reg;
+       int i;
+
+       for (i = 0; i < CM_MAX_DEV; i++) {
+               if (dev_table[i] == NULL)
+                       break;
+       }
+
+       if (i == CM_MAX_DEV)
+               return NULL;
+
+       dev = kzalloc(sizeof(struct reader_dev), GFP_KERNEL);
+       if (dev == NULL)
+               return NULL;
+
+       dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;
+       dev->buffer_status = 0;
+
+       link = &dev->link;
+       link->priv = dev;
+
+       link->conf.IntType = INT_MEMORY_AND_IO;
+       dev_table[i] = link;
+
+       client_reg.dev_info = &dev_info;
+       client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
+       client_reg.EventMask=
+               CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
+               CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
+               CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
+       client_reg.Version = 0x0210;
+       client_reg.event_callback_args.client_data = link;
+       i = pcmcia_register_client(&link->handle, &client_reg);
+       if (i) {
+               cs_error(link->handle, RegisterClient, i);
+               reader_detach(link);
+               return NULL;
+       }
+       init_waitqueue_head(&dev->devq);
+       init_waitqueue_head(&dev->poll_wait);
+       init_waitqueue_head(&dev->read_wait);
+       init_waitqueue_head(&dev->write_wait);
+       init_timer(&dev->poll_timer);
+       dev->poll_timer.function = &cm4040_do_poll;
+
+       return link;
+}
+
+static void reader_detach_by_devno(int devno, dev_link_t *link)
+{
+       struct reader_dev *dev = link->priv;
+
+       if (link->state & DEV_CONFIG) {
+               DEBUGP(5, dev, "device still configured (try to release it)\n");
+               reader_release(link);
+       }
+
+       pcmcia_deregister_client(link->handle);
+       dev_table[devno] = NULL;
+       DEBUGP(5, dev, "freeing dev=%p\n", dev);
+       cm4040_stop_poll(dev);
+       kfree(dev);
+       return;
+}
+
+static void reader_detach(dev_link_t *link)
+{
+       int i;
+
+       /* find device */
+       for (i = 0; i < CM_MAX_DEV; i++) {
+               if (dev_table[i] == link)
+                       break;
+       }
+       if (i == CM_MAX_DEV)
+               return;
+
+       reader_detach_by_devno(i, link);
+       return;
+}
+
+static struct file_operations reader_fops = {
+       .owner          = THIS_MODULE,
+       .read           = cm4040_read,
+       .write          = cm4040_write,
+       .open           = cm4040_open,
+       .release        = cm4040_close,
+       .poll           = cm4040_poll,
+};
+
+static struct pcmcia_device_id cm4040_ids[] = {
+       PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0200),
+       PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
+                               0xE32CDD8C, 0x8F23318B),
+       PCMCIA_DEVICE_NULL,
+};
+MODULE_DEVICE_TABLE(pcmcia, cm4040_ids);
+
+static struct pcmcia_driver reader_driver = {
+       .owner          = THIS_MODULE,
+       .drv            = {
+               .name   = "cm4040_cs",
+       },
+       .attach         = reader_attach,
+       .detach         = reader_detach,
+       .event          = reader_event,
+       .id_table       = cm4040_ids,
+};
+
+static int __init cm4040_init(void)
+{
+       printk(KERN_INFO "%s\n", version);
+       pcmcia_register_driver(&reader_driver);
+       major = register_chrdev(0, DEVICE_NAME, &reader_fops);
+       if (major < 0) {
+               printk(KERN_WARNING MODULE_NAME
+                       ": could not get major number\n");
+               return -1;
+       }
+       return 0;
+}
+
+static void __exit cm4040_exit(void)
+{
+       int i;
+
+       printk(KERN_INFO MODULE_NAME ": unloading\n");
+       pcmcia_unregister_driver(&reader_driver);
+       for (i = 0; i < CM_MAX_DEV; i++) {
+               if (dev_table[i])
+                       reader_detach_by_devno(i, dev_table[i]);
+       }
+       unregister_chrdev(major, DEVICE_NAME);
+}
+
+module_init(cm4040_init);
+module_exit(cm4040_exit);
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/char/pcmcia/cm4040_cs.h b/drivers/char/pcmcia/cm4040_cs.h
new file mode 100644 (file)
index 0000000..9a8b805
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef        _CM4040_H_
+#define        _CM4040_H_
+
+#define        CM_MAX_DEV              4
+
+#define        DEVICE_NAME             "cmx"
+#define        MODULE_NAME             "cm4040_cs"
+
+#define REG_OFFSET_BULK_OUT      0
+#define REG_OFFSET_BULK_IN       0
+#define REG_OFFSET_BUFFER_STATUS 1
+#define REG_OFFSET_SYNC_CONTROL  2
+
+#define BSR_BULK_IN_FULL  0x02
+#define BSR_BULK_OUT_FULL 0x01
+
+#define SCR_HOST_TO_READER_START 0x80
+#define SCR_ABORT                0x40
+#define SCR_EN_NOTIFY            0x20
+#define SCR_ACK_NOTIFY           0x10
+#define SCR_READER_TO_HOST_DONE  0x08
+#define SCR_HOST_TO_READER_DONE  0x04
+#define SCR_PULSE_INTERRUPT      0x02
+#define SCR_POWER_DOWN           0x01
+
+
+#define  CMD_PC_TO_RDR_ICCPOWERON       0x62
+#define  CMD_PC_TO_RDR_GETSLOTSTATUS    0x65
+#define  CMD_PC_TO_RDR_ICCPOWEROFF      0x63
+#define  CMD_PC_TO_RDR_SECURE           0x69
+#define  CMD_PC_TO_RDR_GETPARAMETERS    0x6C
+#define  CMD_PC_TO_RDR_RESETPARAMETERS  0x6D
+#define  CMD_PC_TO_RDR_SETPARAMETERS    0x61
+#define  CMD_PC_TO_RDR_XFRBLOCK         0x6F
+#define  CMD_PC_TO_RDR_ESCAPE           0x6B
+#define  CMD_PC_TO_RDR_ICCCLOCK         0x6E
+#define  CMD_PC_TO_RDR_TEST_SECURE      0x74
+#define  CMD_PC_TO_RDR_OK_SECURE        0x89
+
+
+#define  CMD_RDR_TO_PC_SLOTSTATUS         0x81
+#define  CMD_RDR_TO_PC_DATABLOCK          0x80
+#define  CMD_RDR_TO_PC_PARAMETERS         0x82
+#define  CMD_RDR_TO_PC_ESCAPE             0x83
+#define  CMD_RDR_TO_PC_OK_SECURE          0x89
+
+#endif /* _CM4040_H_ */
index d724c0de4f28334ad1de8d84ad54291f570f0a15..3df7a574267b8a95445bf545266a7eb9ad35b73b 100644 (file)
@@ -382,7 +382,7 @@ static struct rtc_ops s3c2410_rtcops = {
        .proc           = s3c2410_rtc_proc,
 };
 
-static void s3c2410_rtc_enable(struct device *dev, int en)
+static void s3c2410_rtc_enable(struct platform_device *pdev, int en)
 {
        unsigned int tmp;
 
@@ -399,21 +399,21 @@ static void s3c2410_rtc_enable(struct device *dev, int en)
                /* re-enable the device, and check it is ok */
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_RTCEN) == 0){
-                       dev_info(dev, "rtc disabled, re-enabling\n");
+                       dev_info(&pdev->dev, "rtc disabled, re-enabling\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp | S3C2410_RTCCON_RTCEN , S3C2410_RTCCON);
                }
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_CNTSEL)){
-                       dev_info(dev, "removing S3C2410_RTCCON_CNTSEL\n");
+                       dev_info(&pdev->dev, "removing S3C2410_RTCCON_CNTSEL\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp& ~S3C2410_RTCCON_CNTSEL , S3C2410_RTCCON);
                }
 
                if ((readb(S3C2410_RTCCON) & S3C2410_RTCCON_CLKRST)){
-                       dev_info(dev, "removing S3C2410_RTCCON_CLKRST\n");
+                       dev_info(&pdev->dev, "removing S3C2410_RTCCON_CLKRST\n");
 
                        tmp = readb(S3C2410_RTCCON);
                        writeb(tmp & ~S3C2410_RTCCON_CLKRST, S3C2410_RTCCON);
@@ -421,7 +421,7 @@ static void s3c2410_rtc_enable(struct device *dev, int en)
        }
 }
 
-static int s3c2410_rtc_remove(struct device *dev)
+static int s3c2410_rtc_remove(struct platform_device *dev)
 {
        unregister_rtc(&s3c2410_rtcops);
 
@@ -438,25 +438,24 @@ static int s3c2410_rtc_remove(struct device *dev)
        return 0;
 }
 
-static int s3c2410_rtc_probe(struct device *dev)
+static int s3c2410_rtc_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int ret;
 
-       pr_debug("%s: probe=%p, device=%p\n", __FUNCTION__, pdev, dev);
+       pr_debug("%s: probe=%p\n", __FUNCTION__, pdev);
 
        /* find the IRQs */
 
        s3c2410_rtc_tickno = platform_get_irq(pdev, 1);
        if (s3c2410_rtc_tickno <= 0) {
-               dev_err(dev, "no irq for rtc tick\n");
+               dev_err(&pdev->dev, "no irq for rtc tick\n");
                return -ENOENT;
        }
 
        s3c2410_rtc_alarmno = platform_get_irq(pdev, 0);
        if (s3c2410_rtc_alarmno <= 0) {
-               dev_err(dev, "no irq for alarm\n");
+               dev_err(&pdev->dev, "no irq for alarm\n");
                return -ENOENT;
        }
 
@@ -467,7 +466,7 @@ static int s3c2410_rtc_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
-               dev_err(dev, "failed to get memory region resource\n");
+               dev_err(&pdev->dev, "failed to get memory region resource\n");
                return -ENOENT;
        }
 
@@ -475,14 +474,14 @@ static int s3c2410_rtc_probe(struct device *dev)
                                     pdev->name);
 
        if (s3c2410_rtc_mem == NULL) {
-               dev_err(dev, "failed to reserve memory region\n");
+               dev_err(&pdev->dev, "failed to reserve memory region\n");
                ret = -ENOENT;
                goto exit_err;
        }
 
        s3c2410_rtc_base = ioremap(res->start, res->end - res->start + 1);
        if (s3c2410_rtc_base == NULL) {
-               dev_err(dev, "failed ioremap()\n");
+               dev_err(&pdev->dev, "failed ioremap()\n");
                ret = -EINVAL;
                goto exit_err;
        }
@@ -494,7 +493,7 @@ static int s3c2410_rtc_probe(struct device *dev)
 
        /* check to see if everything is setup correctly */
 
-       s3c2410_rtc_enable(dev, 1);
+       s3c2410_rtc_enable(pdev, 1);
 
        pr_debug("s3c2410_rtc: RTCCON=%02x\n", readb(S3C2410_RTCCON));
 
@@ -506,7 +505,7 @@ static int s3c2410_rtc_probe(struct device *dev)
        return 0;
 
  exit_err:
-       dev_err(dev, "error %d during initialisation\n", ret);
+       dev_err(&pdev->dev, "error %d during initialisation\n", ret);
 
        return ret;
 }
@@ -519,7 +518,7 @@ static struct timespec s3c2410_rtc_delta;
 
 static int ticnt_save;
 
-static int s3c2410_rtc_suspend(struct device *dev, pm_message_t state)
+static int s3c2410_rtc_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct rtc_time tm;
        struct timespec time;
@@ -535,19 +534,19 @@ static int s3c2410_rtc_suspend(struct device *dev, pm_message_t state)
        s3c2410_rtc_gettime(&tm);
        rtc_tm_to_time(&tm, &time.tv_sec);
        save_time_delta(&s3c2410_rtc_delta, &time);
-       s3c2410_rtc_enable(dev, 0);
+       s3c2410_rtc_enable(pdev, 0);
 
        return 0;
 }
 
-static int s3c2410_rtc_resume(struct device *dev)
+static int s3c2410_rtc_resume(struct platform_device *pdev)
 {
        struct rtc_time tm;
        struct timespec time;
 
        time.tv_nsec = 0;
 
-       s3c2410_rtc_enable(dev, 1);
+       s3c2410_rtc_enable(pdev, 1);
        s3c2410_rtc_gettime(&tm);
        rtc_tm_to_time(&tm, &time.tv_sec);
        restore_time_delta(&s3c2410_rtc_delta, &time);
@@ -560,14 +559,15 @@ static int s3c2410_rtc_resume(struct device *dev)
 #define s3c2410_rtc_resume  NULL
 #endif
 
-static struct device_driver s3c2410_rtcdrv = {
-       .name           = "s3c2410-rtc",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_rtcdrv = {
        .probe          = s3c2410_rtc_probe,
        .remove         = s3c2410_rtc_remove,
        .suspend        = s3c2410_rtc_suspend,
        .resume         = s3c2410_rtc_resume,
+       .driver         = {
+               .name   = "s3c2410-rtc",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static char __initdata banner[] = "S3C2410 RTC, (c) 2004 Simtec Electronics\n";
@@ -575,12 +575,12 @@ static char __initdata banner[] = "S3C2410 RTC, (c) 2004 Simtec Electronics\n";
 static int __init s3c2410_rtc_init(void)
 {
        printk(banner);
-       return driver_register(&s3c2410_rtcdrv);
+       return platform_driver_register(&s3c2410_rtcdrv);
 }
 
 static void __exit s3c2410_rtc_exit(void)
 {
-       driver_unregister(&s3c2410_rtcdrv);
+       platform_driver_unregister(&s3c2410_rtcdrv);
 }
 
 module_init(s3c2410_rtc_init);
index d05067dcea01967fa9d645b08dffc982041b91ef..51a07370e636ec85edb0e9b375c5ebe72758fa83 100644 (file)
@@ -1168,7 +1168,7 @@ static int sonypi_disable(void)
 #ifdef CONFIG_PM
 static int old_camera_power;
 
-static int sonypi_suspend(struct device *dev, pm_message_t state)
+static int sonypi_suspend(struct platform_device *dev, pm_message_t state)
 {
        old_camera_power = sonypi_device.camera_power;
        sonypi_disable();
@@ -1176,26 +1176,27 @@ static int sonypi_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int sonypi_resume(struct device *dev)
+static int sonypi_resume(struct platform_device *dev)
 {
        sonypi_enable(old_camera_power);
        return 0;
 }
 #endif
 
-static void sonypi_shutdown(struct device *dev)
+static void sonypi_shutdown(struct platform_device *dev)
 {
        sonypi_disable();
 }
 
-static struct device_driver sonypi_driver = {
-       .name           = "sonypi",
-       .bus            = &platform_bus_type,
+static struct platform_driver sonypi_driver = {
 #ifdef CONFIG_PM
        .suspend        = sonypi_suspend,
        .resume         = sonypi_resume,
 #endif
        .shutdown       = sonypi_shutdown,
+       .driver         = {
+               .name   = "sonypi",
+       },
 };
 
 static int __devinit sonypi_create_input_devices(void)
@@ -1455,20 +1456,20 @@ static int __init sonypi_init(void)
        if (!dmi_check_system(sonypi_dmi_table))
                return -ENODEV;
 
-       ret = driver_register(&sonypi_driver);
+       ret = platform_driver_register(&sonypi_driver);
        if (ret)
                return ret;
 
        ret = sonypi_probe();
        if (ret)
-               driver_unregister(&sonypi_driver);
+               platform_driver_unregister(&sonypi_driver);
 
        return ret;
 }
 
 static void __exit sonypi_exit(void)
 {
-       driver_unregister(&sonypi_driver);
+       platform_driver_unregister(&sonypi_driver);
        sonypi_remove();
 }
 
index 5d1ffa3bd4c3e0bd7d9a39e1cfc68ebbfb7c515c..62aa0e534a6d7dbe30c07b72e338050be2a25225 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * linux/drivers/char/synclink.c
  *
- * $Id: synclink.c,v 4.37 2005/09/07 13:13:19 paulkf Exp $
+ * $Id: synclink.c,v 4.38 2005/11/07 16:30:34 paulkf Exp $
  *
  * Device driver for Microgate SyncLink ISA and PCI
  * high speed multiprotocol serial adapters.
 #include <linux/termios.h>
 #include <linux/workqueue.h>
 #include <linux/hdlc.h>
+#include <linux/dma-mapping.h>
 
 #ifdef CONFIG_HDLC_MODULE
 #define CONFIG_HDLC 1
@@ -148,6 +149,7 @@ typedef struct _DMABUFFERENTRY
        u32 link;       /* 32-bit flat link to next buffer entry */
        char *virt_addr;        /* virtual address of data buffer */
        u32 phys_entry; /* physical address of this buffer entry */
+       dma_addr_t dma_addr;
 } DMABUFFERENTRY, *DMAPBUFFERENTRY;
 
 /* The queue of BH actions to be performed */
@@ -233,7 +235,8 @@ struct mgsl_struct {
        int ri_chkcount;
 
        char *buffer_list;              /* virtual address of Rx & Tx buffer lists */
-       unsigned long buffer_list_phys;
+       u32 buffer_list_phys;
+       dma_addr_t buffer_list_dma_addr;
 
        unsigned int rx_buffer_count;   /* count of total allocated Rx buffers */
        DMABUFFERENTRY *rx_buffer_list; /* list of receive buffer entries */
@@ -896,7 +899,7 @@ module_param_array(txdmabufs, int, NULL, 0);
 module_param_array(txholdbufs, int, NULL, 0);
 
 static char *driver_name = "SyncLink serial driver";
-static char *driver_version = "$Revision: 4.37 $";
+static char *driver_version = "$Revision: 4.38 $";
 
 static int synclink_init_one (struct pci_dev *dev,
                                     const struct pci_device_id *ent);
@@ -912,7 +915,6 @@ MODULE_DEVICE_TABLE(pci, synclink_pci_tbl);
 MODULE_LICENSE("GPL");
 
 static struct pci_driver synclink_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "synclink",
        .id_table       = synclink_pci_tbl,
        .probe          = synclink_init_one,
@@ -3812,11 +3814,10 @@ static int mgsl_alloc_buffer_list_memory( struct mgsl_struct *info )
                /* inspect portions of the buffer while other portions are being */
                /* updated by the adapter using Bus Master DMA. */
 
-               info->buffer_list = kmalloc(BUFFERLISTSIZE, GFP_KERNEL | GFP_DMA);
-               if ( info->buffer_list == NULL )
+               info->buffer_list = dma_alloc_coherent(NULL, BUFFERLISTSIZE, &info->buffer_list_dma_addr, GFP_KERNEL);
+               if (info->buffer_list == NULL)
                        return -ENOMEM;
-                       
-               info->buffer_list_phys = isa_virt_to_bus(info->buffer_list);
+               info->buffer_list_phys = (u32)(info->buffer_list_dma_addr);
        }
 
        /* We got the memory for the buffer entry lists. */
@@ -3883,8 +3884,8 @@ static int mgsl_alloc_buffer_list_memory( struct mgsl_struct *info )
  */
 static void mgsl_free_buffer_list_memory( struct mgsl_struct *info )
 {
-       if ( info->buffer_list && info->bus_type != MGSL_BUS_TYPE_PCI )
-               kfree(info->buffer_list);
+       if (info->buffer_list && info->bus_type != MGSL_BUS_TYPE_PCI)
+               dma_free_coherent(NULL, BUFFERLISTSIZE, info->buffer_list, info->buffer_list_dma_addr);
                
        info->buffer_list = NULL;
        info->rx_buffer_list = NULL;
@@ -3911,7 +3912,7 @@ static void mgsl_free_buffer_list_memory( struct mgsl_struct *info )
 static int mgsl_alloc_frame_memory(struct mgsl_struct *info,DMABUFFERENTRY *BufferList,int Buffercount)
 {
        int i;
-       unsigned long phys_addr;
+       u32 phys_addr;
 
        /* Allocate page sized buffers for the receive buffer list */
 
@@ -3923,11 +3924,10 @@ static int mgsl_alloc_frame_memory(struct mgsl_struct *info,DMABUFFERENTRY *Buff
                        info->last_mem_alloc += DMABUFFERSIZE;
                } else {
                        /* ISA adapter uses system memory. */
-                       BufferList[i].virt_addr = 
-                               kmalloc(DMABUFFERSIZE, GFP_KERNEL | GFP_DMA);
-                       if ( BufferList[i].virt_addr == NULL )
+                       BufferList[i].virt_addr = dma_alloc_coherent(NULL, DMABUFFERSIZE, &BufferList[i].dma_addr, GFP_KERNEL);
+                       if (BufferList[i].virt_addr == NULL)
                                return -ENOMEM;
-                       phys_addr = isa_virt_to_bus(BufferList[i].virt_addr);
+                       phys_addr = (u32)(BufferList[i].dma_addr);
                }
                BufferList[i].phys_addr = phys_addr;
        }
@@ -3958,7 +3958,7 @@ static void mgsl_free_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *Buf
                for ( i = 0 ; i < Buffercount ; i++ ) {
                        if ( BufferList[i].virt_addr ) {
                                if ( info->bus_type != MGSL_BUS_TYPE_PCI )
-                                       kfree(BufferList[i].virt_addr);
+                                       dma_free_coherent(NULL, DMABUFFERSIZE, BufferList[i].virt_addr, BufferList[i].dma_addr);
                                BufferList[i].virt_addr = NULL;
                        }
                }
index 7c063c5abc5596532b5aa2aec0c4586d40253210..ee5a40be9f99ef6fbe12f02cadc2beef45bc6f25 100644 (file)
@@ -500,7 +500,6 @@ MODULE_DEVICE_TABLE(pci, synclinkmp_pci_tbl);
 MODULE_LICENSE("GPL");
 
 static struct pci_driver synclinkmp_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "synclinkmp",
        .id_table       = synclinkmp_pci_tbl,
        .probe          = synclinkmp_init_one,
index 24355b23b2ca8a3aacf77937dd829e66105fac0b..b3d411a756fee2d25a24882d60c3a9215c1ab593 100644 (file)
@@ -283,7 +283,7 @@ static void tb0219_pci_irq_init(void)
        vr41xx_set_irq_level(TB0219_PCI_SLOT3_PIN, IRQ_LEVEL_LOW);
 }
 
-static int tb0219_probe(struct device *dev)
+static int tb0219_probe(struct platform_device *dev)
 {
        int retval;
 
@@ -319,7 +319,7 @@ static int tb0219_probe(struct device *dev)
        return 0;
 }
 
-static int tb0219_remove(struct device *dev)
+static int tb0219_remove(struct platform_device *dev)
 {
        _machine_restart = old_machine_restart;
 
@@ -333,11 +333,12 @@ static int tb0219_remove(struct device *dev)
 
 static struct platform_device *tb0219_platform_device;
 
-static struct device_driver tb0219_device_driver = {
-       .name           = "TB0219",
-       .bus            = &platform_bus_type,
+static struct platform_driver tb0219_device_driver = {
        .probe          = tb0219_probe,
        .remove         = tb0219_remove,
+       .driver         = {
+               .name   = "TB0219",
+       },
 };
 
 static int __devinit tanbac_tb0219_init(void)
@@ -348,7 +349,7 @@ static int __devinit tanbac_tb0219_init(void)
        if (IS_ERR(tb0219_platform_device))
                return PTR_ERR(tb0219_platform_device);
 
-       retval = driver_register(&tb0219_device_driver);
+       retval = platform_driver_register(&tb0219_device_driver);
        if (retval < 0)
                platform_device_unregister(tb0219_platform_device);
 
@@ -357,7 +358,7 @@ static int __devinit tanbac_tb0219_init(void)
 
 static void __devexit tanbac_tb0219_exit(void)
 {
-       driver_unregister(&tb0219_device_driver);
+       platform_driver_unregister(&tb0219_device_driver);
 
        platform_device_unregister(tb0219_platform_device);
 }
index b58adfe3ed191e039888ac21bf9b57fd7db4ed23..a6873bf89ffad63c6196dacc9f3499dcb6c22387 100644 (file)
@@ -6,7 +6,7 @@ menu "TPM devices"
 
 config TCG_TPM
        tristate "TPM Hardware Support"
-       depends on EXPERIMENTAL && PCI
+       depends on EXPERIMENTAL
        ---help---
          If you have a TPM security chip in your system, which
          implements the Trusted Computing Group's specification,
index 303f15880466293f967a94ea5267262039006e2e..a9be0e8eaea5dedc243af90cedb18d645537d612 100644 (file)
@@ -43,6 +43,13 @@ static void user_reader_timeout(unsigned long ptr)
 {
        struct tpm_chip *chip = (struct tpm_chip *) ptr;
 
+       schedule_work(&chip->work);
+}
+
+static void timeout_work(void * ptr)
+{
+       struct tpm_chip *chip = ptr;
+
        down(&chip->buffer_mutex);
        atomic_set(&chip->data_pending, 0);
        memset(chip->data_buffer, 0, TPM_BUFSIZE);
@@ -370,6 +377,7 @@ int tpm_release(struct inode *inode, struct file *file)
        file->private_data = NULL;
        chip->num_opens--;
        del_singleshot_timer_sync(&chip->user_read_timer);
+       flush_scheduled_work();
        atomic_set(&chip->data_pending, 0);
        put_device(chip->dev);
        kfree(chip->data_buffer);
@@ -421,6 +429,7 @@ ssize_t tpm_read(struct file * file, char __user *buf,
        int ret_size;
 
        del_singleshot_timer_sync(&chip->user_read_timer);
+       flush_scheduled_work();
        ret_size = atomic_read(&chip->data_pending);
        atomic_set(&chip->data_pending, 0);
        if (ret_size > 0) {     /* relay data */
@@ -428,8 +437,7 @@ ssize_t tpm_read(struct file * file, char __user *buf,
                        ret_size = size;
 
                down(&chip->buffer_mutex);
-               if (copy_to_user
-                   ((void __user *) buf, chip->data_buffer, ret_size))
+               if (copy_to_user(buf, chip->data_buffer, ret_size))
                        ret_size = -EFAULT;
                up(&chip->buffer_mutex);
        }
@@ -460,7 +468,7 @@ void tpm_remove_hardware(struct device *dev)
        sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);
 
        dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &=
-               !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
+               ~(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
 
        kfree(chip);
 
@@ -528,6 +536,8 @@ int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
        init_MUTEX(&chip->tpm_mutex);
        INIT_LIST_HEAD(&chip->list);
 
+       INIT_WORK(&chip->work, timeout_work, chip);
+
        init_timer(&chip->user_read_timer);
        chip->user_read_timer.function = user_reader_timeout;
        chip->user_read_timer.data = (unsigned long) chip;
index 9293bcc4dc624cb5a61df076bcda36dbaa1f88fa..159882ca69dd03bdd18ce991b9b01428c48ee4be 100644 (file)
@@ -50,7 +50,11 @@ struct tpm_vendor_specific {
        u8 req_complete_mask;
        u8 req_complete_val;
        u8 req_canceled;
-       u16 base;               /* TPM base address */
+       void __iomem *iobase;           /* ioremapped address */
+       unsigned long base;             /* TPM base address */
+
+       int region_size;
+       int have_region;
 
        int (*recv) (struct tpm_chip *, u8 *, size_t);
        int (*send) (struct tpm_chip *, u8 *, size_t);
@@ -73,6 +77,7 @@ struct tpm_chip {
        struct semaphore buffer_mutex;
 
        struct timer_list user_read_timer;      /* user needs to claim result */
+       struct work_struct work;
        struct semaphore tpm_mutex;     /* tpm is processing */
 
        struct tpm_vendor_specific *vendor;
index 32e01450c4253bd4b5f9e3ddb1d3ce21d3f8752c..ff3654964fe32e24ef45185f0c7e01ea3aa222c4 100644 (file)
  * 
  */
 
-#include <linux/platform_device.h>
 #include "tpm.h"
-
-/* Atmel definitions */
-enum tpm_atmel_addr {
-       TPM_ATMEL_BASE_ADDR_LO = 0x08,
-       TPM_ATMEL_BASE_ADDR_HI = 0x09
-};
+#include "tpm_atmel.h"
 
 /* write status bits */
 enum tpm_atmel_write_status {
@@ -53,13 +47,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
                return -EIO;
 
        for (i = 0; i < 6; i++) {
-               status = inb(chip->vendor->base + 1);
+               status = ioread8(chip->vendor->iobase + 1);
                if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
-                       dev_err(chip->dev,
-                               "error reading header\n");
+                       dev_err(chip->dev, "error reading header\n");
                        return -EIO;
                }
-               *buf++ = inb(chip->vendor->base);
+               *buf++ = ioread8(chip->vendor->iobase);
        }
 
        /* size of the data received */
@@ -70,10 +63,9 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
                dev_err(chip->dev,
                        "Recv size(%d) less than available space\n", size);
                for (; i < size; i++) { /* clear the waiting data anyway */
-                       status = inb(chip->vendor->base + 1);
+                       status = ioread8(chip->vendor->iobase + 1);
                        if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
-                               dev_err(chip->dev,
-                                       "error reading data\n");
+                               dev_err(chip->dev, "error reading data\n");
                                return -EIO;
                        }
                }
@@ -82,17 +74,17 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
 
        /* read all the data available */
        for (; i < size; i++) {
-               status = inb(chip->vendor->base + 1);
+               status = ioread8(chip->vendor->iobase + 1);
                if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
-                       dev_err(chip->dev,
-                               "error reading data\n");
+                       dev_err(chip->dev, "error reading data\n");
                        return -EIO;
                }
-               *buf++ = inb(chip->vendor->base);
+               *buf++ = ioread8(chip->vendor->iobase);
        }
 
        /* make sure data available is gone */
-       status = inb(chip->vendor->base + 1);
+       status = ioread8(chip->vendor->iobase + 1);
+
        if (status & ATML_STATUS_DATA_AVAIL) {
                dev_err(chip->dev, "data available is stuck\n");
                return -EIO;
@@ -108,7 +100,7 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
        dev_dbg(chip->dev, "tpm_atml_send:\n");
        for (i = 0; i < count; i++) {
                dev_dbg(chip->dev, "%d 0x%x(%d)\n",  i, buf[i], buf[i]);
-               outb(buf[i], chip->vendor->base);
+               iowrite8(buf[i], chip->vendor->iobase);
        }
 
        return count;
@@ -116,12 +108,12 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
 
 static void tpm_atml_cancel(struct tpm_chip *chip)
 {
-       outb(ATML_STATUS_ABORT, chip->vendor->base + 1);
+       iowrite8(ATML_STATUS_ABORT, chip->vendor->iobase + 1);
 }
 
 static u8 tpm_atml_status(struct tpm_chip *chip)
 {
-       return inb(chip->vendor->base + 1);
+       return ioread8(chip->vendor->iobase + 1);
 }
 
 static struct file_operations atmel_ops = {
@@ -162,12 +154,17 @@ static struct tpm_vendor_specific tpm_atmel = {
 
 static struct platform_device *pdev;
 
-static void __devexit tpm_atml_remove(struct device *dev)
+static void atml_plat_remove(void)
 {
-       struct tpm_chip *chip = dev_get_drvdata(dev);
+       struct tpm_chip *chip = dev_get_drvdata(&pdev->dev);
+
        if (chip) {
-               release_region(chip->vendor->base, 2);
+               if (chip->vendor->have_region)
+                       atmel_release_region(chip->vendor->base,
+                                            chip->vendor->region_size);
+               atmel_put_base_addr(chip->vendor);
                tpm_remove_hardware(chip->dev);
+               platform_device_unregister(pdev);
        }
 }
 
@@ -182,72 +179,46 @@ static struct device_driver atml_drv = {
 static int __init init_atmel(void)
 {
        int rc = 0;
-       int lo, hi;
 
        driver_register(&atml_drv);
 
-       lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO);
-       hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI);
-
-       tpm_atmel.base = (hi<<8)|lo;
-
-       /* verify that it is an Atmel part */
-       if (tpm_read_index(TPM_ADDR, 4) != 'A' || tpm_read_index(TPM_ADDR, 5) != 'T'
-           || tpm_read_index(TPM_ADDR, 6) != 'M' || tpm_read_index(TPM_ADDR, 7) != 'L') {
-               return -ENODEV;
+       if ((tpm_atmel.iobase = atmel_get_base_addr(&tpm_atmel)) == NULL) {
+               rc = -ENODEV;
+               goto err_unreg_drv;
        }
 
-       /* verify chip version number is 1.1 */
-       if (    (tpm_read_index(TPM_ADDR, 0x00) != 0x01) ||
-               (tpm_read_index(TPM_ADDR, 0x01) != 0x01 ))
-               return -ENODEV;
-
-       pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
-       if ( !pdev )
-               return -ENOMEM;
-
-       pdev->name = "tpm_atmel0";
-       pdev->id = -1;
-       pdev->num_resources = 0;
-       pdev->dev.release = tpm_atml_remove;
-       pdev->dev.driver = &atml_drv;
-
-       if ((rc = platform_device_register(pdev)) < 0) {
-               kfree(pdev);
-               pdev = NULL;
-               return rc;
-       }
+       tpm_atmel.have_region =
+           (atmel_request_region
+            (tpm_atmel.base, tpm_atmel.region_size,
+             "tpm_atmel0") == NULL) ? 0 : 1;
 
-       if (request_region(tpm_atmel.base, 2, "tpm_atmel0") == NULL ) {
-               platform_device_unregister(pdev);
-               kfree(pdev);
-               pdev = NULL;
-               return -EBUSY;
+       if (IS_ERR
+           (pdev =
+            platform_device_register_simple("tpm_atmel", -1, NULL, 0))) {
+               rc = PTR_ERR(pdev);
+               goto err_rel_reg;
        }
 
-       if ((rc = tpm_register_hardware(&pdev->dev, &tpm_atmel)) < 0) {
-               release_region(tpm_atmel.base, 2);
-               platform_device_unregister(pdev);
-               kfree(pdev);
-               pdev = NULL;
-               return rc;
-       }
-
-       dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n",
-                       tpm_atmel.base);
+       if ((rc = tpm_register_hardware(&pdev->dev, &tpm_atmel)) < 0)
+               goto err_unreg_dev;
        return 0;
+
+err_unreg_dev:
+       platform_device_unregister(pdev);
+err_rel_reg:
+       atmel_put_base_addr(&tpm_atmel);
+       if (tpm_atmel.have_region)
+               atmel_release_region(tpm_atmel.base,
+                                    tpm_atmel.region_size);
+err_unreg_drv:
+       driver_unregister(&atml_drv);
+       return rc;
 }
 
 static void __exit cleanup_atmel(void)
 {
-       if (pdev) {
-               tpm_atml_remove(&pdev->dev);
-               platform_device_unregister(pdev);
-               kfree(pdev);
-               pdev = NULL;
-       }
-
        driver_unregister(&atml_drv);
+       atml_plat_remove();
 }
 
 module_init(init_atmel);
diff --git a/drivers/char/tpm/tpm_atmel.h b/drivers/char/tpm/tpm_atmel.h
new file mode 100644 (file)
index 0000000..d3478aa
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2005 IBM Corporation
+ *
+ * Authors:
+ * 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
+ *
+ * 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, version 2 of the
+ * License.
+ *
+ * These difference are required on power because the device must be
+ * discovered through the device tree and iomap must be used to get
+ * around the need for holes in the io_page_mask.  This does not happen
+ * automatically because the tpm is not a normal pci device and lives
+ * under the root node.
+ *
+ */
+
+#ifdef CONFIG_PPC64
+#define atmel_getb(chip, offset) readb(chip->vendor->iobase + offset);
+#define atmel_putb(val, chip, offset) writeb(val, chip->vendor->iobase + offset)
+#define atmel_request_region request_mem_region
+#define atmel_release_region release_mem_region
+
+static inline void atmel_put_base_addr(struct tpm_vendor_specific
+                                        *vendor)
+{
+       iounmap(vendor->iobase);
+}
+
+static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific *vendor)
+{
+       struct device_node *dn;
+       unsigned long address, size;
+       unsigned int *reg;
+       int reglen;
+       int naddrc;
+       int nsizec;
+
+       dn = of_find_node_by_name(NULL, "tpm");
+
+       if (!dn)
+               return NULL;
+
+       if (!device_is_compatible(dn, "AT97SC3201")) {
+               of_node_put(dn);
+               return NULL;
+       }
+
+       reg = (unsigned int *) get_property(dn, "reg", &reglen);
+       naddrc = prom_n_addr_cells(dn);
+       nsizec = prom_n_size_cells(dn);
+
+       of_node_put(dn);
+
+
+       if (naddrc == 2)
+               address = ((unsigned long) reg[0] << 32) | reg[1];
+       else
+               address = reg[0];
+
+       if (nsizec == 2)
+               size =
+                   ((unsigned long) reg[naddrc] << 32) | reg[naddrc + 1];
+       else
+               size = reg[naddrc];
+
+       vendor->base = address;
+       vendor->region_size = size;
+       return ioremap(vendor->base, vendor->region_size);
+}
+#else
+#define atmel_getb(chip, offset) inb(chip->vendor->base + offset)
+#define atmel_putb(val, chip, offset) outb(val, chip->vendor->base + offset)
+#define atmel_request_region request_region
+#define atmel_release_region release_region
+/* Atmel definitions */
+enum tpm_atmel_addr {
+       TPM_ATMEL_BASE_ADDR_LO = 0x08,
+       TPM_ATMEL_BASE_ADDR_HI = 0x09
+};
+
+/* Verify this is a 1.1 Atmel TPM */
+static int atmel_verify_tpm11(void)
+{
+
+       /* verify that it is an Atmel part */
+       if (tpm_read_index(TPM_ADDR, 4) != 'A' ||
+           tpm_read_index(TPM_ADDR, 5) != 'T' ||
+           tpm_read_index(TPM_ADDR, 6) != 'M' ||
+           tpm_read_index(TPM_ADDR, 7) != 'L')
+               return 1;
+
+       /* query chip for its version number */
+       if (tpm_read_index(TPM_ADDR, 0x00) != 1 ||
+           tpm_read_index(TPM_ADDR, 0x01) != 1)
+               return 1;
+
+       /* This is an atmel supported part */
+       return 0;
+}
+
+static inline void atmel_put_base_addr(struct tpm_vendor_specific
+                                        *vendor)
+{
+}
+
+/* Determine where to talk to device */
+static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific
+                                        *vendor)
+{
+       int lo, hi;
+
+       if (atmel_verify_tpm11() != 0)
+               return NULL;
+
+       lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO);
+       hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI);
+
+       vendor->base = (hi << 8) | lo;
+       vendor->region_size = 2;
+
+       return ioport_map(vendor->base, vendor->region_size);
+}
+#endif
index 94641085faf8b66a93ab1c9add8d2cdf49297c1b..9ac6d43437b3cb6b1e4aa27529c11b79c77298fb 100644 (file)
@@ -613,7 +613,7 @@ static struct file_operations gpio_fops = {
        .release        = gpio_release,
 };
 
-static int giu_probe(struct device *dev)
+static int giu_probe(struct platform_device *dev)
 {
        unsigned long start, size, flags = 0;
        unsigned int nr_pins = 0;
@@ -697,7 +697,7 @@ static int giu_probe(struct device *dev)
        return cascade_irq(GIUINT_IRQ, giu_get_irq);
 }
 
-static int giu_remove(struct device *dev)
+static int giu_remove(struct platform_device *dev)
 {
        iounmap(giu_base);
 
@@ -710,11 +710,12 @@ static int giu_remove(struct device *dev)
 
 static struct platform_device *giu_platform_device;
 
-static struct device_driver giu_device_driver = {
-       .name           = "GIU",
-       .bus            = &platform_bus_type,
+static struct platform_driver giu_device_driver = {
        .probe          = giu_probe,
        .remove         = giu_remove,
+       .driver         = {
+               .name   = "GIU",
+       },
 };
 
 static int __devinit vr41xx_giu_init(void)
@@ -725,7 +726,7 @@ static int __devinit vr41xx_giu_init(void)
        if (IS_ERR(giu_platform_device))
                return PTR_ERR(giu_platform_device);
 
-       retval = driver_register(&giu_device_driver);
+       retval = platform_driver_register(&giu_device_driver);
        if (retval < 0)
                platform_device_unregister(giu_platform_device);
 
@@ -734,7 +735,7 @@ static int __devinit vr41xx_giu_init(void)
 
 static void __devexit vr41xx_giu_exit(void)
 {
-       driver_unregister(&giu_device_driver);
+       platform_driver_unregister(&giu_device_driver);
 
        platform_device_unregister(giu_platform_device);
 }
index 5e3292df69d8d794a1a0c4a5ccf5f1becbb38591..435b30748e231807df780458e47cac52eb700e64 100644 (file)
@@ -560,13 +560,11 @@ static struct miscdevice rtc_miscdevice = {
        .fops   = &rtc_fops,
 };
 
-static int rtc_probe(struct device *dev)
+static int rtc_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev;
        unsigned int irq;
        int retval;
 
-       pdev = to_platform_device(dev);
        if (pdev->num_resources != 2)
                return -EBUSY;
 
@@ -635,7 +633,7 @@ static int rtc_probe(struct device *dev)
        return 0;
 }
 
-static int rtc_remove(struct device *dev)
+static int rtc_remove(struct platform_device *dev)
 {
        int retval;
 
@@ -655,11 +653,12 @@ static int rtc_remove(struct device *dev)
 
 static struct platform_device *rtc_platform_device;
 
-static struct device_driver rtc_device_driver = {
-       .name           = rtc_name,
-       .bus            = &platform_bus_type,
+static struct platform_driver rtc_device_driver = {
        .probe          = rtc_probe,
        .remove         = rtc_remove,
+       .driver         = {
+               .name   = rtc_name,
+       },
 };
 
 static int __devinit vr41xx_rtc_init(void)
@@ -691,7 +690,7 @@ static int __devinit vr41xx_rtc_init(void)
        if (IS_ERR(rtc_platform_device))
                return PTR_ERR(rtc_platform_device);
 
-       retval = driver_register(&rtc_device_driver);
+       retval = platform_driver_register(&rtc_device_driver);
        if (retval < 0)
                platform_device_unregister(rtc_platform_device);
 
@@ -700,7 +699,7 @@ static int __devinit vr41xx_rtc_init(void)
 
 static void __devexit vr41xx_rtc_exit(void)
 {
-       driver_unregister(&rtc_device_driver);
+       platform_driver_unregister(&rtc_device_driver);
 
        platform_device_unregister(rtc_platform_device);
 }
index abc30cca664544e8c9f74aa92063527253f8bd7f..65830ec71042f0a2fd64666775138ce491bf3066 100644 (file)
@@ -4,7 +4,7 @@
  * Watchdog timer for PowerPC Book-E systems
  *
  * Author: Matthew McClintock
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor Inc.
  *
index da631c114fd17089e4ad475377e813bfa8f9618a..9defcf861b67095e2a245b1ddeae0686d75badc7 100644 (file)
@@ -139,7 +139,7 @@ static int mpcore_wdt_set_heartbeat(int t)
  */
 static int mpcore_wdt_open(struct inode *inode, struct file *file)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(&mpcore_wdt_dev->dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(mpcore_wdt_dev);
 
        if (test_and_set_bit(0, &wdt->timer_alive))
                return -EBUSY;
@@ -291,9 +291,9 @@ static int mpcore_wdt_ioctl(struct inode *inode, struct file *file,
  *     System shutdown handler.  Turn off the watchdog if we're
  *     restarting or halting the system.
  */
-static void mpcore_wdt_shutdown(struct device *_dev)
+static void mpcore_wdt_shutdown(struct platform_device *dev)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(_dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(dev);
 
        if (system_state == SYSTEM_RESTART || system_state == SYSTEM_HALT)
                mpcore_wdt_stop(wdt);
@@ -317,9 +317,8 @@ static struct miscdevice mpcore_wdt_miscdev = {
        .fops           = &mpcore_wdt_fops,
 };
 
-static int __devinit mpcore_wdt_probe(struct device *_dev)
+static int __devinit mpcore_wdt_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct mpcore_wdt *wdt;
        struct resource *res;
        int ret;
@@ -364,7 +363,7 @@ static int __devinit mpcore_wdt_probe(struct device *_dev)
        }
 
        mpcore_wdt_stop(wdt);
-       dev_set_drvdata(&dev->dev, wdt);
+       platform_set_drvdata(&dev->dev, wdt);
        mpcore_wdt_dev = dev;
 
        return 0;
@@ -379,11 +378,11 @@ static int __devinit mpcore_wdt_probe(struct device *_dev)
        return ret;
 }
 
-static int __devexit mpcore_wdt_remove(struct device *dev)
+static int __devexit mpcore_wdt_remove(struct platform_device *dev)
 {
-       struct mpcore_wdt *wdt = dev_get_drvdata(dev);
+       struct mpcore_wdt *wdt = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        misc_deregister(&mpcore_wdt_miscdev);
 
@@ -395,13 +394,14 @@ static int __devexit mpcore_wdt_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver mpcore_wdt_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "mpcore_wdt",
-       .bus            = &platform_bus_type,
+static struct platform_driver mpcore_wdt_driver = {
        .probe          = mpcore_wdt_probe,
        .remove         = __devexit_p(mpcore_wdt_remove),
        .shutdown       = mpcore_wdt_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "mpcore_wdt",
+       },
 };
 
 static char banner[] __initdata = KERN_INFO "MPcore Watchdog Timer: 0.1. mpcore_noboot=%d mpcore_margin=%d sec (nowayout= %d)\n";
@@ -420,12 +420,12 @@ static int __init mpcore_wdt_init(void)
 
        printk(banner, mpcore_noboot, mpcore_margin, nowayout);
 
-       return driver_register(&mpcore_wdt_driver);
+       return platform_driver_register(&mpcore_wdt_driver);
 }
 
 static void __exit mpcore_wdt_exit(void)
 {
-       driver_unregister(&mpcore_wdt_driver);
+       platform_driver_unregister(&mpcore_wdt_driver);
 }
 
 module_init(mpcore_wdt_init);
index 119b3c541d9510077e14598409bf7c8ac3cc261f..00d9ef04a3697dde00f1d2121c526c33f4ec0c5e 100644 (file)
@@ -182,10 +182,9 @@ static struct miscdevice mv64x60_wdt_miscdev = {
        .fops = &mv64x60_wdt_fops,
 };
 
-static int __devinit mv64x60_wdt_probe(struct device *dev)
+static int __devinit mv64x60_wdt_probe(struct platform_device *dev)
 {
-       struct platform_device *pd = to_platform_device(dev);
-       struct mv64x60_wdt_pdata *pdata = pd->dev.platform_data;
+       struct mv64x60_wdt_pdata *pdata = dev->dev.platform_data;
        int bus_clk = 133;
 
        mv64x60_wdt_timeout = 10;
@@ -202,7 +201,7 @@ static int __devinit mv64x60_wdt_probe(struct device *dev)
        return misc_register(&mv64x60_wdt_miscdev);
 }
 
-static int __devexit mv64x60_wdt_remove(struct device *dev)
+static int __devexit mv64x60_wdt_remove(struct platform_device *dev)
 {
        misc_deregister(&mv64x60_wdt_miscdev);
 
@@ -212,12 +211,13 @@ static int __devexit mv64x60_wdt_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver mv64x60_wdt_driver = {
-       .owner = THIS_MODULE,
-       .name = MV64x60_WDT_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv64x60_wdt_driver = {
        .probe = mv64x60_wdt_probe,
        .remove = __devexit_p(mv64x60_wdt_remove),
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = MV64x60_WDT_NAME,
+       },
 };
 
 static struct platform_device *mv64x60_wdt_dev;
@@ -235,14 +235,14 @@ static int __init mv64x60_wdt_init(void)
                goto out;
        }
 
-       ret = driver_register(&mv64x60_wdt_driver);
+       ret = platform_driver_register(&mv64x60_wdt_driver);
       out:
        return ret;
 }
 
 static void __exit mv64x60_wdt_exit(void)
 {
-       driver_unregister(&mv64x60_wdt_driver);
+       platform_driver_unregister(&mv64x60_wdt_driver);
        platform_device_unregister(mv64x60_wdt_dev);
 }
 
index d9ef55bdf88a2c141ca3c0c9cb629092e1094635..2451edbefece8ab448a5ece121a1a35ee70f87fc 100644 (file)
@@ -755,7 +755,6 @@ static struct pci_device_id pcipcwd_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, pcipcwd_pci_tbl);
 
 static struct pci_driver pcipcwd_driver = {
-       .owner          = THIS_MODULE,
        .name           = WATCHDOG_NAME,
        .id_table       = pcipcwd_pci_tbl,
        .probe          = pcipcwd_card_init,
index 751cb77b0715531803d85010e5a09529f55d124c..eb667daee19b6de487c28a2563ce42b2dc44935a 100644 (file)
@@ -347,15 +347,14 @@ static irqreturn_t s3c2410wdt_irq(int irqno, void *param,
 }
 /* device interface */
 
-static int s3c2410wdt_probe(struct device *dev)
+static int s3c2410wdt_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int started = 0;
        int ret;
        int size;
 
-       DBG("%s: probe=%p, device=%p\n", __FUNCTION__, pdev, dev);
+       DBG("%s: probe=%p\n", __FUNCTION__, pdev);
 
        /* get the memory region for the watchdog timer */
 
@@ -386,13 +385,13 @@ static int s3c2410wdt_probe(struct device *dev)
                return -ENOENT;
        }
 
-       ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, dev);
+       ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev);
        if (ret != 0) {
                printk(KERN_INFO PFX "failed to install irq (%d)\n", ret);
                return ret;
        }
 
-       wdt_clock = clk_get(dev, "watchdog");
+       wdt_clock = clk_get(&pdev->dev, "watchdog");
        if (wdt_clock == NULL) {
                printk(KERN_INFO PFX "failed to find watchdog clock source\n");
                return -ENOENT;
@@ -430,7 +429,7 @@ static int s3c2410wdt_probe(struct device *dev)
        return 0;
 }
 
-static int s3c2410wdt_remove(struct device *dev)
+static int s3c2410wdt_remove(struct platform_device *dev)
 {
        if (wdt_mem != NULL) {
                release_resource(wdt_mem);
@@ -454,7 +453,7 @@ static int s3c2410wdt_remove(struct device *dev)
        return 0;
 }
 
-static void s3c2410wdt_shutdown(struct device *dev)
+static void s3c2410wdt_shutdown(struct platform_device *dev)
 {
        s3c2410wdt_stop();      
 }
@@ -464,7 +463,7 @@ static void s3c2410wdt_shutdown(struct device *dev)
 static unsigned long wtcon_save;
 static unsigned long wtdat_save;
 
-static int s3c2410wdt_suspend(struct device *dev, pm_message_t state)
+static int s3c2410wdt_suspend(struct platform_device *dev, pm_message_t state)
 {
        /* Save watchdog state, and turn it off. */
        wtcon_save = readl(wdt_base + S3C2410_WTCON);
@@ -476,7 +475,7 @@ static int s3c2410wdt_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c2410wdt_resume(struct device *dev)
+static int s3c2410wdt_resume(struct platform_device *dev)
 {
        /* Restore watchdog state. */
 
@@ -496,15 +495,16 @@ static int s3c2410wdt_resume(struct device *dev)
 #endif /* CONFIG_PM */
 
 
-static struct device_driver s3c2410wdt_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2410-wdt",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410wdt_driver = {
        .probe          = s3c2410wdt_probe,
        .remove         = s3c2410wdt_remove,
        .shutdown       = s3c2410wdt_shutdown,
        .suspend        = s3c2410wdt_suspend,
        .resume         = s3c2410wdt_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-wdt",
+       },
 };
 
 
@@ -513,12 +513,12 @@ static char banner[] __initdata = KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Si
 static int __init watchdog_init(void)
 {
        printk(banner);
-       return driver_register(&s3c2410wdt_driver);
+       return platform_driver_register(&s3c2410wdt_driver);
 }
 
 static void __exit watchdog_exit(void)
 {
-       driver_unregister(&s3c2410wdt_driver);
+       platform_driver_unregister(&s3c2410wdt_driver);
 }
 
 module_init(watchdog_init);
index dc9370f6c3480e55b13f6e1d8803a0461eb66d25..4b3311993d4876bf91f07ef9e9c2147bc75e3278 100644 (file)
@@ -711,7 +711,6 @@ MODULE_DEVICE_TABLE(pci, wdtpci_pci_tbl);
 
 
 static struct pci_driver wdtpci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "wdt_pci",
        .id_table       = wdtpci_pci_tbl,
        .probe          = wdtpci_init_one,
index 1e5dfc7805e289acf2063f95774bf387e6ab4876..c81bd4bce1b8648b69b7e730f5c2c414be5d85bf 100644 (file)
 
 #define HDAPS_POLL_PERIOD      (HZ/20) /* poll for input every 1/20s */
 #define HDAPS_INPUT_FUZZ       4       /* input event threshold */
+#define HDAPS_INPUT_FLAT       4
 
 static struct timer_list hdaps_timer;
 static struct platform_device *pdev;
+static struct input_dev *hdaps_idev;
 static unsigned int hdaps_invert;
 static u8 km_activity;
 static int rest_x;
@@ -284,7 +286,7 @@ out:
 
 /* Device model stuff */
 
-static int hdaps_probe(struct device *dev)
+static int hdaps_probe(struct platform_device *dev)
 {
        int ret;
 
@@ -296,29 +298,18 @@ static int hdaps_probe(struct device *dev)
        return 0;
 }
 
-static int hdaps_resume(struct device *dev)
+static int hdaps_resume(struct platform_device *dev)
 {
        return hdaps_device_init();
 }
 
-static struct device_driver hdaps_driver = {
-       .name = "hdaps",
-       .bus = &platform_bus_type,
-       .owner = THIS_MODULE,
+static struct platform_driver hdaps_driver = {
        .probe = hdaps_probe,
-       .resume = hdaps_resume
-};
-
-/* Input class stuff */
-
-static struct input_dev hdaps_idev = {
-       .name = "hdaps",
-       .evbit = { BIT(EV_ABS) },
-       .absbit = { BIT(ABS_X) | BIT(ABS_Y) },
-       .absmin  = { [ABS_X] = -256, [ABS_Y] = -256 },
-       .absmax  = { [ABS_X] = 256, [ABS_Y] = 256 },
-       .absfuzz = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
-       .absflat = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
+       .resume = hdaps_resume,
+       .driver = {
+               .name = "hdaps",
+               .owner = THIS_MODULE,
+       },
 };
 
 /*
@@ -342,9 +333,9 @@ static void hdaps_mousedev_poll(unsigned long unused)
        if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y))
                goto out;
 
-       input_report_abs(&hdaps_idev, ABS_X, x - rest_x);
-       input_report_abs(&hdaps_idev, ABS_Y, y - rest_y);
-       input_sync(&hdaps_idev);
+       input_report_abs(hdaps_idev, ABS_X, x - rest_x);
+       input_report_abs(hdaps_idev, ABS_Y, y - rest_y);
+       input_sync(hdaps_idev);
 
        mod_timer(&hdaps_timer, jiffies + HDAPS_POLL_PERIOD);
 
@@ -550,7 +541,7 @@ static int __init hdaps_init(void)
                goto out;
        }
 
-       ret = driver_register(&hdaps_driver);
+       ret = platform_driver_register(&hdaps_driver);
        if (ret)
                goto out_region;
 
@@ -564,12 +555,25 @@ static int __init hdaps_init(void)
        if (ret)
                goto out_device;
 
+       hdaps_idev = input_allocate_device();
+       if (!hdaps_idev) {
+               ret = -ENOMEM;
+               goto out_group;
+       }
+
        /* initial calibrate for the input device */
        hdaps_calibrate();
 
        /* initialize the input class */
-       hdaps_idev.dev = &pdev->dev;
-       input_register_device(&hdaps_idev);
+       hdaps_idev->name = "hdaps";
+       hdaps_idev->cdev.dev = &pdev->dev;
+       hdaps_idev->evbit[0] = BIT(EV_ABS);
+       input_set_abs_params(hdaps_idev, ABS_X,
+                       -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
+       input_set_abs_params(hdaps_idev, ABS_X,
+                       -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
+
+       input_register_device(hdaps_idev);
 
        /* start up our timer for the input device */
        init_timer(&hdaps_timer);
@@ -580,10 +584,12 @@ static int __init hdaps_init(void)
        printk(KERN_INFO "hdaps: driver successfully loaded.\n");
        return 0;
 
+out_group:
+       sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group);
 out_device:
        platform_device_unregister(pdev);
 out_driver:
-       driver_unregister(&hdaps_driver);
+       platform_driver_unregister(&hdaps_driver);
 out_region:
        release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS);
 out:
@@ -594,10 +600,10 @@ out:
 static void __exit hdaps_exit(void)
 {
        del_timer_sync(&hdaps_timer);
-       input_unregister_device(&hdaps_idev);
+       input_unregister_device(hdaps_idev);
        sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group);
        platform_device_unregister(pdev);
-       driver_unregister(&hdaps_driver);
+       platform_driver_unregister(&hdaps_driver);
        release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS);
 
        printk(KERN_INFO "hdaps: driver unloaded.\n");
index ba90f5140af672fa847d02849c9f7996c24abefb..3eb47890db40b24e627e468487595a696115b252 100644 (file)
@@ -513,7 +513,6 @@ static void __devexit ali1535_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver ali1535_driver = {
-       .owner          = THIS_MODULE,
        .name           = "ali1535_smbus",
        .id_table       = ali1535_ids,
        .probe          = ali1535_probe,
index f1a62d8924255c6b0507d451db37716e6f1b7062..e6f63208fc4a631df15682ed6a32c3c5f68793bd 100644 (file)
@@ -408,7 +408,6 @@ static struct pci_device_id __devinitdata ali1563_id_table[] = {
 MODULE_DEVICE_TABLE (pci, ali1563_id_table);
 
 static struct pci_driver ali1563_pci_driver = {
-       .owner          = THIS_MODULE,
        .name           = "ali1563_smbus",
        .id_table       = ali1563_id_table,
        .probe          = ali1563_probe,
index 400b08ed429934536af5c504b5197d0bb265bb48..7a5c0941dbc13f396aaabaf5881f48eb0650761c 100644 (file)
@@ -504,7 +504,6 @@ static void __devexit ali15x3_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver ali15x3_driver = {
-       .owner          = THIS_MODULE,
        .name           = "ali15x3_smbus",
        .id_table       = ali15x3_ids,
        .probe          = ali15x3_probe,
index de035d137c3f30c0afbebecc942b258e5a410b9c..1750dedaf4b5620a553455778efd62d3bf9ca2fd 100644 (file)
@@ -401,7 +401,6 @@ static void __devexit amd756_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver amd756_driver = {
-       .owner          = THIS_MODULE,
        .name           = "amd756_smbus",
        .id_table       = amd756_ids,
        .probe          = amd756_probe,
index f3b79a68dbec5a9fd27beb7d4dbcc796b63db37e..e5ef560e686ae8c5f8bdab1b8a2d38e0d90e933f 100644 (file)
@@ -384,7 +384,6 @@ static void __devexit amd8111_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver amd8111_driver = {
-       .owner          = THIS_MODULE,
        .name           = "amd8111_smbus2",
        .id_table       = amd8111_ids,
        .probe          = amd8111_probe,
index 1b5354e24bf56c8a7d0a8ee55d503e8ccf30fa4a..e0cb3b0f92faba50a64d40f437188f106aaa9c57 100644 (file)
@@ -155,7 +155,6 @@ static void __devexit hydra_remove(struct pci_dev *dev)
 
 
 static struct pci_driver hydra_driver = {
-       .owner          = THIS_MODULE,
        .name           = "hydra_smbus",
        .id_table       = hydra_ids,
        .probe          = hydra_probe,
index 4f63195069dafa7a4a9a464b7e90e447ab7bb69c..ac3eafa8aac02453c3c8a9b4a2d1d6d0de964cb7 100644 (file)
@@ -560,7 +560,6 @@ static void __devexit i801_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver i801_driver = {
-       .owner          = THIS_MODULE,
        .name           = "i801_smbus",
        .id_table       = i801_ids,
        .probe          = i801_probe,
index 52bc30593bd7e90bf0a26f22f06fb18c918bfddf..748be30f2bae3d740d35914dba90ba72f7b7f3bc 100644 (file)
@@ -233,7 +233,6 @@ static void __devexit i810_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver i810_driver = {
-       .owner          = THIS_MODULE,
        .name           = "i810_smbus",
        .id_table       = i810_ids,
        .probe          = i810_probe,
index cfae4ad00faee2bb6ca81b1ed34a7c71f1c66126..1414851a17b8ee1ea13df7124060dec12522055b 100644 (file)
@@ -405,10 +405,9 @@ static struct i2c_algorithm iop3xx_i2c_algo = {
 };
 
 static int 
-iop3xx_i2c_remove(struct device *device)
+iop3xx_i2c_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(device);
-       struct i2c_adapter *padapter = dev_get_drvdata(&pdev->dev);
+       struct i2c_adapter *padapter = platform_get_drvdata(pdev);
        struct i2c_algo_iop3xx_data *adapter_data = 
                (struct i2c_algo_iop3xx_data *)padapter->algo_data;
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -426,15 +425,14 @@ iop3xx_i2c_remove(struct device *device)
        kfree(adapter_data);
        kfree(padapter);
 
-       dev_set_drvdata(&pdev->dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        return 0;
 }
 
 static int 
-iop3xx_i2c_probe(struct device *dev)
+iop3xx_i2c_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        int ret;
        struct i2c_adapter *new_adapter;
@@ -499,7 +497,7 @@ iop3xx_i2c_probe(struct device *dev)
        iop3xx_i2c_set_slave_addr(adapter_data);
        iop3xx_i2c_enable(adapter_data);
 
-       dev_set_drvdata(&pdev->dev, new_adapter);
+       platform_set_drvdata(pdev, new_adapter);
        new_adapter->algo_data = adapter_data;
 
        i2c_add_adapter(new_adapter);
@@ -523,24 +521,25 @@ out:
 }
 
 
-static struct device_driver iop3xx_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IOP3xx-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver iop3xx_i2c_driver = {
        .probe          = iop3xx_i2c_probe,
-       .remove         = iop3xx_i2c_remove
+       .remove         = iop3xx_i2c_remove,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "IOP3xx-I2C",
+       },
 };
 
 static int __init 
 i2c_iop3xx_init (void)
 {
-       return driver_register(&iop3xx_i2c_driver);
+       return platform_driver_register(&iop3xx_i2c_driver);
 }
 
 static void __exit 
 i2c_iop3xx_exit (void)
 {
-       driver_unregister(&iop3xx_i2c_driver);
+       platform_driver_unregister(&iop3xx_i2c_driver);
        return;
 }
 
index 64552a376f2d000291690abe8d4d4d685a768daf..cef024a7d048eaf63b79765700228dbf4fe9f3dd 100644 (file)
@@ -86,12 +86,11 @@ struct ixp2000_i2c_data {
        struct i2c_algo_bit_data algo_data;
 };
 
-static int ixp2000_i2c_remove(struct device *dev)
+static int ixp2000_i2c_remove(struct platform_device *plat_dev)
 {
-       struct platform_device *plat_dev = to_platform_device(dev);
-       struct ixp2000_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
+       struct ixp2000_i2c_data *drv_data = platform_get_drvdata(plat_dev);
 
-       dev_set_drvdata(&plat_dev->dev, NULL);
+       platform_set_drvdata(plat_dev, NULL);
 
        i2c_bit_del_bus(&drv_data->adapter);
 
@@ -100,10 +99,9 @@ static int ixp2000_i2c_remove(struct device *dev)
        return 0;
 }
 
-static int ixp2000_i2c_probe(struct device *dev)
+static int ixp2000_i2c_probe(struct platform_device *plat_dev)
 {
        int err;
-       struct platform_device *plat_dev = to_platform_device(dev);
        struct ixp2000_i2c_pins *gpio = plat_dev->dev.platform_data;
        struct ixp2000_i2c_data *drv_data = 
                kzalloc(sizeof(struct ixp2000_i2c_data), GFP_KERNEL);
@@ -139,27 +137,28 @@ static int ixp2000_i2c_probe(struct device *dev)
                return err;
        } 
 
-       dev_set_drvdata(&plat_dev->dev, drv_data);
+       platform_set_drvdata(plat_dev, drv_data);
 
        return 0;
 }
 
-static struct device_driver ixp2000_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IXP2000-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp2000_i2c_driver = {
        .probe          = ixp2000_i2c_probe,
        .remove         = ixp2000_i2c_remove,
+       .driver         = {
+               .name   = "IXP2000-I2C",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ixp2000_i2c_init(void)
 {
-       return driver_register(&ixp2000_i2c_driver);
+       return platform_driver_register(&ixp2000_i2c_driver);
 }
 
 static void __exit ixp2000_i2c_exit(void)
 {
-       driver_unregister(&ixp2000_i2c_driver);
+       platform_driver_unregister(&ixp2000_i2c_driver);
 }
 
 module_init(ixp2000_i2c_init);
index cc652c3508149b73ed03ed3ef990c0365efd3fcc..f87220be3c87ddc09795e1d77d6dc1eda0e56986 100644 (file)
@@ -35,7 +35,7 @@
 
 #include <asm/hardware.h>      /* Pick up IXP4xx-specific bits */
 
-static struct device_driver ixp4xx_i2c_driver;
+static struct platform_driver ixp4xx_i2c_driver;
 
 static inline int ixp4xx_scl_pin(void *data)
 {
@@ -87,12 +87,11 @@ struct ixp4xx_i2c_data {
        struct i2c_algo_bit_data algo_data;
 };
 
-static int ixp4xx_i2c_remove(struct device *dev)
+static int ixp4xx_i2c_remove(struct platform_device *plat_dev)
 {
-       struct platform_device *plat_dev = to_platform_device(dev);
-       struct ixp4xx_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
+       struct ixp4xx_i2c_data *drv_data = platform_get_drvdata(plat_dev);
 
-       dev_set_drvdata(&plat_dev->dev, NULL);
+       platform_set_drvdata(plat_dev, NULL);
 
        i2c_bit_del_bus(&drv_data->adapter);
 
@@ -101,10 +100,9 @@ static int ixp4xx_i2c_remove(struct device *dev)
        return 0;
 }
 
-static int ixp4xx_i2c_probe(struct device *dev)
+static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
 {
        int err;
-       struct platform_device *plat_dev = to_platform_device(dev);
        struct ixp4xx_i2c_pins *gpio = plat_dev->dev.platform_data;
        struct ixp4xx_i2c_data *drv_data = 
                kzalloc(sizeof(struct ixp4xx_i2c_data), GFP_KERNEL);
@@ -130,7 +128,7 @@ static int ixp4xx_i2c_probe(struct device *dev)
        drv_data->algo_data.timeout = 100;
 
        drv_data->adapter.id = I2C_HW_B_IXP4XX;
-       strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.name,
+       strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.driver.name,
                I2C_NAME_SIZE);
        drv_data->adapter.algo_data = &drv_data->algo_data;
 
@@ -142,33 +140,35 @@ static int ixp4xx_i2c_probe(struct device *dev)
        gpio_line_set(gpio->sda_pin, 0);
 
        if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
-               printk(KERN_ERR "ERROR: Could not install %s\n", dev->bus_id);
+               printk(KERN_ERR "ERROR: Could not install %s\n", 
+                               plat_dev->dev.bus_id);
 
                kfree(drv_data);
                return err;
        }
 
-       dev_set_drvdata(&plat_dev->dev, drv_data);
+       platform_set_drvdata(plat_dev, drv_data);
 
        return 0;
 }
 
-static struct device_driver ixp4xx_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "IXP4XX-I2C",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp4xx_i2c_driver = {
        .probe          = ixp4xx_i2c_probe,
        .remove         = ixp4xx_i2c_remove,
+       .driver         = {
+               .name   = "IXP4XX-I2C",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ixp4xx_i2c_init(void)
 {
-       return driver_register(&ixp4xx_i2c_driver);
+       return platform_driver_register(&ixp4xx_i2c_driver);
 }
 
 static void __exit ixp4xx_i2c_exit(void)
 {
-       driver_unregister(&ixp4xx_i2c_driver);
+       platform_driver_unregister(&ixp4xx_i2c_driver);
 }
 
 module_init(ixp4xx_i2c_init);
index 65b939a059e9b6fd803cacc7699533b3fd58b559..5ccd338a9dc98f19c273bcc81e3e758e0ab85594 100644 (file)
@@ -288,11 +288,10 @@ static struct i2c_adapter mpc_ops = {
        .retries = 1
 };
 
-static int fsl_i2c_probe(struct device *device)
+static int fsl_i2c_probe(struct platform_device *pdev)
 {
        int result = 0;
        struct mpc_i2c *i2c;
-       struct platform_device *pdev = to_platform_device(device);
        struct fsl_i2c_platform_data *pdata;
        struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
@@ -323,7 +322,7 @@ static int fsl_i2c_probe(struct device *device)
                }
 
        mpc_i2c_setclock(i2c);
-       dev_set_drvdata(device, i2c);
+       platform_set_drvdata(pdev, i2c);
 
        i2c->adap = mpc_ops;
        i2c_set_adapdata(&i2c->adap, i2c);
@@ -345,12 +344,12 @@ static int fsl_i2c_probe(struct device *device)
        return result;
 };
 
-static int fsl_i2c_remove(struct device *device)
+static int fsl_i2c_remove(struct platform_device *pdev)
 {
-       struct mpc_i2c *i2c = dev_get_drvdata(device);
+       struct mpc_i2c *i2c = platform_get_drvdata(pdev);
 
        i2c_del_adapter(&i2c->adap);
-       dev_set_drvdata(device, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (i2c->irq != 0)
                free_irq(i2c->irq, i2c);
@@ -361,22 +360,23 @@ static int fsl_i2c_remove(struct device *device)
 };
 
 /* Structure for a device driver */
-static struct device_driver fsl_i2c_driver = {
-       .owner = THIS_MODULE,
-       .name = "fsl-i2c",
-       .bus = &platform_bus_type,
+static struct platform_driver fsl_i2c_driver = {
        .probe = fsl_i2c_probe,
        .remove = fsl_i2c_remove,
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "fsl-i2c",
+       },
 };
 
 static int __init fsl_i2c_init(void)
 {
-       return driver_register(&fsl_i2c_driver);
+       return platform_driver_register(&fsl_i2c_driver);
 }
 
 static void __exit fsl_i2c_exit(void)
 {
-       driver_unregister(&fsl_i2c_driver);
+       platform_driver_unregister(&fsl_i2c_driver);
 }
 
 module_init(fsl_i2c_init);
index 6b48027b2ee340b9cdab8624c03f7c029abea6b2..afd7634e5cc9f1bf68a2ae358f689cad2c55fd09 100644 (file)
@@ -492,11 +492,10 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
 }
 
 static int __devinit
-mv64xxx_i2c_probe(struct device *dev)
+mv64xxx_i2c_probe(struct platform_device *pd)
 {
-       struct platform_device          *pd = to_platform_device(dev);
        struct mv64xxx_i2c_data         *drv_data;
-       struct mv64xxx_i2c_pdata        *pdata = dev->platform_data;
+       struct mv64xxx_i2c_pdata        *pdata = pd->dev.platform_data;
        int     rc;
 
        if ((pd->id != 0) || !pdata)
@@ -526,7 +525,7 @@ mv64xxx_i2c_probe(struct device *dev)
        drv_data->adapter.class = I2C_CLASS_HWMON;
        drv_data->adapter.timeout = pdata->timeout;
        drv_data->adapter.retries = pdata->retries;
-       dev_set_drvdata(dev, drv_data);
+       platform_set_drvdata(pd, drv_data);
        i2c_set_adapdata(&drv_data->adapter, drv_data);
 
        if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0,
@@ -555,9 +554,9 @@ mv64xxx_i2c_probe(struct device *dev)
 }
 
 static int __devexit
-mv64xxx_i2c_remove(struct device *dev)
+mv64xxx_i2c_remove(struct platform_device *dev)
 {
-       struct mv64xxx_i2c_data         *drv_data = dev_get_drvdata(dev);
+       struct mv64xxx_i2c_data         *drv_data = platform_get_drvdata(dev);
        int     rc;
 
        rc = i2c_del_adapter(&drv_data->adapter);
@@ -568,24 +567,25 @@ mv64xxx_i2c_remove(struct device *dev)
        return rc;
 }
 
-static struct device_driver mv64xxx_i2c_driver = {
-       .owner  = THIS_MODULE,
-       .name   = MV64XXX_I2C_CTLR_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mv64xxx_i2c_driver = {
        .probe  = mv64xxx_i2c_probe,
        .remove = mv64xxx_i2c_remove,
+       .driver = {
+               .owner  = THIS_MODULE,
+               .name   = MV64XXX_I2C_CTLR_NAME,
+       },
 };
 
 static int __init
 mv64xxx_i2c_init(void)
 {
-       return driver_register(&mv64xxx_i2c_driver);
+       return platform_driver_register(&mv64xxx_i2c_driver);
 }
 
 static void __exit
 mv64xxx_i2c_exit(void)
 {
-       driver_unregister(&mv64xxx_i2c_driver);
+       platform_driver_unregister(&mv64xxx_i2c_driver);
 }
 
 module_init(mv64xxx_i2c_init);
index fd26036e68a3eef2742ae4a31d1d4ae38fbbeeab..4d18e6e5f1599275c5faf3ad59dbc8fbe81b661c 100644 (file)
@@ -347,7 +347,6 @@ static void __devexit nforce2_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver nforce2_driver = {
-       .owner          = THIS_MODULE,
        .name           = "nForce2_smbus",
        .id_table       = nforce2_ids,
        .probe          = nforce2_probe,
index 7d63eec423fef258625a4e73e53e5fa286b76c79..692f473454813722d9a8cd676eb3d724265e2a72 100644 (file)
@@ -462,7 +462,6 @@ static void __devexit piix4_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver piix4_driver = {
-       .owner          = THIS_MODULE,
        .name           = "piix4_smbus",
        .id_table       = piix4_ids,
        .probe          = piix4_probe,
index 42cb1d8ca6596beb41ebe9aa31f16b2e853e3b52..9479525892e3e337d0872eef7f630041776bf0ff 100644 (file)
@@ -301,7 +301,6 @@ static struct pci_device_id prosavage_pci_tbl[] = {
 MODULE_DEVICE_TABLE (pci, prosavage_pci_tbl);
 
 static struct pci_driver prosavage_driver = {
-       .owner          =       THIS_MODULE,
        .name           =       "prosavage_smbus",
        .id_table       =       prosavage_pci_tbl,
        .probe          =       prosavage_probe,
index 67ccbea24ba4b54d546f794b385798d5e193d4a1..70f7ab829d36f5dee4db91bfd5a8ed80a41d944e 100644 (file)
@@ -936,10 +936,10 @@ static struct pxa_i2c i2c_pxa = {
        },
 };
 
-static int i2c_pxa_probe(struct device *dev)
+static int i2c_pxa_probe(struct platform_device *dev)
 {
        struct pxa_i2c *i2c = &i2c_pxa;
-       struct i2c_pxa_platform_data *plat = dev->platform_data;
+       struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
        int ret;
 
 #ifdef CONFIG_PXA27x
@@ -968,7 +968,7 @@ static int i2c_pxa_probe(struct device *dev)
        i2c_pxa_reset(i2c);
 
        i2c->adap.algo_data = i2c;
-       i2c->adap.dev.parent = dev;
+       i2c->adap.dev.parent = &dev->dev;
 
        ret = i2c_add_adapter(&i2c->adap);
        if (ret < 0) {
@@ -976,7 +976,7 @@ static int i2c_pxa_probe(struct device *dev)
                goto err_irq;
        }
 
-       dev_set_drvdata(dev, i2c);
+       platform_set_drvdata(dev, i2c);
 
 #ifdef CONFIG_I2C_PXA_SLAVE
        printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
@@ -993,11 +993,11 @@ static int i2c_pxa_probe(struct device *dev)
        return ret;
 }
 
-static int i2c_pxa_remove(struct device *dev)
+static int i2c_pxa_remove(struct platform_device *dev)
 {
-       struct pxa_i2c *i2c = dev_get_drvdata(dev);
+       struct pxa_i2c *i2c = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        i2c_del_adapter(&i2c->adap);
        free_irq(IRQ_I2C, i2c);
@@ -1006,21 +1006,22 @@ static int i2c_pxa_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver i2c_pxa_driver = {
-       .name           = "pxa2xx-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver i2c_pxa_driver = {
        .probe          = i2c_pxa_probe,
        .remove         = i2c_pxa_remove,
+       .driver         = {
+               .name   = "pxa2xx-i2c",
+       },
 };
 
 static int __init i2c_adap_pxa_init(void)
 {
-       return driver_register(&i2c_pxa_driver);
+       return platform_driver_register(&i2c_pxa_driver);
 }
 
 static void i2c_adap_pxa_exit(void)
 {
-       return driver_unregister(&i2c_pxa_driver);
+       return platform_driver_unregister(&i2c_pxa_driver);
 }
 
 module_init(i2c_adap_pxa_init);
index 1b582262e677ed89ce68b9277e927d4f61046948..58cfd3111ef62fac86eadd283b437018995bd4b4 100644 (file)
@@ -760,24 +760,23 @@ static void s3c24xx_i2c_free(struct s3c24xx_i2c *i2c)
  * called by the bus driver when a suitable device is found
 */
 
-static int s3c24xx_i2c_probe(struct device *dev)
+static int s3c24xx_i2c_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct s3c24xx_i2c *i2c = &s3c24xx_i2c;
        struct resource *res;
        int ret;
 
        /* find the clock and enable it */
 
-       i2c->dev = dev;
-       i2c->clk = clk_get(dev, "i2c");
+       i2c->dev = &pdev->dev;
+       i2c->clk = clk_get(&pdev->dev, "i2c");
        if (IS_ERR(i2c->clk)) {
-               dev_err(dev, "cannot get clock\n");
+               dev_err(&pdev->dev, "cannot get clock\n");
                ret = -ENOENT;
                goto out;
        }
 
-       dev_dbg(dev, "clock source %p\n", i2c->clk);
+       dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk);
 
        clk_use(i2c->clk);
        clk_enable(i2c->clk);
@@ -786,7 +785,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
-               dev_err(dev, "cannot find IO resource\n");
+               dev_err(&pdev->dev, "cannot find IO resource\n");
                ret = -ENOENT;
                goto out;
        }
@@ -795,7 +794,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
                                         pdev->name);
 
        if (i2c->ioarea == NULL) {
-               dev_err(dev, "cannot request IO\n");
+               dev_err(&pdev->dev, "cannot request IO\n");
                ret = -ENXIO;
                goto out;
        }
@@ -803,17 +802,17 @@ static int s3c24xx_i2c_probe(struct device *dev)
        i2c->regs = ioremap(res->start, (res->end-res->start)+1);
 
        if (i2c->regs == NULL) {
-               dev_err(dev, "cannot map IO\n");
+               dev_err(&pdev->dev, "cannot map IO\n");
                ret = -ENXIO;
                goto out;
        }
 
-       dev_dbg(dev, "registers %p (%p, %p)\n", i2c->regs, i2c->ioarea, res);
+       dev_dbg(&pdev->dev, "registers %p (%p, %p)\n", i2c->regs, i2c->ioarea, res);
 
        /* setup info block for the i2c core */
 
        i2c->adap.algo_data = i2c;
-       i2c->adap.dev.parent = dev;
+       i2c->adap.dev.parent = &pdev->dev;
 
        /* initialise the i2c controller */
 
@@ -827,7 +826,7 @@ static int s3c24xx_i2c_probe(struct device *dev)
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (res == NULL) {
-               dev_err(dev, "cannot find IRQ\n");
+               dev_err(&pdev->dev, "cannot find IRQ\n");
                ret = -ENOENT;
                goto out;
        }
@@ -836,23 +835,23 @@ static int s3c24xx_i2c_probe(struct device *dev)
                          pdev->name, i2c);
 
        if (ret != 0) {
-               dev_err(dev, "cannot claim IRQ\n");
+               dev_err(&pdev->dev, "cannot claim IRQ\n");
                goto out;
        }
 
        i2c->irq = res;
                
-       dev_dbg(dev, "irq resource %p (%ld)\n", res, res->start);
+       dev_dbg(&pdev->dev, "irq resource %p (%ld)\n", res, res->start);
 
        ret = i2c_add_adapter(&i2c->adap);
        if (ret < 0) {
-               dev_err(dev, "failed to add bus to i2c core\n");
+               dev_err(&pdev->dev, "failed to add bus to i2c core\n");
                goto out;
        }
 
-       dev_set_drvdata(dev, i2c);
+       platform_set_drvdata(pdev, i2c);
 
-       dev_info(dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id);
+       dev_info(&pdev->dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id);
 
  out:
        if (ret < 0)
@@ -866,22 +865,22 @@ static int s3c24xx_i2c_probe(struct device *dev)
  * called when device is removed from the bus
 */
 
-static int s3c24xx_i2c_remove(struct device *dev)
+static int s3c24xx_i2c_remove(struct platform_device *pdev)
 {
-       struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
+       struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
        
        if (i2c != NULL) {
                s3c24xx_i2c_free(i2c);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(pdev, NULL);
        }
 
        return 0;
 }
 
 #ifdef CONFIG_PM
-static int s3c24xx_i2c_resume(struct device *dev)
+static int s3c24xx_i2c_resume(struct platform_device *dev)
 {
-       struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
+       struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
 
        if (i2c != NULL)
                s3c24xx_i2c_init(i2c);
@@ -895,33 +894,35 @@ static int s3c24xx_i2c_resume(struct device *dev)
 
 /* device driver for platform bus bits */
 
-static struct device_driver s3c2410_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2410-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_i2c_driver = {
        .probe          = s3c24xx_i2c_probe,
        .remove         = s3c24xx_i2c_remove,
        .resume         = s3c24xx_i2c_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-i2c",
+       },
 };
 
-static struct device_driver s3c2440_i2c_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "s3c2440-i2c",
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_i2c_driver = {
        .probe          = s3c24xx_i2c_probe,
        .remove         = s3c24xx_i2c_remove,
        .resume         = s3c24xx_i2c_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2440-i2c",
+       },
 };
 
 static int __init i2c_adap_s3c_init(void)
 {
        int ret;
 
-       ret = driver_register(&s3c2410_i2c_driver);
+       ret = platform_driver_register(&s3c2410_i2c_driver);
        if (ret == 0) {
-               ret = driver_register(&s3c2440_i2c_driver);
+               ret = platform_driver_register(&s3c2440_i2c_driver);
                if (ret)
-                       driver_unregister(&s3c2410_i2c_driver);
+                       platform_driver_unregister(&s3c2410_i2c_driver);
        }
 
        return ret;
@@ -929,8 +930,8 @@ static int __init i2c_adap_s3c_init(void)
 
 static void __exit i2c_adap_s3c_exit(void)
 {
-       driver_unregister(&s3c2410_i2c_driver);
-       driver_unregister(&s3c2440_i2c_driver);
+       platform_driver_unregister(&s3c2410_i2c_driver);
+       platform_driver_unregister(&s3c2440_i2c_driver);
 }
 
 module_init(i2c_adap_s3c_init);
index aebe87ba403331ec55ac20aa3092790fb2a812b5..0c8518298e4da3da0df6188849c6b3881393dabf 100644 (file)
@@ -179,7 +179,6 @@ static void __devexit savage4_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver savage4_driver = {
-       .owner          = THIS_MODULE,
        .name           = "savage4_smbus",
        .id_table       = savage4_ids,
        .probe          = savage4_probe,
index 3ad27c3ba15b70c25dca176ccef80343f472373c..b57ab74d23ecaa42c14ff8d0a22a225766ba7c12 100644 (file)
@@ -398,7 +398,6 @@ static void __devexit sis5595_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver sis5595_driver = {
-       .owner          = THIS_MODULE,
        .name           = "sis5595_smbus",
        .id_table       = sis5595_ids,
        .probe          = sis5595_probe,
index 7f49e5fd3ff0501a9ee482eb34b3fba193a00487..acb75e2824140220fcea0b4e010fac3e0c69f0fb 100644 (file)
@@ -496,7 +496,6 @@ static void __devexit sis630_remove(struct pci_dev *dev)
 
 
 static struct pci_driver sis630_driver = {
-       .owner          = THIS_MODULE,
        .name           = "sis630_smbus",
        .id_table       = sis630_ids,
        .probe          = sis630_probe,
index 6a134c091324043e65bad89ef8304c13de1be4eb..3024907cdafe6d44bd0eaf1a54a8edc587987584 100644 (file)
@@ -329,7 +329,6 @@ static void __devexit sis96x_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver sis96x_driver = {
-       .owner          = THIS_MODULE,
        .name           = "sis96x_smbus",
        .id_table       = sis96x_ids,
        .probe          = sis96x_probe,
index 544a38e64394613e1422d55fb4d9833e9b9f70d0..484bbacfce6bf005fc435f7f1a653fdc7659495f 100644 (file)
@@ -159,7 +159,6 @@ static void __devexit vt586b_remove(struct pci_dev *dev)
 
 
 static struct pci_driver vt586b_driver = {
-       .owner          = THIS_MODULE,
        .name           = "vt586b_smbus",
        .id_table       = vt586b_ids,
        .probe          = vt586b_probe,
index a2237d4b2cf29c71742b6a81638b2ce43f792d51..47e52bf2c5ec836f606e3c1a66684b1489771745 100644 (file)
@@ -440,7 +440,6 @@ static struct pci_device_id vt596_ids[] = {
 MODULE_DEVICE_TABLE(pci, vt596_ids);
 
 static struct pci_driver vt596_driver = {
-       .owner          = THIS_MODULE,
        .name           = "vt596_smbus",
        .id_table       = vt596_ids,
        .probe          = vt596_probe,
index 650c3ebde84c0a5feaaf064162bfdfe3f2e12626..b675773b0cc1d19a9222b87fd319027b4bfef773 100644 (file)
@@ -225,7 +225,6 @@ static void __devexit voodoo3_remove(struct pci_dev *dev)
 }
 
 static struct pci_driver voodoo3_driver = {
-       .owner          = THIS_MODULE,
        .name           = "voodoo3_smbus",
        .id_table       = voodoo3_ids,
        .probe          = voodoo3_probe,
index 9dbb72fffbe2520fdcc47d220cb272adf4a81be4..d2a100d778392239a281591d7f1d8c8019aa197d 100644 (file)
@@ -873,26 +873,27 @@ static int otg_init(struct isp1301 *isp)
        return 0;
 }
 
-static int otg_probe(struct device *dev)
+static int otg_probe(struct platform_device *dev)
 {
        // struct omap_usb_config *config = dev->platform_data;
 
-       otg_dev = to_platform_device(dev);
+       otg_dev = dev;
        return 0;
 }
 
-static int otg_remove(struct device *dev)
+static int otg_remove(struct platform_device *dev)
 {
        otg_dev = 0;
        return 0;
 }
 
-struct device_driver omap_otg_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "omap_otg",
-       .bus            = &platform_bus_type,
+struct platform_driver omap_otg_driver = {
        .probe          = otg_probe,
-       .remove         = otg_remove,   
+       .remove         = otg_remove,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "omap_otg",
+       },
 };
 
 static int otg_bind(struct isp1301 *isp)
@@ -902,7 +903,7 @@ static int otg_bind(struct isp1301 *isp)
        if (otg_dev)
                return -EBUSY;
 
-       status = driver_register(&omap_otg_driver);
+       status = platform_driver_register(&omap_otg_driver);
        if (status < 0)
                return status;
 
@@ -913,7 +914,7 @@ static int otg_bind(struct isp1301 *isp)
                status = -ENODEV;
 
        if (status < 0)
-               driver_unregister(&omap_otg_driver);
+               platform_driver_unregister(&omap_otg_driver);
        return status;
 }
 
index 42e5b8175cbf256d531e2bc5b07206566fbcbbef..31e649a9ff710a9462057fb894228587c647634d 100644 (file)
@@ -625,7 +625,7 @@ config BLK_DEV_NS87415
        tristate "NS87415 chipset support"
        help
          This driver adds detection and support for the NS87415 chip
-         (used in SPARC64, among others).
+         (used mainly on SPARC64 and PA-RISC machines).
 
          Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
 
@@ -787,6 +787,10 @@ config BLK_DEV_IDE_PMAC_BLINK
          This option enables the use of the sleep LED as a hard drive
          activity LED.
 
+config BLK_DEV_IDE_SWARM
+       tristate "IDE for Sibyte evaluation boards"
+       depends on SIBYTE_SB1xxx_SOC
+
 config BLK_DEV_IDE_AU1XXX
        bool "IDE for AMD Alchemy Au1200"
        depends on SOC_AU1200
index cca9c075966dd219a235d91a8bbf353126001008..569fae7175032f8ae285fc5b4039c218325f54cf 100644 (file)
@@ -48,6 +48,6 @@ obj-$(CONFIG_BLK_DEV_IDECD)           += ide-cd.o
 obj-$(CONFIG_BLK_DEV_IDETAPE)          += ide-tape.o
 obj-$(CONFIG_BLK_DEV_IDEFLOPPY)                += ide-floppy.o
 
-obj-$(CONFIG_BLK_DEV_IDE)              += legacy/ arm/
+obj-$(CONFIG_BLK_DEV_IDE)              += legacy/ arm/ mips/
 obj-$(CONFIG_BLK_DEV_HD)               += legacy/
 obj-$(CONFIG_ETRAX_IDE)                += cris/
diff --git a/drivers/ide/mips/Makefile b/drivers/ide/mips/Makefile
new file mode 100644 (file)
index 0000000..578e52a
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_BLK_DEV_IDE_SWARM)                += swarm.o
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c
new file mode 100644 (file)
index 0000000..66f6064
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2001, 2002, 2003 Broadcom Corporation
+ * Copyright (C) 2004 MontaVista Software Inc.
+ *     Author: Manish Lachwani, mlachwani@mvista.com
+ * Copyright (C) 2004  MIPS Technologies, Inc.  All rights reserved.
+ *     Author: Maciej W. Rozycki <macro@mips.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+/*
+ *  Derived loosely from ide-pmac.c, so:
+ *  Copyright (C) 1998 Paul Mackerras.
+ *  Copyright (C) 1995-1998 Mark Lord
+ */
+
+/*
+ * Boards with SiByte processors so far have supported IDE devices via
+ * the Generic Bus, PCI bus, and built-in PCMCIA interface.  In all
+ * cases, byte-swapping must be avoided for these devices (whereas
+ * other PCI devices, for example, will require swapping).  Any
+ * SiByte-targetted kernel including IDE support will include this
+ * file.  Probing of a Generic Bus for an IDE device is controlled by
+ * the definition of "SIBYTE_HAVE_IDE", which is provided by
+ * <asm/sibyte/board.h> for Broadcom boards.
+ */
+
+#include <linux/ide.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/platform_device.h>
+
+#include <asm/io.h>
+
+#include <asm/sibyte/board.h>
+#include <asm/sibyte/sb1250_genbus.h>
+#include <asm/sibyte/sb1250_regs.h>
+
+#define DRV_NAME "ide-swarm"
+
+static char swarm_ide_string[] = DRV_NAME;
+
+static struct resource swarm_ide_resource = {
+       .name   = "SWARM GenBus IDE",
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device *swarm_ide_dev;
+
+/*
+ * swarm_ide_probe - if the board header indicates the existence of
+ * Generic Bus IDE, allocate a HWIF for it.
+ */
+static int __devinit swarm_ide_probe(struct device *dev)
+{
+       ide_hwif_t *hwif;
+       u8 __iomem *base;
+       phys_t offset, size;
+       int i;
+
+       if (!SIBYTE_HAVE_IDE)
+               return -ENODEV;
+
+       /* Find an empty slot.  */
+       for (i = 0; i < MAX_HWIFS; i++)
+               if (!ide_hwifs[i].io_ports[IDE_DATA_OFFSET])
+                       break;
+       if (i >= MAX_HWIFS) {
+               printk(KERN_ERR DRV_NAME ": no free slot for interface\n");
+               return -ENOMEM;
+       }
+
+       hwif = ide_hwifs + i;
+
+       base = ioremap(A_IO_EXT_BASE, 0x800);
+       offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS));
+       size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS));
+       iounmap(base);
+
+       offset = G_IO_START_ADDR(offset) << S_IO_ADDRBASE;
+       size = (G_IO_MULT_SIZE(size) + 1) << S_IO_REGSIZE;
+       if (offset < A_PHYS_GENBUS || offset >= A_PHYS_GENBUS_END) {
+               printk(KERN_INFO DRV_NAME
+                      ": IDE interface at GenBus disabled\n");
+               return -EBUSY;
+       }
+
+       printk(KERN_INFO DRV_NAME ": IDE interface at GenBus slot %i\n",
+              IDE_CS);
+
+       swarm_ide_resource.start = offset;
+       swarm_ide_resource.end = offset + size - 1;
+       if (request_resource(&iomem_resource, &swarm_ide_resource)) {
+               printk(KERN_ERR DRV_NAME
+                      ": can't request I/O memory resource\n");
+               return -EBUSY;
+       }
+
+       base = ioremap(offset, size);
+
+       /* Setup MMIO ops.  */
+       default_hwif_mmiops(hwif);
+       /* Prevent resource map manipulation.  */
+       hwif->mmio = 2;
+       hwif->noprobe = 0;
+
+       for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
+               hwif->hw.io_ports[i] =
+                               (unsigned long)(base + ((0x1f0 + i) << 5));
+       hwif->hw.io_ports[IDE_CONTROL_OFFSET] =
+                               (unsigned long)(base + (0x3f6 << 5));
+       hwif->hw.irq = K_INT_GB_IDE;
+
+       memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
+       hwif->irq = hwif->hw.irq;
+
+       dev_set_drvdata(dev, hwif);
+
+       return 0;
+}
+
+static struct device_driver swarm_ide_driver = {
+       .name   = swarm_ide_string,
+       .bus    = &platform_bus_type,
+       .probe  = swarm_ide_probe,
+};
+
+static void swarm_ide_platform_release(struct device *device)
+{
+       struct platform_device *pldev;
+
+       /* free device */
+       pldev = to_platform_device(device);
+       kfree(pldev);
+}
+
+static int __devinit swarm_ide_init_module(void)
+{
+       struct platform_device *pldev;
+       int err;
+
+       printk(KERN_INFO "SWARM IDE driver\n");
+
+       if (driver_register(&swarm_ide_driver)) {
+               printk(KERN_ERR "Driver registration failed\n");
+               err = -ENODEV;
+               goto out;
+       }
+
+        if (!(pldev = kmalloc(sizeof (*pldev), GFP_KERNEL))) {
+               err = -ENOMEM;
+               goto out_unregister_driver;
+       }
+
+       memset (pldev, 0, sizeof (*pldev));
+       pldev->name             = swarm_ide_string;
+       pldev->id               = 0;
+       pldev->dev.release      = swarm_ide_platform_release;
+
+       if (platform_device_register(pldev)) {
+               err = -ENODEV;
+               goto out_free_pldev;
+       }
+
+        if (!pldev->dev.driver) {
+               /*
+                * The driver was not bound to this device, there was
+                 * no hardware at this address. Unregister it, as the
+                * release fuction will take care of freeing the
+                * allocated structure
+                */
+               platform_device_unregister (pldev);
+       }
+
+       swarm_ide_dev = pldev;
+
+       return 0;
+
+out_free_pldev:
+       kfree(pldev);
+
+out_unregister_driver:
+       driver_unregister(&swarm_ide_driver);
+out:
+       return err;
+}
+
+module_init(swarm_ide_init_module);
index ea0806c82be08ca22e7363404b05713b60595118..8a5c7b286b2b86dbf5d0e9c9c00ed8ef134541d4 100644 (file)
@@ -399,34 +399,6 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c
        return dev->irq;
 }
 
-static void __devinit init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base)
-{
-       unsigned int rev;
-       u8 dma_state;
-
-       DBG(("init_dma_sl82c105(hwif: ide%d, dma_base: 0x%08x)\n", hwif->index, dma_base));
-
-       hwif->autodma = 0;
-
-       if (!dma_base)
-               return;
-
-       dma_state = hwif->INB(dma_base + 2);
-       rev = sl82c105_bridge_revision(hwif->pci_dev);
-       if (rev <= 5) {
-               printk("    %s: Winbond 553 bridge revision %d, BM-DMA disabled\n",
-                      hwif->name, rev);
-               dma_state &= ~0x60;
-       } else {
-               dma_state |= 0x60;
-               if (!noautodma)
-                       hwif->autodma = 1;
-       }
-       hwif->OUTB(dma_state, dma_base + 2);
-
-       ide_setup_dma(hwif, dma_base, 8);
-}
-
 /*
  * Initialise the chip
  */
@@ -434,6 +406,8 @@ static void __devinit init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base
 static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = hwif->pci_dev;
+       unsigned int rev;
+       u8 dma_state;
        u32 val;
        
        DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
@@ -455,33 +429,54 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
        pci_read_config_dword(dev, 0x40, &val);
        *((u32 *)&hwif->hwif_data) = val;
        
+       hwif->atapi_dma = 0;
+       hwif->mwdma_mask = 0;
+       hwif->swdma_mask = 0;
+       hwif->autodma = 0;
+
        if (!hwif->dma_base)
                return;
 
-       hwif->atapi_dma = 1;
-       hwif->mwdma_mask = 0x07;
-       hwif->swdma_mask = 0x07;
-
+       dma_state = hwif->INB(hwif->dma_base + 2) & ~0x60;
+       rev = sl82c105_bridge_revision(hwif->pci_dev);
+       if (rev <= 5) {
+               /*
+                * Never ever EVER under any circumstances enable
+                * DMA when the bridge is this old.
+                */
+               printk("    %s: Winbond 553 bridge revision %d, BM-DMA disabled\n",
+                      hwif->name, rev);
+       } else {
 #ifdef CONFIG_BLK_DEV_IDEDMA
-       hwif->ide_dma_check = &sl82c105_check_drive;
-       hwif->ide_dma_on = &sl82c105_ide_dma_on;
-       hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly;
-       hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq;
-       hwif->dma_start = &sl82c105_ide_dma_start;
-       hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout;
-
-       if (!noautodma)
-               hwif->autodma = 1;
-       hwif->drives[0].autodma = hwif->autodma;
-       hwif->drives[1].autodma = hwif->autodma;
+               dma_state |= 0x60;
+
+               hwif->atapi_dma = 1;
+               hwif->mwdma_mask = 0x07;
+               hwif->swdma_mask = 0x07;
+
+               hwif->ide_dma_check = &sl82c105_check_drive;
+               hwif->ide_dma_on = &sl82c105_ide_dma_on;
+               hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly;
+               hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq;
+               hwif->dma_start = &sl82c105_ide_dma_start;
+               hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout;
+
+               if (!noautodma)
+                       hwif->autodma = 1;
+               hwif->drives[0].autodma = hwif->autodma;
+               hwif->drives[1].autodma = hwif->autodma;
+
+               if (hwif->mate)
+                       hwif->serialized = hwif->mate->serialized = 1;
 #endif /* CONFIG_BLK_DEV_IDEDMA */
+       }
+       hwif->OUTB(dma_state, hwif->dma_base + 2);
 }
 
 static ide_pci_device_t sl82c105_chipset __devinitdata = {
        .name           = "W82C105",
        .init_chipset   = init_chipset_sl82c105,
        .init_hwif      = init_hwif_sl82c105,
-       .init_dma       = init_dma_sl82c105,
        .channels       = 2,
        .autodma        = NOAUTODMA,
        .enablebits     = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
index b3e65a65d202c268a276657c0451ca7a37d565bf..136911a86e84f67c3a0509a4b3bda6c8b5794029 100644 (file)
@@ -1667,11 +1667,16 @@ static struct macio_driver pmac_ide_macio_driver =
 };
 
 static struct pci_device_id pmac_ide_pci_match[] = {
-       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_SH_ATA,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID2_ATA,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 };
 
 static struct pci_driver pmac_ide_pci_driver = {
index 18ed7765417ce7a649a987ac0b8438bbdea184ea..d4f2111d43641e5701a86384242c1e70991f3429 100644 (file)
@@ -787,8 +787,9 @@ static int pre_init = 1;            /* Before first ordered IDE scan */
 static LIST_HEAD(ide_pci_drivers);
 
 /*
- *     ide_register_pci_driver         -       attach IDE driver
+ *     __ide_register_pci_driver       -       attach IDE driver
  *     @driver: pci driver
+ *     @module: owner module of the driver
  *
  *     Registers a driver with the IDE layer. The IDE layer arranges that
  *     boot time setup is done in the expected device order and then 
@@ -801,15 +802,16 @@ static LIST_HEAD(ide_pci_drivers);
  *     Returns are the same as for pci_register_driver
  */
 
-int ide_pci_register_driver(struct pci_driver *driver)
+int __ide_pci_register_driver(struct pci_driver *driver, struct module *module)
 {
        if(!pre_init)
-               return pci_module_init(driver);
+               return __pci_register_driver(driver, module);
+       driver->driver.owner = module;
        list_add_tail(&driver->node, &ide_pci_drivers);
        return 0;
 }
 
-EXPORT_SYMBOL_GPL(ide_pci_register_driver);
+EXPORT_SYMBOL_GPL(__ide_pci_register_driver);
 
 /**
  *     ide_unregister_pci_driver       -       unregister an IDE driver
@@ -897,6 +899,6 @@ void __init ide_scan_pcibus (int scan_direction)
        {
                list_del(l);
                d = list_entry(l, struct pci_driver, node);
-               pci_register_driver(d);
+               __pci_register_driver(d, d->driver.owner);
        }
 }
index 147f248a8073c0ed3528b169e7829a2030ce860a..6f94b25f3acd2ec15fda43cb337164ecb0ea7ccd 100644 (file)
@@ -1198,7 +1198,6 @@ MODULE_DEVICE_TABLE(pci, mthca_pci_table);
 
 static struct pci_driver mthca_driver = {
        .name           = DRV_NAME,
-       .owner          = THIS_MODULE,
        .id_table       = mthca_pci_table,
        .probe          = mthca_init_one,
        .remove         = __devexit_p(mthca_remove_one)
index d00d14bb637a70b9a49125fa308413efd14eca60..64672d491222a99e62f48849f9b7c3139e72a06e 100644 (file)
@@ -259,17 +259,17 @@ static void corgikbd_hinge_timer(unsigned long data)
 }
 
 #ifdef CONFIG_PM
-static int corgikbd_suspend(struct device *dev, pm_message_t state)
+static int corgikbd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(dev);
        corgikbd->suspended = 1;
 
        return 0;
 }
 
-static int corgikbd_resume(struct device *dev)
+static int corgikbd_resume(struct platform_device *dev)
 {
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(dev);
 
        /* Upon resume, ignore the suspend key for a short while */
        corgikbd->suspend_jiffies=jiffies;
@@ -282,7 +282,7 @@ static int corgikbd_resume(struct device *dev)
 #define corgikbd_resume                NULL
 #endif
 
-static int __init corgikbd_probe(struct device *dev)
+static int __init corgikbd_probe(struct platform_device *pdev)
 {
        struct corgikbd *corgikbd;
        struct input_dev *input_dev;
@@ -296,7 +296,7 @@ static int __init corgikbd_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, corgikbd);
+       platform_set_drvdata(pdev, corgikbd);
 
        corgikbd->input = input_dev;
        spin_lock_init(&corgikbd->lock);
@@ -321,7 +321,7 @@ static int __init corgikbd_probe(struct device *dev)
        input_dev->id.vendor = 0x0001;
        input_dev->id.product = 0x0001;
        input_dev->id.version = 0x0100;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &pdev->dev;
        input_dev->private = corgikbd;
 
        input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW);
@@ -356,10 +356,10 @@ static int __init corgikbd_probe(struct device *dev)
        return 0;
 }
 
-static int corgikbd_remove(struct device *dev)
+static int corgikbd_remove(struct platform_device *pdev)
 {
        int i;
-       struct corgikbd *corgikbd = dev_get_drvdata(dev);
+       struct corgikbd *corgikbd = platform_get_drvdata(pdev);
 
        for (i = 0; i < CORGI_KEY_SENSE_NUM; i++)
                free_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd);
@@ -374,23 +374,24 @@ static int corgikbd_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgikbd_driver = {
-       .name           = "corgi-keyboard",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgikbd_driver = {
        .probe          = corgikbd_probe,
        .remove         = corgikbd_remove,
        .suspend        = corgikbd_suspend,
        .resume         = corgikbd_resume,
+       .driver         = {
+               .name   = "corgi-keyboard",
+       },
 };
 
 static int __devinit corgikbd_init(void)
 {
-       return driver_register(&corgikbd_driver);
+       return platform_driver_register(&corgikbd_driver);
 }
 
 static void __exit corgikbd_exit(void)
 {
-       driver_unregister(&corgikbd_driver);
+       platform_driver_unregister(&corgikbd_driver);
 }
 
 module_init(corgikbd_init);
index 0fa38a559cdfedc0815a4d91f521f111b08fd86d..6a15fe3bc527071e683fa12c0eb4944a4a6e5251 100644 (file)
@@ -309,10 +309,10 @@ static void spitzkbd_hinge_timer(unsigned long data)
 }
 
 #ifdef CONFIG_PM
-static int spitzkbd_suspend(struct device *dev, pm_message_t state)
+static int spitzkbd_suspend(struct platform_device *dev, pm_message_t state)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
        spitzkbd->suspended = 1;
 
        /* Set Strobe lines as inputs - *except* strobe line 0 leave this
@@ -323,10 +323,10 @@ static int spitzkbd_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int spitzkbd_resume(struct device *dev)
+static int spitzkbd_resume(struct platform_device *dev)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
 
        for (i = 0; i < SPITZ_KEY_STROBE_NUM; i++)
                pxa_gpio_mode(spitz_strobes[i] | GPIO_OUT | GPIO_DFLT_HIGH);
@@ -342,7 +342,7 @@ static int spitzkbd_resume(struct device *dev)
 #define spitzkbd_resume                NULL
 #endif
 
-static int __init spitzkbd_probe(struct device *dev)
+static int __init spitzkbd_probe(struct platform_device *dev)
 {
        struct spitzkbd *spitzkbd;
        struct input_dev *input_dev;
@@ -358,7 +358,7 @@ static int __init spitzkbd_probe(struct device *dev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(dev, spitzkbd);
+       platform_set_drvdata(dev, spitzkbd);
        strcpy(spitzkbd->phys, "spitzkbd/input0");
 
        spin_lock_init(&spitzkbd->lock);
@@ -380,7 +380,7 @@ static int __init spitzkbd_probe(struct device *dev)
        input_dev->private = spitzkbd;
        input_dev->name = "Spitz Keyboard";
        input_dev->phys = spitzkbd->phys;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &dev->dev;
 
        input_dev->id.bustype = BUS_HOST;
        input_dev->id.vendor = 0x0001;
@@ -437,10 +437,10 @@ static int __init spitzkbd_probe(struct device *dev)
        return 0;
 }
 
-static int spitzkbd_remove(struct device *dev)
+static int spitzkbd_remove(struct platform_device *dev)
 {
        int i;
-       struct spitzkbd *spitzkbd = dev_get_drvdata(dev);
+       struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
 
        for (i = 0; i < SPITZ_KEY_SENSE_NUM; i++)
                free_irq(IRQ_GPIO(spitz_senses[i]), spitzkbd);
@@ -460,23 +460,24 @@ static int spitzkbd_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver spitzkbd_driver = {
-       .name           = "spitz-keyboard",
-       .bus            = &platform_bus_type,
+static struct platform_driver spitzkbd_driver = {
        .probe          = spitzkbd_probe,
        .remove         = spitzkbd_remove,
        .suspend        = spitzkbd_suspend,
        .resume         = spitzkbd_resume,
+       .driver         = {
+               .name   = "spitz-keyboard",
+       },
 };
 
 static int __devinit spitzkbd_init(void)
 {
-       return driver_register(&spitzkbd_driver);
+       return platform_driver_register(&spitzkbd_driver);
 }
 
 static void __exit spitzkbd_exit(void)
 {
-       driver_unregister(&spitzkbd_driver);
+       platform_driver_unregister(&spitzkbd_driver);
 }
 
 module_init(spitzkbd_init);
index 01e186422021d3a5c594f5b59a376543b817b2e5..ac86c1d1d83e4a24bffdc6bcaa94ab66cffc75c9 100644 (file)
@@ -912,7 +912,7 @@ static long i8042_panic_blink(long count)
  * Here we try to restore the original BIOS settings
  */
 
-static int i8042_suspend(struct device *dev, pm_message_t state)
+static int i8042_suspend(struct platform_device *dev, pm_message_t state)
 {
        del_timer_sync(&i8042_timer);
        i8042_controller_reset();
@@ -925,7 +925,7 @@ static int i8042_suspend(struct device *dev, pm_message_t state)
  * Here we try to reset everything back to a state in which suspended
  */
 
-static int i8042_resume(struct device *dev)
+static int i8042_resume(struct platform_device *dev)
 {
        int i;
 
@@ -964,17 +964,18 @@ static int i8042_resume(struct device *dev)
  * because otherwise BIOSes will be confused.
  */
 
-static void i8042_shutdown(struct device *dev)
+static void i8042_shutdown(struct platform_device *dev)
 {
        i8042_controller_cleanup();
 }
 
-static struct device_driver i8042_driver = {
-       .name           = "i8042",
-       .bus            = &platform_bus_type,
+static struct platform_driver i8042_driver = {
        .suspend        = i8042_suspend,
        .resume         = i8042_resume,
        .shutdown       = i8042_shutdown,
+       .driver         = {
+               .name   = "i8042",
+       },
 };
 
 static int __init i8042_create_kbd_port(void)
@@ -1078,7 +1079,7 @@ static int __init i8042_init(void)
                goto err_platform_exit;
        }
 
-       err = driver_register(&i8042_driver);
+       err = platform_driver_register(&i8042_driver);
        if (err)
                goto err_controller_cleanup;
 
@@ -1126,7 +1127,7 @@ static int __init i8042_init(void)
  err_unregister_device:
        platform_device_unregister(i8042_platform_device);
  err_unregister_driver:
-       driver_unregister(&i8042_driver);
+       platform_driver_unregister(&i8042_driver);
  err_controller_cleanup:
        i8042_controller_cleanup();
  err_platform_exit:
@@ -1148,7 +1149,7 @@ static void __exit i8042_exit(void)
        del_timer_sync(&i8042_timer);
 
        platform_device_unregister(i8042_platform_device);
-       driver_unregister(&i8042_driver);
+       platform_driver_unregister(&i8042_driver);
 
        i8042_platform_exit();
 
index 52c49258f8a4e4dc447dd5a98d89182e38d2b395..a3bd11589bc3a0371f421b621432a277c78fd43a 100644 (file)
@@ -107,7 +107,7 @@ static void rpckbd_close(struct serio *port)
  * Allocate and initialize serio structure for subsequent registration
  * with serio core.
  */
-static int __devinit rpckbd_probe(struct device *dev)
+static int __devinit rpckbd_probe(struct platform_device *dev)
 {
        struct serio *serio;
 
@@ -120,37 +120,38 @@ static int __devinit rpckbd_probe(struct device *dev)
        serio->write            = rpckbd_write;
        serio->open             = rpckbd_open;
        serio->close            = rpckbd_close;
-       serio->dev.parent       = dev;
+       serio->dev.parent       = &dev->dev;
        strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
        strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
 
-       dev_set_drvdata(dev, serio);
+       platform_set_drvdata(dev, serio);
        serio_register_port(serio);
        return 0;
 }
 
-static int __devexit rpckbd_remove(struct device *dev)
+static int __devexit rpckbd_remove(struct platform_device *dev)
 {
-       struct serio *serio = dev_get_drvdata(dev);
+       struct serio *serio = platform_get_drvdata(dev);
        serio_unregister_port(serio);
        return 0;
 }
 
-static struct device_driver rpckbd_driver = {
-       .name           = "kart",
-       .bus            = &platform_bus_type,
+static struct platform_driver rpckbd_driver = {
        .probe          = rpckbd_probe,
        .remove         = __devexit_p(rpckbd_remove),
+       .driver         = {
+               .name   = "kart",
+       },
 };
 
 static int __init rpckbd_init(void)
 {
-       return driver_register(&rpckbd_driver);
+       return platform_driver_register(&rpckbd_driver);
 }
 
 static void __exit rpckbd_exit(void)
 {
-       driver_unregister(&rpckbd_driver);
+       platform_driver_unregister(&rpckbd_driver);
 }
 
 module_init(rpckbd_init);
index 15e88eeae8d6daf1cacd4216080cffbc7b09f258..1042987856f7227012be466649e8336fd3b062c8 100644 (file)
@@ -231,9 +231,9 @@ static irqreturn_t ts_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 }
 
 #ifdef CONFIG_PM
-static int corgits_suspend(struct device *dev, pm_message_t state)
+static int corgits_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(dev);
 
        if (corgi_ts->pendown) {
                del_timer_sync(&corgi_ts->timer);
@@ -248,9 +248,9 @@ static int corgits_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int corgits_resume(struct device *dev)
+static int corgits_resume(struct platform_device *dev)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(dev);
 
        corgi_ssp_ads7846_putget((4u << ADSCTRL_ADR_SH) | ADSCTRL_STS);
        /* Enable Falling Edge */
@@ -264,10 +264,9 @@ static int corgits_resume(struct device *dev)
 #define corgits_resume         NULL
 #endif
 
-static int __init corgits_probe(struct device *dev)
+static int __init corgits_probe(struct platform_device *pdev)
 {
        struct corgi_ts *corgi_ts;
-       struct platform_device *pdev = to_platform_device(dev);
        struct input_dev *input_dev;
        int err = -ENOMEM;
 
@@ -276,9 +275,9 @@ static int __init corgits_probe(struct device *dev)
        if (!corgi_ts || !input_dev)
                goto fail;
 
-       dev_set_drvdata(dev, corgi_ts);
+       platform_set_drvdata(pdev, corgi_ts);
 
-       corgi_ts->machinfo = dev->platform_data;
+       corgi_ts->machinfo = pdev->dev.platform_data;
        corgi_ts->irq_gpio = platform_get_irq(pdev, 0);
 
        if (corgi_ts->irq_gpio < 0) {
@@ -298,7 +297,7 @@ static int __init corgits_probe(struct device *dev)
        input_dev->id.vendor = 0x0001;
        input_dev->id.product = 0x0002;
        input_dev->id.version = 0x0100;
-       input_dev->cdev.dev = dev;
+       input_dev->cdev.dev = &pdev->dev;
        input_dev->private = corgi_ts;
 
        input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
@@ -339,9 +338,9 @@ static int __init corgits_probe(struct device *dev)
 
 }
 
-static int corgits_remove(struct device *dev)
+static int corgits_remove(struct platform_device *pdev)
 {
-       struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
+       struct corgi_ts *corgi_ts = platform_get_drvdata(pdev);
 
        free_irq(corgi_ts->irq_gpio, NULL);
        del_timer_sync(&corgi_ts->timer);
@@ -351,23 +350,24 @@ static int corgits_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgits_driver = {
-       .name           = "corgi-ts",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgits_driver = {
        .probe          = corgits_probe,
        .remove         = corgits_remove,
        .suspend        = corgits_suspend,
        .resume         = corgits_resume,
+       .driver         = {
+               .name   = "corgi-ts",
+       },
 };
 
 static int __devinit corgits_init(void)
 {
-       return driver_register(&corgits_driver);
+       return platform_driver_register(&corgits_driver);
 }
 
 static void __exit corgits_exit(void)
 {
-       driver_unregister(&corgits_driver);
+       platform_driver_unregister(&corgits_driver);
 }
 
 module_init(corgits_init);
index 801c98f30e5c7c767e1a39822033d68b81540626..c82105920d7187e6c46a3487fa90b6de94b82c94 100644 (file)
@@ -110,7 +110,7 @@ config HISAX_16_3
 
 config HISAX_TELESPCI
        bool "Teles PCI"
-       depends on PCI && (BROKEN || !(SPARC64 || PPC))
+       depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
        help
          This enables HiSax support for the Teles PCI.
          See <file:Documentation/isdn/README.HiSax> on how to configure it.
@@ -238,7 +238,7 @@ config HISAX_MIC
 
 config HISAX_NETJET
        bool "NETjet card"
-       depends on PCI && (BROKEN || !(SPARC64 || PPC))
+       depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
        help
          This enables HiSax support for the NetJet from Traverse
          Technologies.
@@ -249,7 +249,7 @@ config HISAX_NETJET
 
 config HISAX_NETJET_U
        bool "NETspider U card"
-       depends on PCI && (BROKEN || !(SPARC64 || PPC))
+       depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
        help
          This enables HiSax support for the Netspider U interface ISDN card
          from Traverse Technologies.
@@ -317,7 +317,7 @@ config HISAX_GAZEL
 
 config HISAX_HFC_PCI
        bool "HFC PCI-Bus cards"
-       depends on PCI && (BROKEN || !(SPARC64 || PPC))
+       depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
        help
          This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
 
@@ -344,14 +344,14 @@ config HISAX_HFC_SX
 
 config HISAX_ENTERNOW_PCI
        bool "Formula-n enter:now PCI card"
-       depends on PCI && (BROKEN || !(SPARC64 || PPC))
+       depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
        help
          This enables HiSax support for the Formula-n enter:now PCI
          ISDN card.
 
 config HISAX_AMD7930
        bool "Am7930 (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && (SPARC32 || SPARC64)
+       depends on EXPERIMENTAL && SPARC
        help
          This enables HiSax support for the AMD7930 chips on some SPARCs.
          This code is not finished yet.
index 32bf0d5d0f9a0d0692414c683a6547c3050be5e9..f8457ef488260bc4e4af7db6a3cdc9c672c15b5a 100644 (file)
@@ -71,78 +71,68 @@ typedef struct {
 /****************************************/
 static struct usb_device_id hfcusb_idtab[] = {
        {
-        .idVendor = 0x0959,
-        .idProduct = 0x2bd0,
+        USB_DEVICE(0x0959, 0x2bd0),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_OFF, {4, 0, 2, 1},
                           "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
        },
        {
-        .idVendor = 0x0675,
-        .idProduct = 0x1688,
+        USB_DEVICE(0x0675, 0x1688),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {1, 2, 0, 0},
                           "DrayTek miniVigor 128 USB ISDN TA"}),
        },
        {
-        .idVendor = 0x07b0,
-        .idProduct = 0x0007,
+        USB_DEVICE(0x07b0, 0x0007),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Billion tiny USB ISDN TA 128"}),
        },
        {
-        .idVendor = 0x0742,
-        .idProduct = 0x2008,
+        USB_DEVICE(0x0742, 0x2008),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "Stollmann USB TA"}),
         },
        {
-        .idVendor = 0x0742,
-        .idProduct = 0x2009,
+        USB_DEVICE(0x0742, 0x2009),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "Aceex USB ISDN TA"}),
         },
        {
-        .idVendor = 0x0742,
-        .idProduct = 0x200A,
+        USB_DEVICE(0x0742, 0x200A),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "OEM USB ISDN TA"}),
         },
        {
-        .idVendor = 0x08e3,
-        .idProduct = 0x0301,
+        USB_DEVICE(0x08e3, 0x0301),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {2, 0, 1, 4},
                           "Olitec USB RNIS"}),
         },
        {
-        .idVendor = 0x07fa,
-        .idProduct = 0x0846,
+        USB_DEVICE(0x07fa, 0x0846),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Bewan Modem RNIS USB"}),
         },
        {
-        .idVendor = 0x07fa,
-        .idProduct = 0x0847,
+        USB_DEVICE(0x07fa, 0x0847),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Djinn Numeris USB"}),
         },
        {
-        .idVendor = 0x07b0,
-        .idProduct = 0x0006,
+        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) */
 /***************************************************************/
index f06997faef16b06385b365bc5b1bf45ba56c1c4d..0933881ab0c263f903985a7973cd6b17a3974e2a 100644 (file)
@@ -3,7 +3,7 @@
 #
 config ISDN_DRV_PCBIT
        tristate "PCBIT-D support"
-       depends on ISDN_I4L && ISA && (BROKEN || !PPC)
+       depends on ISDN_I4L && ISA && (BROKEN || X86)
        help
          This enables support for the PCBIT ISDN-card.  This card is
          manufactured in Portugal by Octal.  For running this card,
index 51315302a85e43ab651a4edaba742784d5e04af2..252d55df964296c97960242a016fc7b8573c4279 100644 (file)
@@ -326,9 +326,9 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait)
                }
        }
 
-       ret = page->mapping->a_ops->prepare_write(NULL, page, 0, PAGE_SIZE);
+       ret = page->mapping->a_ops->prepare_write(bitmap->file, page, 0, PAGE_SIZE);
        if (!ret)
-               ret = page->mapping->a_ops->commit_write(NULL, page, 0,
+               ret = page->mapping->a_ops->commit_write(bitmap->file, page, 0,
                        PAGE_SIZE);
        if (ret) {
                unlock_page(page);
index adf960d8a7c98d1430c2e51b7e0250674b98abff..78c7418478d63e86f55127026d227bfae18e94a3 100644 (file)
@@ -3156,7 +3156,7 @@ static int md_ioctl(struct inode *inode, struct file *file,
                if (cnt > 0 ) {
                        printk(KERN_WARNING
                               "md: %s(pid %d) used deprecated START_ARRAY ioctl. "
-                              "This will not be supported beyond 2.6\n",
+                              "This will not be supported beyond July 2006\n",
                               current->comm, current->pid);
                        cnt--;
                }
@@ -3437,10 +3437,19 @@ static int md_thread(void * arg)
        allow_signal(SIGKILL);
        while (!kthread_should_stop()) {
 
-               wait_event_timeout(thread->wqueue,
-                                  test_bit(THREAD_WAKEUP, &thread->flags)
-                                  || kthread_should_stop(),
-                                  thread->timeout);
+               /* We need to wait INTERRUPTIBLE so that
+                * we don't add to the load-average.
+                * That means we need to be sure no signals are
+                * pending
+                */
+               if (signal_pending(current))
+                       flush_signals(current);
+
+               wait_event_interruptible_timeout
+                       (thread->wqueue,
+                        test_bit(THREAD_WAKEUP, &thread->flags)
+                        || kthread_should_stop(),
+                        thread->timeout);
                try_to_freeze();
 
                clear_bit(THREAD_WAKEUP, &thread->flags);
@@ -3837,11 +3846,20 @@ static int is_mddev_idle(mddev_t *mddev)
                curr_events = disk_stat_read(disk, sectors[0]) + 
                                disk_stat_read(disk, sectors[1]) - 
                                atomic_read(&disk->sync_io);
-               /* Allow some slack between valud of curr_events and last_events,
-                * as there are some uninteresting races.
+               /* The difference between curr_events and last_events
+                * will be affected by any new non-sync IO (making
+                * curr_events bigger) and any difference in the amount of
+                * in-flight syncio (making current_events bigger or smaller)
+                * The amount in-flight is currently limited to
+                * 32*64K in raid1/10 and 256*PAGE_SIZE in raid5/6
+                * which is at most 4096 sectors.
+                * These numbers are fairly fragile and should be made
+                * more robust, probably by enforcing the
+                * 'window size' that md_do_sync sort-of uses.
+                *
                 * Note: the following is an unsigned comparison.
                 */
-               if ((curr_events - rdev->last_events + 32) > 64) {
+               if ((curr_events - rdev->last_events + 4096) > 8192) {
                        rdev->last_events = curr_events;
                        idle = 0;
                }
@@ -4100,7 +4118,7 @@ static void md_do_sync(mddev_t *mddev)
                if (currspeed > sysctl_speed_limit_min) {
                        if ((currspeed > sysctl_speed_limit_max) ||
                                        !is_mddev_idle(mddev)) {
-                               msleep(250);
+                               msleep(500);
                                goto repeat;
                        }
                }
index 4b71fd6f7aed15b5ecf0382fcd8e622c2176d3c7..7972c73bc14eba1e1c3560a2c072cb28d917e624 100644 (file)
@@ -126,6 +126,66 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
 };
 EXPORT_SYMBOL_GPL(ir_codes_winfast);
 
+IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
+       [ 0x59 ] = KEY_MUTE,
+       [ 0x4a ] = KEY_POWER,
+
+       [ 0x18 ] = KEY_TEXT,
+       [ 0x26 ] = KEY_TV,
+       [ 0x3d ] = KEY_PRINT,
+
+       [ 0x48 ] = KEY_RED,
+       [ 0x04 ] = KEY_GREEN,
+       [ 0x11 ] = KEY_YELLOW,
+       [ 0x00 ] = KEY_BLUE,
+
+       [ 0x2d ] = KEY_VOLUMEUP,
+       [ 0x1e ] = KEY_VOLUMEDOWN,
+
+       [ 0x49 ] = KEY_MENU,
+
+       [ 0x16 ] = KEY_CHANNELUP,
+       [ 0x17 ] = KEY_CHANNELDOWN,
+
+       [ 0x20 ] = KEY_UP,
+       [ 0x21 ] = KEY_DOWN,
+       [ 0x22 ] = KEY_LEFT,
+       [ 0x23 ] = KEY_RIGHT,
+       [ 0x0d ] = KEY_SELECT,
+
+
+
+       [ 0x08 ] = KEY_BACK,
+       [ 0x07 ] = KEY_REFRESH,
+
+       [ 0x2f ] = KEY_ZOOM,
+       [ 0x29 ] = KEY_RECORD,
+
+       [ 0x4b ] = KEY_PAUSE,
+       [ 0x4d ] = KEY_REWIND,
+       [ 0x2e ] = KEY_PLAY,
+       [ 0x4e ] = KEY_FORWARD,
+       [ 0x53 ] = KEY_PREVIOUS,
+       [ 0x4c ] = KEY_STOP,
+       [ 0x54 ] = KEY_NEXT,
+
+       [ 0x69 ] = KEY_KP0,
+       [ 0x6a ] = KEY_KP1,
+       [ 0x6b ] = KEY_KP2,
+       [ 0x6c ] = KEY_KP3,
+       [ 0x6d ] = KEY_KP4,
+       [ 0x6e ] = KEY_KP5,
+       [ 0x6f ] = KEY_KP6,
+       [ 0x70 ] = KEY_KP7,
+       [ 0x71 ] = KEY_KP8,
+       [ 0x72 ] = KEY_KP9,
+
+       [ 0x74 ] = KEY_CHANNEL,
+       [ 0x0a ] = KEY_BACKSPACE,
+};
+
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle);
+
 /* empty keytable, can be used as placeholder for not-yet created keytables */
 IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = {
        [ 42 ] = KEY_COFFEE,
index d7417eac2abad01c54f16bcfa3f2e3af28d89599..2583a865a58e4c7aea3d09b01f832e30689d29ad 100644 (file)
@@ -7,6 +7,7 @@ config DVB_B2C2_FLEXCOP
        select DVB_NXT2002
        select DVB_STV0297
        select DVB_BCM3510
+       select DVB_LGDT330X
        help
          Support for the digital TV receiver chip made by B2C2 Inc. included in
          Technisats PCI cards and USB boxes.
index a1607e7d6d6bfba74eddb9798d42de0b16f69aa8..fb394a0d838c8df550b523eee0e17e7ad908cda2 100644 (file)
@@ -276,7 +276,7 @@ static void cinergyt2_free_stream_urbs (struct cinergyt2 *cinergyt2)
                if (cinergyt2->stream_urb[i])
                        usb_free_urb(cinergyt2->stream_urb[i]);
 
-       pci_free_consistent(NULL, STREAM_URB_COUNT*STREAM_BUF_SIZE,
+       usb_buffer_free(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE,
                            cinergyt2->streambuf, cinergyt2->streambuf_dmahandle);
 }
 
@@ -284,9 +284,8 @@ static int cinergyt2_alloc_stream_urbs (struct cinergyt2 *cinergyt2)
 {
        int i;
 
-       cinergyt2->streambuf = pci_alloc_consistent(NULL,
-                                             STREAM_URB_COUNT*STREAM_BUF_SIZE,
-                                             &cinergyt2->streambuf_dmahandle);
+       cinergyt2->streambuf = usb_buffer_alloc(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE,
+                                             SLAB_KERNEL, &cinergyt2->streambuf_dmahandle);
        if (!cinergyt2->streambuf) {
                dprintk(1, "failed to alloc consistent stream memory area, bailing out!\n");
                return -ENOMEM;
@@ -780,6 +779,8 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
 
        input_register_device(cinergyt2->rc_input_dev);
        schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
+
+       return 0;
 }
 
 static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2)
index 199b01188858325e169adb8f9a3e5caa6fc509bf..1a3b3c7e5e99699815245de164016959b549c6ed 100644 (file)
@@ -333,4 +333,18 @@ config VIDEO_M32R_AR_M64278
          Say Y here to use the Renesas M64278E-800 camera module,
          which supports VGA(640x480 pixcels) size of images.
 
+config VIDEO_AUDIO_DECODER
+       tristate "Add support for additional audio chipsets"
+       depends on VIDEO_DEV && I2C && EXPERIMENTAL
+       ---help---
+         Say Y here to compile drivers for WM8775 and CS53L32A audio
+         decoders.
+
+config VIDEO_DECODER
+       tristate "Add support for additional video chipsets"
+       depends on VIDEO_DEV && I2C && EXPERIMENTAL
+       ---help---
+         Say Y here to compile drivers for SAA7115, SAA7127 and CX25840
+         video  decoders.
+
 endmenu
index 3ac465992400b12ab438ffca5306d59c73fbca65..82060f9909d89db008fa0c5c48dc32b46d5b0cc3 100644 (file)
@@ -36,10 +36,11 @@ obj-$(CONFIG_VIDEO_CPIA) += cpia.o
 obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o
 obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o
 obj-$(CONFIG_VIDEO_MEYE) += meye.o
-obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
+obj-$(CONFIG_VIDEO_SAA7134) += ir-kbd-i2c.o saa7134/
 obj-$(CONFIG_VIDEO_CX88) += cx88/
 obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
 obj-$(CONFIG_VIDEO_EM28XX) += saa711x.o tvp5150.o
+obj-$(CONFIG_VIDEO_AUDIO_DECODER) += wm8775.o cs53l32a.o
 obj-$(CONFIG_VIDEO_OVCAMCHIP) += ovcamchip/
 obj-$(CONFIG_VIDEO_MXB) += saa7111.o tuner.o tda9840.o tea6415c.o tea6420.o mxb.o
 obj-$(CONFIG_VIDEO_HEXIUM_ORION) += hexium_orion.o
@@ -55,4 +56,6 @@ obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
 
 obj-$(CONFIG_VIDEO_M32R_AR_M64278) += arv.o
 
+obj-$(CONFIG_VIDEO_DECODER)     += saa7115.o cx25840/ saa7127.o
+
 EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
index 3413bace443a6a06da2d0de1a4db9aad6c82d017..e31ebb11c4684e552adfd161234ccde8817539e3 100644 (file)
@@ -2133,7 +2133,10 @@ struct tvcard bttv_tvcards[] = {
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .has_dvb        = 1,
+               .has_remote     = 1,
+               .gpiomask       = 0x1b,
                .no_gpioirq     = 1,
+               .any_irq                = 1,
        },
        [BTTV_BOARD_PV143] = {
                /* Jorge Boncompte - DTI2 <jorge@dti2.net> */
@@ -2796,7 +2799,24 @@ struct tvcard bttv_tvcards[] = {
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
        },
-
+               /* ---- card 0x8e ---------------------------------- */
+       [BTTV_BOARD_SABRENT_TVFM] = {
+               .name           = "Sabrent TV-FM (bttv version)",
+               .video_inputs   = 3,
+               .audio_inputs   = 1,
+               .tuner          = 0,
+               .svhs           = 2,
+               .gpiomask       = 0x108007,
+               .muxsel         = { 2, 3, 1, 1},
+               .audiomux       = { 100000, 100002, 100002, 100000},
+               .no_msp34xx     = 1,
+               .no_tda9875     = 1,
+               .no_tda7432     = 1,
+               .pll            = PLL_28,
+               .tuner_type     = TUNER_TNF_5335MF,
+               .tuner_addr     = ADDR_UNSET,
+               .has_radio      = 1,
+       },
 };
 
 static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3367,6 +3387,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                btv->has_remote=1;
        if (!bttv_tvcards[btv->c.type].no_gpioirq)
                btv->gpioirq=1;
+       if (bttv_tvcards[btv->c.type].any_irq)
+               btv->any_irq = 1;
        if (bttv_tvcards[btv->c.type].audio_hook)
                btv->audio_hook=bttv_tvcards[btv->c.type].audio_hook;
 
index 0005741d55141c0b1471cf8932845ac2e44990e9..709099f03bd20e5903a80e0f113f188824363330 100644 (file)
@@ -3667,6 +3667,10 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
        int handled = 0;
 
        btv=(struct bttv *)dev_id;
+
+       if (btv->any_irq)
+               handled = bttv_any_irq(&btv->c);
+
        count=0;
        while (1) {
                /* get/clear interrupt status bits */
index 575ce8b8e714d995a92c2f6f0daa53c09e6b2dac..616a5b7e510c5c68c80ea845bf746d135c165dfa 100644 (file)
@@ -113,6 +113,24 @@ void bttv_gpio_irq(struct bttv_core *core)
        }
 }
 
+int bttv_any_irq(struct bttv_core *core)
+{
+       struct bttv_sub_driver *drv;
+       struct bttv_sub_device *dev;
+       struct list_head *item;
+       int handled = 0;
+
+       list_for_each(item,&core->subs) {
+               dev = list_entry(item,struct bttv_sub_device,list);
+               drv = to_bttv_sub_drv(dev->dev.driver);
+               if (drv && drv->any_irq) {
+                       if (drv->any_irq(dev))
+                               handled = 1;
+               }
+       }
+       return handled;
+}
+
 /* ----------------------------------------------------------------------- */
 /* external: sub-driver register/unregister                                */
 
index 124ea41dada4d204d7705b584e0c159166ed31f5..93298f06e0199b4776b010c93bbc8c58008c15d8 100644 (file)
 #define BTTV_BOARD_PV_M4900                0x8b
 #define BTTV_BOARD_OSPREY440               0x8c
 #define BTTV_BOARD_ASOUND_SKYEYE          0x8d
+#define BTTV_BOARD_SABRENT_TVFM           0x8e
 
 /* i2c address list */
 #define I2C_TSA5522        0xc2
@@ -234,6 +235,7 @@ struct tvcard
        unsigned int has_dvb:1;
        unsigned int has_remote:1;
        unsigned int no_gpioirq:1;
+       unsigned int any_irq:1;
 
        /* other settings */
        unsigned int pll;
@@ -333,6 +335,7 @@ struct bttv_sub_driver {
        struct device_driver   drv;
        char                   wanted[BUS_ID_SIZE];
        void                   (*gpio_irq)(struct bttv_sub_device *sub);
+       int                    (*any_irq)(struct bttv_sub_device *sub);
 };
 #define to_bttv_sub_drv(x) container_of((x), struct bttv_sub_driver, drv)
 
index 386f546f7d116b85578db858775c868c125f0d6e..3aa9c6e4fc33b678dd0997cd58d63a8d0dcd7a49 100644 (file)
@@ -208,6 +208,7 @@ extern struct bus_type bttv_sub_bus_type;
 int bttv_sub_add_device(struct bttv_core *core, char *name);
 int bttv_sub_del_devices(struct bttv_core *core);
 void bttv_gpio_irq(struct bttv_core *core);
+int bttv_any_irq(struct bttv_core *core);
 
 
 /* ---------------------------------------------------------- */
@@ -273,6 +274,7 @@ struct bttv {
        struct bttv_pll_info pll;
        int triton1;
        int gpioirq;
+       int any_irq;
        int use_i2c_hw;
 
        /* old gpio interface */
diff --git a/drivers/media/video/cx25840/Makefile b/drivers/media/video/cx25840/Makefile
new file mode 100644 (file)
index 0000000..543ebac
--- /dev/null
@@ -0,0 +1,6 @@
+cx25840-objs    := cx25840-core.o cx25840-audio.o cx25840-firmware.o \
+                  cx25840-vbi.o
+
+obj-$(CONFIG_VIDEO_DECODER) += cx25840.o
+
+EXTRA_CFLAGS += -I$(src)/..
diff --git a/drivers/media/video/cx25840/cx25840-audio.c b/drivers/media/video/cx25840/cx25840-audio.c
new file mode 100644 (file)
index 0000000..740908f
--- /dev/null
@@ -0,0 +1,368 @@
+/* cx25840 audio functions
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/audiochip.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+inline static int set_audclk_freq(struct i2c_client *client,
+                                enum v4l2_audio_clock_freq freq)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       /* assert soft reset */
+       cx25840_and_or(client, 0x810, ~0x1, 0x01);
+
+       /* common for all inputs and rates */
+       /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
+       cx25840_write(client, 0x127, 0x50);
+
+       switch (state->audio_input) {
+       case AUDIO_TUNER:
+               switch (freq) {
+               case V4L2_AUDCLK_32_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f040610);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0xee39bb01);
+
+                       /* src3/4/6_ctl = 0x0801f77f */
+                       cx25840_write4(client, 0x900, 0x7ff70108);
+                       cx25840_write4(client, 0x904, 0x7ff70108);
+                       cx25840_write4(client, 0x90c, 0x7ff70108);
+                       break;
+
+               case V4L2_AUDCLK_441_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f040910);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0xd66bec00);
+
+                       /* src3/4/6_ctl = 0x08016d59 */
+                       cx25840_write4(client, 0x900, 0x596d0108);
+                       cx25840_write4(client, 0x904, 0x596d0108);
+                       cx25840_write4(client, 0x90c, 0x596d0108);
+                       break;
+
+               case V4L2_AUDCLK_48_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f040a10);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0xe5d69800);
+
+                       /* src3/4/6_ctl = 0x08014faa */
+                       cx25840_write4(client, 0x900, 0xaa4f0108);
+                       cx25840_write4(client, 0x904, 0xaa4f0108);
+                       cx25840_write4(client, 0x90c, 0xaa4f0108);
+                       break;
+               }
+               break;
+
+       case AUDIO_EXTERN_1:
+       case AUDIO_EXTERN_2:
+       case AUDIO_INTERN:
+       case AUDIO_RADIO:
+               switch (freq) {
+               case V4L2_AUDCLK_32_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f04081e);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0x69082a01);
+
+                       /* src1_ctl = 0x08010000 */
+                       cx25840_write4(client, 0x8f8, 0x00000108);
+
+                       /* src3/4/6_ctl = 0x08020000 */
+                       cx25840_write4(client, 0x900, 0x00000208);
+                       cx25840_write4(client, 0x904, 0x00000208);
+                       cx25840_write4(client, 0x90c, 0x00000208);
+
+                       /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */
+                       cx25840_write(client, 0x127, 0x54);
+                       break;
+
+               case V4L2_AUDCLK_441_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f040918);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0xd66bec00);
+
+                       /* src1_ctl = 0x08010000 */
+                       cx25840_write4(client, 0x8f8, 0xcd600108);
+
+                       /* src3/4/6_ctl = 0x08020000 */
+                       cx25840_write4(client, 0x900, 0x85730108);
+                       cx25840_write4(client, 0x904, 0x85730108);
+                       cx25840_write4(client, 0x90c, 0x85730108);
+                       break;
+
+               case V4L2_AUDCLK_48_KHZ:
+                       /* VID_PLL and AUX_PLL */
+                       cx25840_write4(client, 0x108, 0x0f040a18);
+
+                       /* AUX_PLL_FRAC */
+                       cx25840_write4(client, 0x110, 0xe5d69800);
+
+                       /* src1_ctl = 0x08010000 */
+                       cx25840_write4(client, 0x8f8, 0x00800108);
+
+                       /* src3/4/6_ctl = 0x08020000 */
+                       cx25840_write4(client, 0x900, 0x55550108);
+                       cx25840_write4(client, 0x904, 0x55550108);
+                       cx25840_write4(client, 0x90c, 0x55550108);
+                       break;
+               }
+               break;
+       }
+
+       /* deassert soft reset */
+       cx25840_and_or(client, 0x810, ~0x1, 0x00);
+
+       state->audclk_freq = freq;
+
+       return 0;
+}
+
+static int set_input(struct i2c_client *client, int audio_input)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       cx25840_dbg("set audio input (%d)\n", audio_input);
+
+       /* stop microcontroller */
+       cx25840_and_or(client, 0x803, ~0x10, 0);
+
+       /* Mute everything to prevent the PFFT! */
+       cx25840_write(client, 0x8d3, 0x1f);
+
+       switch (audio_input) {
+       case AUDIO_TUNER:
+               /* Set Path1 to Analog Demod Main Channel */
+               cx25840_write4(client, 0x8d0, 0x7038061f);
+
+               /* When the microcontroller detects the
+                * audio format, it will unmute the lines */
+               cx25840_and_or(client, 0x803, ~0x10, 0x10);
+               break;
+
+       case AUDIO_EXTERN_1:
+       case AUDIO_EXTERN_2:
+       case AUDIO_INTERN:
+       case AUDIO_RADIO:
+               /* Set Path1 to Serial Audio Input */
+               cx25840_write4(client, 0x8d0, 0x12100101);
+
+               /* The microcontroller should not be started for the
+                * non-tuner inputs: autodetection is specific for
+                * TV audio. */
+               break;
+
+       default:
+               cx25840_dbg("Invalid audio input selection %d\n", audio_input);
+               return -EINVAL;
+       }
+
+       state->audio_input = audio_input;
+
+       return set_audclk_freq(client, state->audclk_freq);
+}
+
+inline static int get_volume(struct i2c_client *client)
+{
+       /* Volume runs +18dB to -96dB in 1/2dB steps
+        * change to fit the msp3400 -114dB to +12dB range */
+
+       /* check PATH1_VOLUME */
+       int vol = 228 - cx25840_read(client, 0x8d4);
+       vol = (vol / 2) + 23;
+       return vol << 9;
+}
+
+inline static void set_volume(struct i2c_client *client, int volume)
+{
+       /* First convert the volume to msp3400 values (0-127) */
+       int vol = volume >> 9;
+       /* now scale it up to cx25840 values
+        * -114dB to -96dB maps to 0
+        * this should be 19, but in my testing that was 4dB too loud */
+       if (vol <= 23) {
+               vol = 0;
+       } else {
+               vol -= 23;
+       }
+
+       /* PATH1_VOLUME */
+       cx25840_write(client, 0x8d4, 228 - (vol * 2));
+}
+
+inline static int get_bass(struct i2c_client *client)
+{
+       /* bass is 49 steps +12dB to -12dB */
+
+       /* check PATH1_EQ_BASS_VOL */
+       int bass = cx25840_read(client, 0x8d9) & 0x3f;
+       bass = (((48 - bass) * 0xffff) + 47) / 48;
+       return bass;
+}
+
+inline static void set_bass(struct i2c_client *client, int bass)
+{
+       /* PATH1_EQ_BASS_VOL */
+       cx25840_and_or(client, 0x8d9, ~0x3f, 48 - (bass * 48 / 0xffff));
+}
+
+inline static int get_treble(struct i2c_client *client)
+{
+       /* treble is 49 steps +12dB to -12dB */
+
+       /* check PATH1_EQ_TREBLE_VOL */
+       int treble = cx25840_read(client, 0x8db) & 0x3f;
+       treble = (((48 - treble) * 0xffff) + 47) / 48;
+       return treble;
+}
+
+inline static void set_treble(struct i2c_client *client, int treble)
+{
+       /* PATH1_EQ_TREBLE_VOL */
+       cx25840_and_or(client, 0x8db, ~0x3f, 48 - (treble * 48 / 0xffff));
+}
+
+inline static int get_balance(struct i2c_client *client)
+{
+       /* balance is 7 bit, 0 to -96dB */
+
+       /* check PATH1_BAL_LEVEL */
+       int balance = cx25840_read(client, 0x8d5) & 0x7f;
+       /* check PATH1_BAL_LEFT */
+       if ((cx25840_read(client, 0x8d5) & 0x80) == 0)
+               balance = 0x80 - balance;
+       else
+               balance = 0x80 + balance;
+       return balance << 8;
+}
+
+inline static void set_balance(struct i2c_client *client, int balance)
+{
+       int bal = balance >> 8;
+       if (bal > 0x80) {
+               /* PATH1_BAL_LEFT */
+               cx25840_and_or(client, 0x8d5, 0x7f, 0x80);
+               /* PATH1_BAL_LEVEL */
+               cx25840_and_or(client, 0x8d5, ~0x7f, bal & 0x7f);
+       } else {
+               /* PATH1_BAL_LEFT */
+               cx25840_and_or(client, 0x8d5, 0x7f, 0x00);
+               /* PATH1_BAL_LEVEL */
+               cx25840_and_or(client, 0x8d5, ~0x7f, 0x80 - bal);
+       }
+}
+
+inline static int get_mute(struct i2c_client *client)
+{
+       /* check SRC1_MUTE_EN */
+       return cx25840_read(client, 0x8d3) & 0x2 ? 1 : 0;
+}
+
+inline static void set_mute(struct i2c_client *client, int mute)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       if (state->audio_input == AUDIO_TUNER) {
+               /* Must turn off microcontroller in order to mute sound.
+                * Not sure if this is the best method, but it does work.
+                * If the microcontroller is running, then it will undo any
+                * changes to the mute register. */
+               if (mute) {
+                       /* disable microcontroller */
+                       cx25840_and_or(client, 0x803, ~0x10, 0x00);
+                       cx25840_write(client, 0x8d3, 0x1f);
+               } else {
+                       /* enable microcontroller */
+                       cx25840_and_or(client, 0x803, ~0x10, 0x10);
+               }
+       } else {
+               /* SRC1_MUTE_EN */
+               cx25840_and_or(client, 0x8d3, ~0x2, mute ? 0x02 : 0x00);
+       }
+}
+
+int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+       struct v4l2_control *ctrl = arg;
+
+       switch (cmd) {
+       case AUDC_SET_INPUT:
+               return set_input(client, *(int *)arg);
+       case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+               return set_audclk_freq(client, *(enum v4l2_audio_clock_freq *)arg);
+       case VIDIOC_G_CTRL:
+               switch (ctrl->id) {
+               case V4L2_CID_AUDIO_VOLUME:
+                       ctrl->value = get_volume(client);
+                       break;
+               case V4L2_CID_AUDIO_BASS:
+                       ctrl->value = get_bass(client);
+                       break;
+               case V4L2_CID_AUDIO_TREBLE:
+                       ctrl->value = get_treble(client);
+                       break;
+               case V4L2_CID_AUDIO_BALANCE:
+                       ctrl->value = get_balance(client);
+                       break;
+               case V4L2_CID_AUDIO_MUTE:
+                       ctrl->value = get_mute(client);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case VIDIOC_S_CTRL:
+               switch (ctrl->id) {
+               case V4L2_CID_AUDIO_VOLUME:
+                       set_volume(client, ctrl->value);
+                       break;
+               case V4L2_CID_AUDIO_BASS:
+                       set_bass(client, ctrl->value);
+                       break;
+               case V4L2_CID_AUDIO_TREBLE:
+                       set_treble(client, ctrl->value);
+                       break;
+               case V4L2_CID_AUDIO_BALANCE:
+                       set_balance(client, ctrl->value);
+                       break;
+               case V4L2_CID_AUDIO_MUTE:
+                       set_mute(client, ctrl->value);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
new file mode 100644 (file)
index 0000000..f6afeec
--- /dev/null
@@ -0,0 +1,1020 @@
+/* cx25840 - Conexant CX25840 audio/video decoder driver
+ *
+ * Copyright (C) 2004 Ulf Eklund
+ *
+ * Based on the saa7115 driver and on the first verison of Chris Kennedy's
+ * cx25840 driver.
+ *
+ * Changes by Tyler Trafford <tatrafford@comcast.net>
+ *    - cleanup/rewrite for V4L2 API (2005)
+ *
+ * VBI support by Hans Verkuil <hverkuil@xs4all.nl>.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/audiochip.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver");
+MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford");
+MODULE_LICENSE("GPL");
+
+static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
+
+
+int cx25840_debug = 0;
+
+module_param(cx25840_debug, bool, 0644);
+
+MODULE_PARM_DESC(cx25840_debug, "Debugging messages [0=Off (default) 1=On]");
+
+I2C_CLIENT_INSMOD;
+
+/* ----------------------------------------------------------------------- */
+
+int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
+{
+       u8 buffer[3];
+       buffer[0] = addr >> 8;
+       buffer[1] = addr & 0xff;
+       buffer[2] = value;
+       return i2c_master_send(client, buffer, 3);
+}
+
+int cx25840_write4(struct i2c_client *client, u16 addr, u32 value)
+{
+       u8 buffer[6];
+       buffer[0] = addr >> 8;
+       buffer[1] = addr & 0xff;
+       buffer[2] = value >> 24;
+       buffer[3] = (value >> 16) & 0xff;
+       buffer[4] = (value >> 8) & 0xff;
+       buffer[5] = value & 0xff;
+       return i2c_master_send(client, buffer, 6);
+}
+
+u8 cx25840_read(struct i2c_client * client, u16 addr)
+{
+       u8 buffer[2];
+       buffer[0] = addr >> 8;
+       buffer[1] = addr & 0xff;
+
+       if (i2c_master_send(client, buffer, 2) < 2)
+               return 0;
+
+       if (i2c_master_recv(client, buffer, 1) < 1)
+               return 0;
+
+       return buffer[0];
+}
+
+u32 cx25840_read4(struct i2c_client * client, u16 addr)
+{
+       u8 buffer[4];
+       buffer[0] = addr >> 8;
+       buffer[1] = addr & 0xff;
+
+       if (i2c_master_send(client, buffer, 2) < 2)
+               return 0;
+
+       if (i2c_master_recv(client, buffer, 4) < 4)
+               return 0;
+
+       return (buffer[0] << 24) | (buffer[1] << 16) |
+           (buffer[2] << 8) | buffer[3];
+}
+
+int cx25840_and_or(struct i2c_client *client, u16 addr, u8 and_mask,
+                  u8 or_value)
+{
+       return cx25840_write(client, addr,
+                            (cx25840_read(client, addr) & and_mask) |
+                            or_value);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_input(struct i2c_client *, enum cx25840_input);
+static void input_change(struct i2c_client *);
+static void log_status(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+
+static inline void init_dll1(struct i2c_client *client)
+{
+       /* This is the Hauppauge sequence used to
+        * initialize the Delay Lock Loop 1 (ADC DLL). */
+       cx25840_write(client, 0x159, 0x23);
+       cx25840_write(client, 0x15a, 0x87);
+       cx25840_write(client, 0x15b, 0x06);
+       cx25840_write(client, 0x159, 0xe1);
+       cx25840_write(client, 0x15a, 0x86);
+       cx25840_write(client, 0x159, 0xe0);
+       cx25840_write(client, 0x159, 0xe1);
+       cx25840_write(client, 0x15b, 0x10);
+}
+
+static inline void init_dll2(struct i2c_client *client)
+{
+       /* This is the Hauppauge sequence used to
+        * initialize the Delay Lock Loop 2 (ADC DLL). */
+       cx25840_write(client, 0x15d, 0xe3);
+       cx25840_write(client, 0x15e, 0x86);
+       cx25840_write(client, 0x15f, 0x06);
+       cx25840_write(client, 0x15d, 0xe1);
+       cx25840_write(client, 0x15d, 0xe0);
+       cx25840_write(client, 0x15d, 0xe1);
+}
+
+static void cx25840_initialize(struct i2c_client *client, int loadfw)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       /* datasheet startup in numbered steps, refer to page 3-77 */
+       /* 2. */
+       cx25840_and_or(client, 0x803, ~0x10, 0x00);
+       /* The default of this register should be 4, but I get 0 instead.
+        * Set this register to 4 manually. */
+       cx25840_write(client, 0x000, 0x04);
+       /* 3. */
+       init_dll1(client);
+       init_dll2(client);
+       cx25840_write(client, 0x136, 0x0a);
+       /* 4. */
+       cx25840_write(client, 0x13c, 0x01);
+       cx25840_write(client, 0x13c, 0x00);
+       /* 5. */
+       if (loadfw)
+               cx25840_loadfw(client);
+       /* 6. */
+       cx25840_write(client, 0x115, 0x8c);
+       cx25840_write(client, 0x116, 0x07);
+       cx25840_write(client, 0x118, 0x02);
+       /* 7. */
+       cx25840_write(client, 0x4a5, 0x80);
+       cx25840_write(client, 0x4a5, 0x00);
+       cx25840_write(client, 0x402, 0x00);
+       /* 8. */
+       cx25840_write(client, 0x401, 0x18);
+       cx25840_write(client, 0x4a2, 0x10);
+       cx25840_write(client, 0x402, 0x04);
+       /* 10. */
+       cx25840_write(client, 0x8d3, 0x1f);
+       cx25840_write(client, 0x8e3, 0x03);
+
+       cx25840_vbi_setup(client);
+
+       /* trial and error says these are needed to get audio */
+       cx25840_write(client, 0x914, 0xa0);
+       cx25840_write(client, 0x918, 0xa0);
+       cx25840_write(client, 0x919, 0x01);
+
+       /* stereo prefered */
+       cx25840_write(client, 0x809, 0x04);
+       /* AC97 shift */
+       cx25840_write(client, 0x8cf, 0x0f);
+
+       /* (re)set video input */
+       set_input(client, state->input);
+       /* (re)set audio input */
+       cx25840_audio(client, AUDC_SET_INPUT, &state->audio_input);
+
+       /* start microcontroller */
+       cx25840_and_or(client, 0x803, ~0x10, 0x10);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void input_change(struct i2c_client *client)
+{
+       v4l2_std_id std = cx25840_get_v4lstd(client);
+
+       if (std & V4L2_STD_PAL) {
+               /* Follow tuner change procedure for PAL */
+               cx25840_write(client, 0x808, 0xff);
+               cx25840_write(client, 0x80b, 0x10);
+       } else if (std & V4L2_STD_SECAM) {
+               /* Select autodetect for SECAM */
+               cx25840_write(client, 0x808, 0xff);
+               cx25840_write(client, 0x80b, 0x10);
+       } else if (std & V4L2_STD_NTSC) {
+               /* NTSC */
+               cx25840_write(client, 0x808, 0xf6);
+               cx25840_write(client, 0x80b, 0x00);
+       }
+
+       if (cx25840_read(client, 0x803) & 0x10) {
+               /* restart audio decoder microcontroller */
+               cx25840_and_or(client, 0x803, ~0x10, 0x00);
+               cx25840_and_or(client, 0x803, ~0x10, 0x10);
+       }
+}
+
+static int set_input(struct i2c_client *client, enum cx25840_input input)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       cx25840_dbg("decoder set input (%d)\n", input);
+
+       switch (input) {
+       case CX25840_TUNER:
+               cx25840_dbg("now setting Tuner input\n");
+
+               if (state->cardtype == CARDTYPE_PVR150) {
+                       /* CH_SEL_ADC2=1 */
+                       cx25840_and_or(client, 0x102, ~0x2, 0x02);
+               }
+
+               /* Video Input Control */
+               if (state->cardtype == CARDTYPE_PG600) {
+                       cx25840_write(client, 0x103, 0x11);
+               } else {
+                       cx25840_write(client, 0x103, 0x46);
+               }
+
+               /* INPUT_MODE=0 */
+               cx25840_and_or(client, 0x401, ~0x6, 0x00);
+               break;
+
+       case CX25840_COMPOSITE0:
+       case CX25840_COMPOSITE1:
+               cx25840_dbg("now setting Composite input\n");
+
+               /* Video Input Control */
+               if (state->cardtype == CARDTYPE_PG600) {
+                       cx25840_write(client, 0x103, 0x00);
+               } else {
+                       cx25840_write(client, 0x103, 0x02);
+               }
+
+               /* INPUT_MODE=0 */
+               cx25840_and_or(client, 0x401, ~0x6, 0x00);
+               break;
+
+       case CX25840_SVIDEO0:
+       case CX25840_SVIDEO1:
+               cx25840_dbg("now setting S-Video input\n");
+
+               /* CH_SEL_ADC2=0 */
+               cx25840_and_or(client, 0x102, ~0x2, 0x00);
+
+               /* Video Input Control */
+               if (state->cardtype == CARDTYPE_PG600) {
+                       cx25840_write(client, 0x103, 0x02);
+               } else {
+                       cx25840_write(client, 0x103, 0x10);
+               }
+
+               /* INPUT_MODE=1 */
+               cx25840_and_or(client, 0x401, ~0x6, 0x02);
+               break;
+
+       default:
+               cx25840_err("%d is not a valid input!\n", input);
+               return -EINVAL;
+       }
+
+       state->input = input;
+       input_change(client);
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_v4lstd(struct i2c_client *client, v4l2_std_id std)
+{
+       u8 fmt;
+
+       switch (std) {
+       /* zero is autodetect */
+       case 0: fmt = 0x0; break;
+       /* default ntsc to ntsc-m */
+       case V4L2_STD_NTSC:
+       case V4L2_STD_NTSC_M: fmt = 0x1; break;
+       case V4L2_STD_NTSC_M_JP: fmt = 0x2; break;
+       case V4L2_STD_NTSC_443: fmt = 0x3; break;
+       case V4L2_STD_PAL: fmt = 0x4; break;
+       case V4L2_STD_PAL_M: fmt = 0x5; break;
+       case V4L2_STD_PAL_N: fmt = 0x6; break;
+       case V4L2_STD_PAL_Nc: fmt = 0x7; break;
+       case V4L2_STD_PAL_60: fmt = 0x8; break;
+       case V4L2_STD_SECAM: fmt = 0xc; break;
+       default:
+               return -ERANGE;
+       }
+
+       cx25840_and_or(client, 0x400, ~0xf, fmt);
+       cx25840_vbi_setup(client);
+       return 0;
+}
+
+v4l2_std_id cx25840_get_v4lstd(struct i2c_client * client)
+{
+       /* check VID_FMT_SEL first */
+       u8 fmt = cx25840_read(client, 0x400) & 0xf;
+
+       if (!fmt) {
+               /* check AFD_FMT_STAT if set to autodetect */
+               fmt = cx25840_read(client, 0x40d) & 0xf;
+       }
+
+       switch (fmt) {
+       case 0x1: return V4L2_STD_NTSC_M;
+       case 0x2: return V4L2_STD_NTSC_M_JP;
+       case 0x3: return V4L2_STD_NTSC_443;
+       case 0x4: return V4L2_STD_PAL;
+       case 0x5: return V4L2_STD_PAL_M;
+       case 0x6: return V4L2_STD_PAL_N;
+       case 0x7: return V4L2_STD_PAL_Nc;
+       case 0x8: return V4L2_STD_PAL_60;
+       case 0xc: return V4L2_STD_SECAM;
+       default: return V4L2_STD_UNKNOWN;
+       }
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       switch (ctrl->id) {
+       case CX25840_CID_CARDTYPE:
+               switch (ctrl->value) {
+               case CARDTYPE_PVR150:
+               case CARDTYPE_PG600:
+                       state->cardtype = ctrl->value;
+                       break;
+               default:
+                       return -ERANGE;
+               }
+
+               set_input(client, state->input);
+               break;
+
+       case V4L2_CID_BRIGHTNESS:
+               if (ctrl->value < 0 || ctrl->value > 255) {
+                       cx25840_err("invalid brightness setting %d\n",
+                                   ctrl->value);
+                       return -ERANGE;
+               }
+
+               cx25840_write(client, 0x414, ctrl->value - 128);
+               break;
+
+       case V4L2_CID_CONTRAST:
+               if (ctrl->value < 0 || ctrl->value > 127) {
+                       cx25840_err("invalid contrast setting %d\n",
+                                   ctrl->value);
+                       return -ERANGE;
+               }
+
+               cx25840_write(client, 0x415, ctrl->value << 1);
+               break;
+
+       case V4L2_CID_SATURATION:
+               if (ctrl->value < 0 || ctrl->value > 127) {
+                       cx25840_err("invalid saturation setting %d\n",
+                                   ctrl->value);
+                       return -ERANGE;
+               }
+
+               cx25840_write(client, 0x420, ctrl->value << 1);
+               cx25840_write(client, 0x421, ctrl->value << 1);
+               break;
+
+       case V4L2_CID_HUE:
+               if (ctrl->value < -127 || ctrl->value > 127) {
+                       cx25840_err("invalid hue setting %d\n", ctrl->value);
+                       return -ERANGE;
+               }
+
+               cx25840_write(client, 0x422, ctrl->value);
+               break;
+
+       case V4L2_CID_AUDIO_VOLUME:
+       case V4L2_CID_AUDIO_BASS:
+       case V4L2_CID_AUDIO_TREBLE:
+       case V4L2_CID_AUDIO_BALANCE:
+       case V4L2_CID_AUDIO_MUTE:
+               return cx25840_audio(client, VIDIOC_S_CTRL, ctrl);
+       }
+
+       return 0;
+}
+
+static int get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+
+       switch (ctrl->id) {
+       case CX25840_CID_CARDTYPE:
+               ctrl->value = state->cardtype;
+               break;
+       case V4L2_CID_BRIGHTNESS:
+               ctrl->value = cx25840_read(client, 0x414) + 128;
+               break;
+       case V4L2_CID_CONTRAST:
+               ctrl->value = cx25840_read(client, 0x415) >> 1;
+               break;
+       case V4L2_CID_SATURATION:
+               ctrl->value = cx25840_read(client, 0x420) >> 1;
+               break;
+       case V4L2_CID_HUE:
+               ctrl->value = cx25840_read(client, 0x422);
+               break;
+       case V4L2_CID_AUDIO_VOLUME:
+       case V4L2_CID_AUDIO_BASS:
+       case V4L2_CID_AUDIO_TREBLE:
+       case V4L2_CID_AUDIO_BALANCE:
+       case V4L2_CID_AUDIO_MUTE:
+               return cx25840_audio(client, VIDIOC_G_CTRL, ctrl);
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+       switch (fmt->type) {
+       case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+               return cx25840_vbi(client, VIDIOC_G_FMT, fmt);
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+       struct v4l2_pix_format *pix;
+       int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
+       int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_NTSC);
+
+       switch (fmt->type) {
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+               pix = &(fmt->fmt.pix);
+
+               Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
+               Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
+
+               Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
+               Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
+
+               Vlines = pix->height + (is_pal ? 4 : 7);
+
+               if ((pix->width * 16 < Hsrc) || (Hsrc < pix->width) ||
+                   (Vlines * 8 < Vsrc) || (Vsrc < Vlines)) {
+                       cx25840_err("%dx%d is not a valid size!\n",
+                                   pix->width, pix->height);
+                       return -ERANGE;
+               }
+
+               HSC = (Hsrc * (1 << 20)) / pix->width - (1 << 20);
+               VSC = (1 << 16) - (Vsrc * (1 << 9) / Vlines - (1 << 9));
+               VSC &= 0x1fff;
+
+               if (pix->width >= 385)
+                       filter = 0;
+               else if (pix->width > 192)
+                       filter = 1;
+               else if (pix->width > 96)
+                       filter = 2;
+               else
+                       filter = 3;
+
+               cx25840_dbg("decoder set size %dx%d -> scale  %ux%u\n",
+                           pix->width, pix->height, HSC, VSC);
+
+               /* HSCALE=HSC */
+               cx25840_write(client, 0x418, HSC & 0xff);
+               cx25840_write(client, 0x419, (HSC >> 8) & 0xff);
+               cx25840_write(client, 0x41a, HSC >> 16);
+               /* VSCALE=VSC */
+               cx25840_write(client, 0x41c, VSC & 0xff);
+               cx25840_write(client, 0x41d, VSC >> 8);
+               /* VS_INTRLACE=1 VFILT=filter */
+               cx25840_write(client, 0x41e, 0x8 | filter);
+               break;
+
+       case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+               return cx25840_vbi(client, VIDIOC_S_FMT, fmt);
+
+       case V4L2_BUF_TYPE_VBI_CAPTURE:
+               return cx25840_vbi(client, VIDIOC_S_FMT, fmt);
+
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int cx25840_command(struct i2c_client *client, unsigned int cmd,
+                          void *arg)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+       struct v4l2_tuner *vt = arg;
+       int result = 0;
+
+       switch (cmd) {
+       case 0:
+               break;
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       /* ioctls to allow direct access to the
+        * cx25840 registers for testing */
+       case VIDIOC_INT_G_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_CX25840)
+                       return -EINVAL;
+               reg->val = cx25840_read(client, reg->reg & 0x0fff);
+               break;
+       }
+
+       case VIDIOC_INT_S_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_CX25840)
+                       return -EINVAL;
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EPERM;
+               cx25840_write(client, reg->reg & 0x0fff, reg->val & 0xff);
+               break;
+       }
+#endif
+
+       case VIDIOC_INT_DECODE_VBI_LINE:
+               return cx25840_vbi(client, cmd, arg);
+
+       case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+       case AUDC_SET_INPUT:
+               result = cx25840_audio(client, cmd, arg);
+               break;
+
+       case VIDIOC_STREAMON:
+               cx25840_dbg("enable output\n");
+               cx25840_write(client, 0x115, 0x8c);
+               cx25840_write(client, 0x116, 0x07);
+               break;
+
+       case VIDIOC_STREAMOFF:
+               cx25840_dbg("disable output\n");
+               cx25840_write(client, 0x115, 0x00);
+               cx25840_write(client, 0x116, 0x00);
+               break;
+
+       case VIDIOC_LOG_STATUS:
+               log_status(client);
+               break;
+
+       case VIDIOC_G_CTRL:
+               result = get_v4lctrl(client, (struct v4l2_control *)arg);
+               break;
+
+       case VIDIOC_S_CTRL:
+               result = set_v4lctrl(client, (struct v4l2_control *)arg);
+               break;
+
+       case VIDIOC_G_STD:
+               *(v4l2_std_id *)arg = cx25840_get_v4lstd(client);
+               break;
+
+       case VIDIOC_S_STD:
+               result = set_v4lstd(client, *(v4l2_std_id *)arg);
+               break;
+
+       case VIDIOC_G_INPUT:
+               *(int *)arg = state->input;
+               break;
+
+       case VIDIOC_S_INPUT:
+               result = set_input(client, *(int *)arg);
+               break;
+
+       case VIDIOC_S_FREQUENCY:
+               input_change(client);
+               break;
+
+       case VIDIOC_G_TUNER:
+       {
+               u8 mode = cx25840_read(client, 0x804);
+               u8 pref = cx25840_read(client, 0x809) & 0xf;
+               u8 vpres = cx25840_read(client, 0x80a) & 0x10;
+               int val = 0;
+
+               vt->capability |=
+                   V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
+                   V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
+
+               vt->signal = vpres ? 0xffff : 0x0;
+
+               /* get rxsubchans and audmode */
+               if ((mode & 0xf) == 1)
+                       val |= V4L2_TUNER_SUB_STEREO;
+               else
+                       val |= V4L2_TUNER_SUB_MONO;
+
+               if (mode == 2 || mode == 4)
+                       val |= V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
+
+               if (mode & 0x10)
+                       val |= V4L2_TUNER_SUB_SAP;
+
+               vt->rxsubchans = val;
+
+               switch (pref) {
+               case 0:
+                       vt->audmode = V4L2_TUNER_MODE_MONO;
+                       break;
+               case 1:
+               case 2:
+                       vt->audmode = V4L2_TUNER_MODE_LANG2;
+                       break;
+               case 4:
+               default:
+                       vt->audmode = V4L2_TUNER_MODE_STEREO;
+               }
+               break;
+       }
+
+       case VIDIOC_S_TUNER:
+               switch (vt->audmode) {
+               case V4L2_TUNER_MODE_MONO:
+               case V4L2_TUNER_MODE_LANG1:
+                       /* Force PREF_MODE to MONO */
+                       cx25840_and_or(client, 0x809, ~0xf, 0x00);
+                       break;
+               case V4L2_TUNER_MODE_STEREO:
+                       /* Force PREF_MODE to STEREO */
+                       cx25840_and_or(client, 0x809, ~0xf, 0x04);
+                       break;
+               case V4L2_TUNER_MODE_LANG2:
+                       /* Force PREF_MODE to LANG2 */
+                       cx25840_and_or(client, 0x809, ~0xf, 0x01);
+                       break;
+               }
+               break;
+
+       case VIDIOC_G_FMT:
+               result = get_v4lfmt(client, (struct v4l2_format *)arg);
+               break;
+
+       case VIDIOC_S_FMT:
+               result = set_v4lfmt(client, (struct v4l2_format *)arg);
+               break;
+
+       case VIDIOC_INT_RESET:
+               cx25840_initialize(client, 0);
+               break;
+
+       case VIDIOC_INT_G_CHIP_IDENT:
+               *(enum v4l2_chip_ident *)arg =
+                       V4L2_IDENT_CX25840 + ((cx25840_read(client, 0x100) >> 4) & 0xf);
+               break;
+
+       default:
+               cx25840_err("invalid ioctl %x\n", cmd);
+               return -EINVAL;
+       }
+
+       return result;
+}
+
+/* ----------------------------------------------------------------------- */
+
+struct i2c_driver i2c_driver_cx25840;
+
+static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
+                                int kind)
+{
+       struct i2c_client *client;
+       struct cx25840_state *state;
+       u16 device_id;
+
+       /* Check if the adapter supports the needed features
+        * Not until kernel version 2.6.11 did the bit-algo
+        * correctly report that it would do an I2C-level xfer */
+       if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
+               return 0;
+
+       client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+       if (client == 0)
+               return -ENOMEM;
+
+       memset(client, 0, sizeof(struct i2c_client));
+       client->addr = address;
+       client->adapter = adapter;
+       client->driver = &i2c_driver_cx25840;
+       client->flags = I2C_CLIENT_ALLOW_USE;
+       snprintf(client->name, sizeof(client->name) - 1, "cx25840");
+
+       cx25840_dbg("detecting cx25840 client on address 0x%x\n", address << 1);
+
+       device_id = cx25840_read(client, 0x101) << 8;
+       device_id |= cx25840_read(client, 0x100);
+
+       /* The high byte of the device ID should be
+        * 0x84 if chip is present */
+       if ((device_id & 0xff00) != 0x8400) {
+               cx25840_dbg("cx25840 not found\n");
+               kfree(client);
+               return 0;
+       }
+
+       cx25840_info("cx25%3x-2%x found @ 0x%x (%s)\n",
+                   (device_id & 0xfff0) >> 4,
+                   (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1 : 3,
+                   address << 1, adapter->name);
+
+       state = kmalloc(sizeof(struct cx25840_state), GFP_KERNEL);
+       if (state == NULL) {
+               kfree(client);
+               return -ENOMEM;
+       }
+
+       i2c_set_clientdata(client, state);
+       memset(state, 0, sizeof(struct cx25840_state));
+       state->input = CX25840_TUNER;
+       state->audclk_freq = V4L2_AUDCLK_48_KHZ;
+       state->audio_input = AUDIO_TUNER;
+       state->cardtype = CARDTYPE_PVR150;
+
+       cx25840_initialize(client, 1);
+
+       i2c_attach_client(client);
+
+       return 0;
+}
+
+static int cx25840_attach_adapter(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+       if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+       if (adapter->id == I2C_HW_B_BT848)
+#endif
+               return i2c_probe(adapter, &addr_data, &cx25840_detect_client);
+       return 0;
+}
+
+static int cx25840_detach_client(struct i2c_client *client)
+{
+       struct cx25840_state *state = i2c_get_clientdata(client);
+       int err;
+
+       err = i2c_detach_client(client);
+       if (err) {
+               return err;
+       }
+
+       kfree(state);
+       kfree(client);
+
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+struct i2c_driver i2c_driver_cx25840 = {
+       .name = "cx25840",
+
+       .id = I2C_DRIVERID_CX25840,
+       .flags = I2C_DF_NOTIFY,
+
+       .attach_adapter = cx25840_attach_adapter,
+       .detach_client = cx25840_detach_client,
+       .command = cx25840_command,
+       .owner = THIS_MODULE,
+};
+
+
+static int __init m__init(void)
+{
+       return i2c_add_driver(&i2c_driver_cx25840);
+}
+
+static void __exit m__exit(void)
+{
+       i2c_del_driver(&i2c_driver_cx25840);
+}
+
+module_init(m__init);
+module_exit(m__exit);
+
+/* ----------------------------------------------------------------------- */
+
+static void log_status(struct i2c_client *client)
+{
+       static const char *const fmt_strs[] = {
+               "0x0",
+               "NTSC-M", "NTSC-J", "NTSC-4.43",
+               "PAL-BDGHI", "PAL-M", "PAL-N", "PAL-Nc", "PAL-60",
+               "0x9", "0xA", "0xB",
+               "SECAM",
+               "0xD", "0xE", "0xF"
+       };
+
+       struct cx25840_state *state = i2c_get_clientdata(client);
+       u8 microctrl_vidfmt = cx25840_read(client, 0x80a);
+       u8 vidfmt_sel = cx25840_read(client, 0x400) & 0xf;
+       u8 gen_stat1 = cx25840_read(client, 0x40d);
+       u8 download_ctl = cx25840_read(client, 0x803);
+       u8 mod_det_stat0 = cx25840_read(client, 0x804);
+       u8 mod_det_stat1 = cx25840_read(client, 0x805);
+       u8 audio_config = cx25840_read(client, 0x808);
+       u8 pref_mode = cx25840_read(client, 0x809);
+       u8 afc0 = cx25840_read(client, 0x80b);
+       u8 mute_ctl = cx25840_read(client, 0x8d3);
+       char *p;
+
+       cx25840_info("Video signal:              %spresent\n",
+                   (microctrl_vidfmt & 0x10) ? "" : "not ");
+       cx25840_info("Detected format:           %s\n",
+                   fmt_strs[gen_stat1 & 0xf]);
+
+       switch (mod_det_stat0) {
+       case 0x00: p = "mono"; break;
+       case 0x01: p = "stereo"; break;
+       case 0x02: p = "dual"; break;
+       case 0x04: p = "tri"; break;
+       case 0x10: p = "mono with SAP"; break;
+       case 0x11: p = "stereo with SAP"; break;
+       case 0x12: p = "dual with SAP"; break;
+       case 0x14: p = "tri with SAP"; break;
+       case 0xfe: p = "forced mode"; break;
+       default: p = "not defined";
+       }
+       cx25840_info("Detected audio mode:       %s\n", p);
+
+       switch (mod_det_stat1) {
+       case 0x00: p = "not defined"; break;
+       case 0x01: p = "EIAJ"; break;
+       case 0x02: p = "A2-M"; break;
+       case 0x03: p = "A2-BG"; break;
+       case 0x04: p = "A2-DK1"; break;
+       case 0x05: p = "A2-DK2"; break;
+       case 0x06: p = "A2-DK3"; break;
+       case 0x07: p = "A1 (6.0 MHz FM Mono)"; break;
+       case 0x08: p = "AM-L"; break;
+       case 0x09: p = "NICAM-BG"; break;
+       case 0x0a: p = "NICAM-DK"; break;
+       case 0x0b: p = "NICAM-I"; break;
+       case 0x0c: p = "NICAM-L"; break;
+       case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break;
+       case 0x0e: p = "IF FM Radio"; break;
+       case 0x0f: p = "BTSC"; break;
+       case 0x10: p = "high-deviation FM"; break;
+       case 0x11: p = "very high-deviation FM"; break;
+       case 0xfd: p = "unknown audio standard"; break;
+       case 0xfe: p = "forced audio standard"; break;
+       case 0xff: p = "no detected audio standard"; break;
+       default: p = "not defined";
+       }
+       cx25840_info("Detected audio standard:   %s\n", p);
+       cx25840_info("Audio muted:               %s\n",
+                   (mute_ctl & 0x2) ? "yes" : "no");
+       cx25840_info("Audio microcontroller:     %s\n",
+                   (download_ctl & 0x10) ? "running" : "stopped");
+
+       switch (audio_config >> 4) {
+       case 0x00: p = "undefined"; break;
+       case 0x01: p = "BTSC"; break;
+       case 0x02: p = "EIAJ"; break;
+       case 0x03: p = "A2-M"; break;
+       case 0x04: p = "A2-BG"; break;
+       case 0x05: p = "A2-DK1"; break;
+       case 0x06: p = "A2-DK2"; break;
+       case 0x07: p = "A2-DK3"; break;
+       case 0x08: p = "A1 (6.0 MHz FM Mono)"; break;
+       case 0x09: p = "AM-L"; break;
+       case 0x0a: p = "NICAM-BG"; break;
+       case 0x0b: p = "NICAM-DK"; break;
+       case 0x0c: p = "NICAM-I"; break;
+       case 0x0d: p = "NICAM-L"; break;
+       case 0x0e: p = "FM radio"; break;
+       case 0x0f: p = "automatic detection"; break;
+       default: p = "undefined";
+       }
+       cx25840_info("Configured audio standard: %s\n", p);
+
+       if ((audio_config >> 4) < 0xF) {
+               switch (audio_config & 0xF) {
+               case 0x00: p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)"; break;
+               case 0x01: p = "MONO2 (LANGUAGE B)"; break;
+               case 0x02: p = "MONO3 (STEREO forced MONO)"; break;
+               case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break;
+               case 0x04: p = "STEREO"; break;
+               case 0x05: p = "DUAL1 (AB)"; break;
+               case 0x06: p = "DUAL2 (AC) (FM)"; break;
+               case 0x07: p = "DUAL3 (BC) (FM)"; break;
+               case 0x08: p = "DUAL4 (AC) (AM)"; break;
+               case 0x09: p = "DUAL5 (BC) (AM)"; break;
+               case 0x0a: p = "SAP"; break;
+               default: p = "undefined";
+               }
+               cx25840_info("Configured audio mode:     %s\n", p);
+       } else {
+               switch (audio_config & 0xF) {
+               case 0x00: p = "BG"; break;
+               case 0x01: p = "DK1"; break;
+               case 0x02: p = "DK2"; break;
+               case 0x03: p = "DK3"; break;
+               case 0x04: p = "I"; break;
+               case 0x05: p = "L"; break;
+               case 0x06: p = "BTSC"; break;
+               case 0x07: p = "EIAJ"; break;
+               case 0x08: p = "A2-M"; break;
+               case 0x09: p = "FM Radio"; break;
+               case 0x0f: p = "automatic standard and mode detection"; break;
+               default: p = "undefined";
+               }
+               cx25840_info("Configured audio system:   %s\n", p);
+       }
+
+       cx25840_info("Specified standard:        %s\n",
+                   vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection");
+
+       switch (state->input) {
+       case CX25840_COMPOSITE0: p = "Composite 0"; break;
+       case CX25840_COMPOSITE1: p = "Composite 1"; break;
+       case CX25840_SVIDEO0: p = "S-Video 0"; break;
+       case CX25840_SVIDEO1: p = "S-Video 1"; break;
+       case CX25840_TUNER: p = "Tuner"; break;
+       }
+       cx25840_info("Specified input:           %s\n", p);
+       cx25840_info("Specified audio input:     %s\n",
+                   state->audio_input == 0 ? "Tuner" : "External");
+
+       switch (state->audclk_freq) {
+       case V4L2_AUDCLK_441_KHZ: p = "44.1 kHz"; break;
+       case V4L2_AUDCLK_48_KHZ: p = "48 kHz"; break;
+       case V4L2_AUDCLK_32_KHZ: p = "32 kHz"; break;
+       default: p = "undefined";
+       }
+       cx25840_info("Specified audioclock freq: %s\n", p);
+
+       switch (pref_mode & 0xf) {
+       case 0: p = "mono/language A"; break;
+       case 1: p = "language B"; break;
+       case 2: p = "language C"; break;
+       case 3: p = "analog fallback"; break;
+       case 4: p = "stereo"; break;
+       case 5: p = "language AC"; break;
+       case 6: p = "language BC"; break;
+       case 7: p = "language AB"; break;
+       default: p = "undefined";
+       }
+       cx25840_info("Preferred audio mode:      %s\n", p);
+
+       if ((audio_config & 0xf) == 0xf) {
+               switch ((afc0 >> 3) & 0x3) {
+               case 0: p = "system DK"; break;
+               case 1: p = "system L"; break;
+               case 2: p = "autodetect"; break;
+               default: p = "undefined";
+               }
+               cx25840_info("Selected 65 MHz format:    %s\n", p);
+
+               switch (afc0 & 0x7) {
+               case 0: p = "chroma"; break;
+               case 1: p = "BTSC"; break;
+               case 2: p = "EIAJ"; break;
+               case 3: p = "A2-M"; break;
+               case 4: p = "autodetect"; break;
+               default: p = "undefined";
+               }
+               cx25840_info("Selected 45 MHz format:    %s\n", p);
+       }
+}
diff --git a/drivers/media/video/cx25840/cx25840-firmware.c b/drivers/media/video/cx25840/cx25840-firmware.c
new file mode 100644 (file)
index 0000000..df9d50a
--- /dev/null
@@ -0,0 +1,167 @@
+/* cx25840 firmware functions
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+#include <linux/firmware.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+#define FWFILE "v4l-cx25840.fw"
+#define FWSEND 1024
+
+#define FWDEV(x) &((x)->adapter->dev)
+
+static int fastfw = 1;
+static char *firmware = FWFILE;
+
+module_param(fastfw, bool, 0444);
+module_param(firmware, charp, 0444);
+
+MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]");
+MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]");
+
+static inline void set_i2c_delay(struct i2c_client *client, int delay)
+{
+       struct i2c_algo_bit_data *algod = client->adapter->algo_data;
+
+       /* We aren't guaranteed to be using algo_bit,
+        * so avoid the null pointer dereference
+        * and disable the 'fast firmware load' */
+       if (algod) {
+               algod->udelay = delay;
+       } else {
+               fastfw = 0;
+       }
+}
+
+static inline void start_fw_load(struct i2c_client *client)
+{
+       /* DL_ADDR_LB=0 DL_ADDR_HB=0 */
+       cx25840_write(client, 0x800, 0x00);
+       cx25840_write(client, 0x801, 0x00);
+       // DL_MAP=3 DL_AUTO_INC=0 DL_ENABLE=1
+       cx25840_write(client, 0x803, 0x0b);
+       /* AUTO_INC_DIS=1 */
+       cx25840_write(client, 0x000, 0x20);
+
+       if (fastfw)
+               set_i2c_delay(client, 3);
+}
+
+static inline void end_fw_load(struct i2c_client *client)
+{
+       if (fastfw)
+               set_i2c_delay(client, 10);
+
+       /* AUTO_INC_DIS=0 */
+       cx25840_write(client, 0x000, 0x00);
+       /* DL_ENABLE=0 */
+       cx25840_write(client, 0x803, 0x03);
+}
+
+static inline int check_fw_load(struct i2c_client *client, int size)
+{
+       /* DL_ADDR_HB DL_ADDR_LB */
+       int s = cx25840_read(client, 0x801) << 8;
+       s |= cx25840_read(client, 0x800);
+
+       if (size != s) {
+               cx25840_err("firmware %s load failed\n", firmware);
+               return -EINVAL;
+       }
+
+       cx25840_info("loaded %s firmware (%d bytes)\n", firmware, size);
+       return 0;
+}
+
+static inline int fw_write(struct i2c_client *client, u8 * data, int size)
+{
+       if (i2c_master_send(client, data, size) < size) {
+
+               if (fastfw) {
+                       cx25840_err("333MHz i2c firmware load failed\n");
+                       fastfw = 0;
+                       set_i2c_delay(client, 10);
+
+                       if (i2c_master_send(client, data, size) < size) {
+                               cx25840_err
+                                   ("100MHz i2c firmware load failed\n");
+                               return -ENOSYS;
+                       }
+
+               } else {
+                       cx25840_err("firmware load i2c failure\n");
+                       return -ENOSYS;
+               }
+
+       }
+
+       return 0;
+}
+
+int cx25840_loadfw(struct i2c_client *client)
+{
+       const struct firmware *fw = NULL;
+       u8 buffer[4], *ptr;
+       int size, send, retval;
+
+       if (request_firmware(&fw, firmware, FWDEV(client)) != 0) {
+               cx25840_err("unable to open firmware %s\n", firmware);
+               return -EINVAL;
+       }
+
+       start_fw_load(client);
+
+       buffer[0] = 0x08;
+       buffer[1] = 0x02;
+       buffer[2] = fw->data[0];
+       buffer[3] = fw->data[1];
+       retval = fw_write(client, buffer, 4);
+
+       if (retval < 0) {
+               release_firmware(fw);
+               return retval;
+       }
+
+       size = fw->size - 2;
+       ptr = fw->data;
+       while (size > 0) {
+               ptr[0] = 0x08;
+               ptr[1] = 0x02;
+               send = size > (FWSEND - 2) ? FWSEND : size + 2;
+               retval = fw_write(client, ptr, send);
+
+               if (retval < 0) {
+                       release_firmware(fw);
+                       return retval;
+               }
+
+               size -= FWSEND - 2;
+               ptr += FWSEND - 2;
+       }
+
+       end_fw_load(client);
+
+       size = fw->size;
+       release_firmware(fw);
+
+       return check_fw_load(client, size);
+}
diff --git a/drivers/media/video/cx25840/cx25840-vbi.c b/drivers/media/video/cx25840/cx25840-vbi.c
new file mode 100644 (file)
index 0000000..13ba4e1
--- /dev/null
@@ -0,0 +1,315 @@
+/* cx25840 VBI functions
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <media/v4l2-common.h>
+
+#include "cx25840.h"
+
+static inline int odd_parity(u8 c)
+{
+       c ^= (c >> 4);
+       c ^= (c >> 2);
+       c ^= (c >> 1);
+
+       return c & 1;
+}
+
+static inline int decode_vps(u8 * dst, u8 * p)
+{
+       static const u8 biphase_tbl[] = {
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+               0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+               0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+               0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+               0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+               0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
+               0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
+               0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
+               0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
+               0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+               0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+               0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+               0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+               0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
+               0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
+               0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
+               0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
+               0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+               0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+               0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+               0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+               0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+       };
+
+       u8 c, err = 0;
+       int i;
+
+       for (i = 0; i < 2 * 13; i += 2) {
+               err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
+               c = (biphase_tbl[p[i + 1]] & 0xf) |
+                   ((biphase_tbl[p[i]] & 0xf) << 4);
+               dst[i / 2] = c;
+       }
+
+       return err & 0xf0;
+}
+
+void cx25840_vbi_setup(struct i2c_client *client)
+{
+       v4l2_std_id std = cx25840_get_v4lstd(client);
+
+       if (std & ~V4L2_STD_NTSC) {
+               /* datasheet startup, step 8d */
+               cx25840_write(client, 0x49f, 0x11);
+
+               cx25840_write(client, 0x470, 0x84);
+               cx25840_write(client, 0x471, 0x00);
+               cx25840_write(client, 0x472, 0x2d);
+               cx25840_write(client, 0x473, 0x5d);
+
+               cx25840_write(client, 0x474, 0x24);
+               cx25840_write(client, 0x475, 0x40);
+               cx25840_write(client, 0x476, 0x24);
+               cx25840_write(client, 0x477, 0x28);
+
+               cx25840_write(client, 0x478, 0x1f);
+               cx25840_write(client, 0x479, 0x02);
+
+               if (std & V4L2_STD_SECAM) {
+                       cx25840_write(client, 0x47a, 0x80);
+                       cx25840_write(client, 0x47b, 0x00);
+                       cx25840_write(client, 0x47c, 0x5f);
+                       cx25840_write(client, 0x47d, 0x42);
+               } else {
+                       cx25840_write(client, 0x47a, 0x90);
+                       cx25840_write(client, 0x47b, 0x20);
+                       cx25840_write(client, 0x47c, 0x63);
+                       cx25840_write(client, 0x47d, 0x82);
+               }
+
+               cx25840_write(client, 0x47e, 0x0a);
+               cx25840_write(client, 0x47f, 0x01);
+       } else {
+               /* datasheet startup, step 8d */
+               cx25840_write(client, 0x49f, 0x14);
+
+               cx25840_write(client, 0x470, 0x7a);
+               cx25840_write(client, 0x471, 0x00);
+               cx25840_write(client, 0x472, 0x2d);
+               cx25840_write(client, 0x473, 0x5b);
+
+               cx25840_write(client, 0x474, 0x1a);
+               cx25840_write(client, 0x475, 0x70);
+               cx25840_write(client, 0x476, 0x1e);
+               cx25840_write(client, 0x477, 0x1e);
+
+               cx25840_write(client, 0x478, 0x1f);
+               cx25840_write(client, 0x479, 0x02);
+               cx25840_write(client, 0x47a, 0x50);
+               cx25840_write(client, 0x47b, 0x66);
+
+               cx25840_write(client, 0x47c, 0x1f);
+               cx25840_write(client, 0x47d, 0x7c);
+               cx25840_write(client, 0x47e, 0x08);
+               cx25840_write(client, 0x47f, 0x00);
+       }
+}
+
+int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+       struct v4l2_format *fmt;
+       struct v4l2_sliced_vbi_format *svbi;
+
+       switch (cmd) {
+       case VIDIOC_G_FMT:
+       {
+               static u16 lcr2vbi[] = {
+                       0, V4L2_SLICED_TELETEXT_B, 0,   /* 1 */
+                       0, V4L2_SLICED_WSS_625, 0,      /* 4 */
+                       V4L2_SLICED_CAPTION_525,        /* 6 */
+                       0, 0, V4L2_SLICED_VPS, 0, 0,    /* 9 */
+                       0, 0, 0, 0
+               };
+               int i;
+
+               fmt = arg;
+               if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+                       return -EINVAL;
+               svbi = &fmt->fmt.sliced;
+               memset(svbi, 0, sizeof(*svbi));
+               /* we're done if raw VBI is active */
+               if ((cx25840_read(client, 0x404) & 0x10) == 0)
+                       break;
+
+               for (i = 7; i <= 23; i++) {
+                       u8 v = cx25840_read(client, 0x424 + i - 7);
+
+                       svbi->service_lines[0][i] = lcr2vbi[v >> 4];
+                       svbi->service_lines[1][i] = lcr2vbi[v & 0xf];
+                       svbi->service_set |=
+                                svbi->service_lines[0][i] | svbi->service_lines[1][i];
+               }
+               break;
+       }
+
+       case VIDIOC_S_FMT:
+       {
+               int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_NTSC);
+               int vbi_offset = is_pal ? 1 : 0;
+               int i, x;
+               u8 lcr[24];
+
+               fmt = arg;
+               if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+                       return -EINVAL;
+               svbi = &fmt->fmt.sliced;
+               if (svbi->service_set == 0) {
+                       /* raw VBI */
+                       memset(svbi, 0, sizeof(*svbi));
+
+                       /* Setup VBI */
+                       cx25840_vbi_setup(client);
+
+                       /* VBI Offset */
+                       cx25840_write(client, 0x47f, vbi_offset);
+                       cx25840_write(client, 0x404, 0x2e);
+                       break;
+               }
+
+               for (x = 0; x <= 23; x++)
+                       lcr[x] = 0x00;
+
+               /* Setup VBI */
+               cx25840_vbi_setup(client);
+
+               /* Sliced VBI */
+               cx25840_write(client, 0x404, 0x36);     /* Ancillery data */
+               cx25840_write(client, 0x406, 0x13);
+               cx25840_write(client, 0x47f, vbi_offset);
+
+               if (is_pal) {
+                       for (i = 0; i <= 6; i++)
+                               svbi->service_lines[0][i] =
+                                       svbi->service_lines[1][i] = 0;
+               } else {
+                       for (i = 0; i <= 9; i++)
+                               svbi->service_lines[0][i] =
+                                       svbi->service_lines[1][i] = 0;
+
+                       for (i = 22; i <= 23; i++)
+                               svbi->service_lines[0][i] =
+                                       svbi->service_lines[1][i] = 0;
+               }
+
+               for (i = 7; i <= 23; i++) {
+                       for (x = 0; x <= 1; x++) {
+                               switch (svbi->service_lines[1-x][i]) {
+                               case V4L2_SLICED_TELETEXT_B:
+                                       lcr[i] |= 1 << (4 * x);
+                                       break;
+                               case V4L2_SLICED_WSS_625:
+                                       lcr[i] |= 4 << (4 * x);
+                                       break;
+                               case V4L2_SLICED_CAPTION_525:
+                                       lcr[i] |= 6 << (4 * x);
+                                       break;
+                               case V4L2_SLICED_VPS:
+                                       lcr[i] |= 9 << (4 * x);
+                                       break;
+                               }
+                       }
+               }
+
+               for (x = 1, i = 0x424; i <= 0x434; i++, x++) {
+                       cx25840_write(client, i, lcr[6 + x]);
+               }
+
+               cx25840_write(client, 0x43c, 0x16);
+
+               if (is_pal) {
+                       cx25840_write(client, 0x474, 0x2a);
+               } else {
+                       cx25840_write(client, 0x474, 0x1a + 6);
+               }
+               break;
+       }
+
+       case VIDIOC_INT_DECODE_VBI_LINE:
+       {
+               struct v4l2_decode_vbi_line *vbi = arg;
+               u8 *p = vbi->p;
+               int id1, id2, l, err = 0;
+
+               if (p[0] || p[1] != 0xff || p[2] != 0xff ||
+                   (p[3] != 0x55 && p[3] != 0x91)) {
+                       vbi->line = vbi->type = 0;
+                       break;
+               }
+
+               p += 4;
+               id1 = p[-1];
+               id2 = p[0] & 0xf;
+               l = p[2] & 0x3f;
+               l += 5;
+               p += 4;
+
+               switch (id2) {
+               case 1:
+                       id2 = V4L2_SLICED_TELETEXT_B;
+                       break;
+               case 4:
+                       id2 = V4L2_SLICED_WSS_625;
+                       break;
+               case 6:
+                       id2 = V4L2_SLICED_CAPTION_525;
+                       err = !odd_parity(p[0]) || !odd_parity(p[1]);
+                       break;
+               case 9:
+                       id2 = V4L2_SLICED_VPS;
+                       if (decode_vps(p, p) != 0) {
+                               err = 1;
+                       }
+                       break;
+               default:
+                       id2 = 0;
+                       err = 1;
+                       break;
+               }
+
+               vbi->type = err ? 0 : id2;
+               vbi->line = err ? 0 : l;
+               vbi->is_second_field = err ? 0 : (id1 == 0x55);
+               vbi->p = p;
+               break;
+       }
+       }
+
+       return 0;
+}
diff --git a/drivers/media/video/cx25840/cx25840.h b/drivers/media/video/cx25840/cx25840.h
new file mode 100644 (file)
index 0000000..5c3f063
--- /dev/null
@@ -0,0 +1,85 @@
+/* cx25840 API header
+ *
+ * Copyright (C) 2003-2004 Chris Kennedy
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef _CX25840_H_
+#define _CX25840_H_
+
+
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+
+extern int cx25840_debug;
+
+#define cx25840_dbg(fmt, arg...) do { if (cx25840_debug) \
+       printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define cx25840_err(fmt, arg...) do { \
+       printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define cx25840_info(fmt, arg...) do { \
+       printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+#define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0)
+
+enum cx25840_cardtype {
+       CARDTYPE_PVR150,
+       CARDTYPE_PG600
+};
+
+enum cx25840_input {
+       CX25840_TUNER,
+       CX25840_COMPOSITE0,
+       CX25840_COMPOSITE1,
+       CX25840_SVIDEO0,
+       CX25840_SVIDEO1
+};
+
+struct cx25840_state {
+       enum cx25840_cardtype cardtype;
+       enum cx25840_input input;
+       int audio_input;
+       enum v4l2_audio_clock_freq audclk_freq;
+};
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-core.c                                                         */
+int cx25840_write(struct i2c_client *client, u16 addr, u8 value);
+int cx25840_write4(struct i2c_client *client, u16 addr, u32 value);
+u8 cx25840_read(struct i2c_client *client, u16 addr);
+u32 cx25840_read4(struct i2c_client *client, u16 addr);
+int cx25840_and_or(struct i2c_client *client, u16 addr, u8 mask, u8 value);
+v4l2_std_id cx25840_get_v4lstd(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-firmware.c                                                      */
+int cx25840_loadfw(struct i2c_client *client);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-audio.c                                                         */
+int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg);
+
+/* ----------------------------------------------------------------------- */
+/* cx25850-vbi.c                                                           */
+void cx25840_vbi_setup(struct i2c_client *client);
+int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg);
+
+#endif
index 9cce91ec334be22dea666fd84bf8903a78e1c97b..99ea955f5987c058a50dabacee8b2377c3fbc75a 100644 (file)
@@ -439,9 +439,6 @@ static int dvb_register(struct cx8802_dev *dev)
        /* Put the analog decoder in standby to keep it quiet */
        cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
 
-       /* Put the analog decoder in standby to keep it quiet */
-       cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
-
        /* register everything */
        return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev);
 }
index 32c49df58adc14c73c304c53adce2af78a8ca78d..9b94f77d6fd731f8926754562a8bbbd6e3e83d6a 100644 (file)
@@ -120,9 +120,6 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
        if (buf[1]==0xff)
                return 0;
 
-       /* avoid fast reapeating */
-       if (buf[1]==ir->old)
-               return 0;
        ir->old=buf[1];
 
        /* Rearranges bits to the right order */
index ed81934ef3cdde8b9fa9b5ab27bf613c73817f12..5abfc0fbf6de984b6473b990afd5a6ac9280fb66 100644 (file)
@@ -221,24 +221,99 @@ static IR_KEYTAB_TYPE ir_codes_conceptronic[IR_KEYTAB_SIZE] = {
        [ 24 ] = KEY_MUTE         // mute/unmute
 };
 
+static IR_KEYTAB_TYPE ir_codes_nebula[IR_KEYTAB_SIZE] = {
+       [0x00] = KEY_KP0,
+       [0x01] = KEY_KP1,
+       [0x02] = KEY_KP2,
+       [0x03] = KEY_KP3,
+       [0x04] = KEY_KP4,
+       [0x05] = KEY_KP5,
+       [0x06] = KEY_KP6,
+       [0x07] = KEY_KP7,
+       [0x08] = KEY_KP8,
+       [0x09] = KEY_KP9,
+       [0x0a] = KEY_TV,
+       [0x0b] = KEY_AUX,
+       [0x0c] = KEY_DVD,
+       [0x0d] = KEY_POWER,
+       [0x0e] = KEY_MHP,       /* labelled 'Picture' */
+       [0x0f] = KEY_AUDIO,
+       [0x10] = KEY_INFO,
+       [0x11] = KEY_F13,       /* 16:9 */
+       [0x12] = KEY_F14,       /* 14:9 */
+       [0x13] = KEY_EPG,
+       [0x14] = KEY_EXIT,
+       [0x15] = KEY_MENU,
+       [0x16] = KEY_UP,
+       [0x17] = KEY_DOWN,
+       [0x18] = KEY_LEFT,
+       [0x19] = KEY_RIGHT,
+       [0x1a] = KEY_ENTER,
+       [0x1b] = KEY_CHANNELUP,
+       [0x1c] = KEY_CHANNELDOWN,
+       [0x1d] = KEY_VOLUMEUP,
+       [0x1e] = KEY_VOLUMEDOWN,
+       [0x1f] = KEY_RED,
+       [0x20] = KEY_GREEN,
+       [0x21] = KEY_YELLOW,
+       [0x22] = KEY_BLUE,
+       [0x23] = KEY_SUBTITLE,
+       [0x24] = KEY_F15,       /* AD */
+       [0x25] = KEY_TEXT,
+       [0x26] = KEY_MUTE,
+       [0x27] = KEY_REWIND,
+       [0x28] = KEY_STOP,
+       [0x29] = KEY_PLAY,
+       [0x2a] = KEY_FASTFORWARD,
+       [0x2b] = KEY_F16,       /* chapter */
+       [0x2c] = KEY_PAUSE,
+       [0x2d] = KEY_PLAY,
+       [0x2e] = KEY_RECORD,
+       [0x2f] = KEY_F17,       /* picture in picture */
+       [0x30] = KEY_KPPLUS,    /* zoom in */
+       [0x31] = KEY_KPMINUS,   /* zoom out */
+       [0x32] = KEY_F18,       /* capture */
+       [0x33] = KEY_F19,       /* web */
+       [0x34] = KEY_EMAIL,
+       [0x35] = KEY_PHONE,
+       [0x36] = KEY_PC
+};
+
 struct IR {
        struct bttv_sub_device  *sub;
        struct input_dev        *input;
        struct ir_input_state   ir;
        char                    name[32];
        char                    phys[32];
+
+       /* Usual gpio signalling */
+
        u32                     mask_keycode;
        u32                     mask_keydown;
        u32                     mask_keyup;
-
-       int                     polling;
+       u32                     polling;
        u32                     last_gpio;
        struct work_struct      work;
        struct timer_list       timer;
+
+       /* RC5 gpio */
+
+       u32 rc5_gpio;
+       struct timer_list timer_end;    /* timer_end for code completion */
+       struct timer_list timer_keyup;  /* timer_end for key release */
+       u32 last_rc5;                   /* last good rc5 code */
+       u32 last_bit;                   /* last raw bit seen */
+       u32 code;                       /* raw code under construction */
+       struct timeval base_time;       /* time of last seen code */
+       int active;                     /* building raw code */
 };
 
 static int debug;
 module_param(debug, int, 0644);    /* debug level (0,1,2) */
+static int repeat_delay = 500;
+module_param(repeat_delay, int, 0644);
+static int repeat_period = 33;
+module_param(repeat_period, int, 0644);
 
 #define DEVNAME "ir-kbd-gpio"
 #define dprintk(fmt, arg...)   if (debug) \
@@ -254,7 +329,7 @@ static struct bttv_sub_driver driver = {
                .probe  = ir_probe,
                .remove = ir_remove,
        },
-       .gpio_irq       = ir_irq,
+       .gpio_irq       = ir_irq,
 };
 
 /* ---------------------------------------------------------------------- */
@@ -327,6 +402,173 @@ static void ir_work(void *data)
        mod_timer(&ir->timer, timeout);
 }
 
+/* ---------------------------------------------------------------*/
+
+static int rc5_remote_gap = 885;
+module_param(rc5_remote_gap, int, 0644);
+static int rc5_key_timeout = 200;
+module_param(rc5_key_timeout, int, 0644);
+
+#define RC5_START(x)   (((x)>>12)&3)
+#define RC5_TOGGLE(x)  (((x)>>11)&1)
+#define RC5_ADDR(x)    (((x)>>6)&31)
+#define RC5_INSTR(x)   ((x)&63)
+
+/* decode raw bit pattern to RC5 code */
+static u32 rc5_decode(unsigned int code)
+{
+       unsigned int org_code = code;
+       unsigned int pair;
+       unsigned int rc5 = 0;
+       int i;
+
+       code = (code << 1) | 1;
+       for (i = 0; i < 14; ++i) {
+               pair = code & 0x3;
+               code >>= 2;
+
+               rc5 <<= 1;
+               switch (pair) {
+               case 0:
+               case 2:
+                       break;
+               case 1:
+                       rc5 |= 1;
+                       break;
+               case 3:
+                       dprintk("bad code: %x\n", org_code);
+                       return 0;
+               }
+       }
+       dprintk("code=%x, rc5=%x, start=%x, toggle=%x, address=%x, "
+               "instr=%x\n", rc5, org_code, RC5_START(rc5),
+               RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));
+       return rc5;
+}
+
+static int ir_rc5_irq(struct bttv_sub_device *sub)
+{
+       struct IR *ir = dev_get_drvdata(&sub->dev);
+       struct timeval tv;
+       u32 gpio;
+       u32 gap;
+       unsigned long current_jiffies, timeout;
+
+       /* read gpio port */
+       gpio = bttv_gpio_read(ir->sub->core);
+
+       /* remote IRQ? */
+       if (!(gpio & 0x20))
+               return 0;
+
+       /* get time of bit */
+       current_jiffies = jiffies;
+       do_gettimeofday(&tv);
+
+       /* avoid overflow with gap >1s */
+       if (tv.tv_sec - ir->base_time.tv_sec > 1) {
+               gap = 200000;
+       } else {
+               gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
+                   tv.tv_usec - ir->base_time.tv_usec;
+       }
+
+       /* active code => add bit */
+       if (ir->active) {
+               /* only if in the code (otherwise spurious IRQ or timer
+                  late) */
+               if (ir->last_bit < 28) {
+                       ir->last_bit = (gap - rc5_remote_gap / 2) /
+                           rc5_remote_gap;
+                       ir->code |= 1 << ir->last_bit;
+               }
+               /* starting new code */
+       } else {
+               ir->active = 1;
+               ir->code = 0;
+               ir->base_time = tv;
+               ir->last_bit = 0;
+
+               timeout = current_jiffies + (500 + 30 * HZ) / 1000;
+               mod_timer(&ir->timer_end, timeout);
+       }
+
+       /* toggle GPIO pin 4 to reset the irq */
+       bttv_gpio_write(ir->sub->core, gpio & ~(1 << 4));
+       bttv_gpio_write(ir->sub->core, gpio | (1 << 4));
+       return 1;
+}
+
+static void ir_rc5_timer_end(unsigned long data)
+{
+       struct IR *ir = (struct IR *)data;
+       struct timeval tv;
+       unsigned long current_jiffies, timeout;
+       u32 gap;
+
+       /* get time */
+       current_jiffies = jiffies;
+       do_gettimeofday(&tv);
+
+       /* avoid overflow with gap >1s */
+       if (tv.tv_sec - ir->base_time.tv_sec > 1) {
+               gap = 200000;
+       } else {
+               gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
+                   tv.tv_usec - ir->base_time.tv_usec;
+       }
+
+       /* Allow some timmer jitter (RC5 is ~24ms anyway so this is ok) */
+       if (gap < 28000) {
+               dprintk("spurious timer_end\n");
+               return;
+       }
+
+       ir->active = 0;
+       if (ir->last_bit < 20) {
+               /* ignore spurious codes (caused by light/other remotes) */
+               dprintk("short code: %x\n", ir->code);
+       } else {
+               u32 rc5 = rc5_decode(ir->code);
+
+               /* two start bits? */
+               if (RC5_START(rc5) != 3) {
+                       dprintk("rc5 start bits invalid: %u\n", RC5_START(rc5));
+
+                       /* right address? */
+               } else if (RC5_ADDR(rc5) == 0x0) {
+                       u32 toggle = RC5_TOGGLE(rc5);
+                       u32 instr = RC5_INSTR(rc5);
+
+                       /* Good code, decide if repeat/repress */
+                       if (toggle != RC5_TOGGLE(ir->last_rc5) ||
+                           instr != RC5_INSTR(ir->last_rc5)) {
+                               dprintk("instruction %x, toggle %x\n", instr,
+                                       toggle);
+                               ir_input_nokey(ir->input, &ir->ir);
+                               ir_input_keydown(ir->input, &ir->ir, instr,
+                                                instr);
+                       }
+
+                       /* Set/reset key-up timer */
+                       timeout = current_jiffies + (500 + rc5_key_timeout
+                                                    * HZ) / 1000;
+                       mod_timer(&ir->timer_keyup, timeout);
+
+                       /* Save code for repeat test */
+                       ir->last_rc5 = rc5;
+               }
+       }
+}
+
+static void ir_rc5_timer_keyup(unsigned long data)
+{
+       struct IR *ir = (struct IR *)data;
+
+       dprintk("key released\n");
+       ir_input_nokey(ir->input, &ir->ir);
+}
+
 /* ---------------------------------------------------------------------- */
 
 static int ir_probe(struct device *dev)
@@ -400,6 +642,12 @@ static int ir_probe(struct device *dev)
                ir->mask_keyup   = 0x006000;
                ir->polling      = 50; // ms
                break;
+       case BTTV_BOARD_NEBULA_DIGITV:
+               ir_codes = ir_codes_nebula;
+               driver.any_irq = ir_rc5_irq;
+               driver.gpio_irq = NULL;
+               ir->rc5_gpio = 1;
+                break;
        }
        if (NULL == ir_codes) {
                kfree(ir);
@@ -407,9 +655,17 @@ static int ir_probe(struct device *dev)
                return -ENODEV;
        }
 
-       /* init hardware-specific stuff */
-       bttv_gpio_inout(sub->core, ir->mask_keycode | ir->mask_keydown, 0);
-       ir->sub = sub;
+       if (ir->rc5_gpio) {
+               u32 gpio;
+               /* enable remote irq */
+               bttv_gpio_inout(sub->core, (1 << 4), 1 << 4);
+               gpio = bttv_gpio_read(sub->core);
+               bttv_gpio_write(sub->core, gpio & ~(1 << 4));
+               bttv_gpio_write(sub->core, gpio | (1 << 4));
+       } else {
+               /* init hardware-specific stuff */
+               bttv_gpio_inout(sub->core, ir->mask_keycode | ir->mask_keydown, 0);
+       }
 
        /* init input device */
        snprintf(ir->name, sizeof(ir->name), "bttv IR (card=%d)",
@@ -417,6 +673,7 @@ static int ir_probe(struct device *dev)
        snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
                 pci_name(sub->core->pci));
 
+       ir->sub = sub;
        ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
        input_dev->name = ir->name;
        input_dev->phys = ir->phys;
@@ -437,11 +694,25 @@ static int ir_probe(struct device *dev)
                ir->timer.function = ir_timer;
                ir->timer.data     = (unsigned long)ir;
                schedule_work(&ir->work);
+       } else if (ir->rc5_gpio) {
+               /* set timer_end for code completion */
+               init_timer(&ir->timer_end);
+               ir->timer_end.function = ir_rc5_timer_end;
+               ir->timer_end.data = (unsigned long)ir;
+
+               init_timer(&ir->timer_keyup);
+               ir->timer_keyup.function = ir_rc5_timer_keyup;
+               ir->timer_keyup.data = (unsigned long)ir;
        }
 
        /* all done */
        dev_set_drvdata(dev, ir);
        input_register_device(ir->input);
+       printk(DEVNAME ": %s detected at %s\n",ir->name,ir->phys);
+
+       /* the remote isn't as bouncy as a keyboard */
+       ir->input->rep[REP_DELAY] = repeat_delay;
+       ir->input->rep[REP_PERIOD] = repeat_period;
 
        return 0;
 }
@@ -454,6 +725,15 @@ static int ir_remove(struct device *dev)
                del_timer(&ir->timer);
                flush_scheduled_work();
        }
+       if (ir->rc5_gpio) {
+               u32 gpio;
+
+               del_timer(&ir->timer_end);
+               flush_scheduled_work();
+
+               gpio = bttv_gpio_read(ir->sub->core);
+               bttv_gpio_write(ir->sub->core, gpio & ~(1 << 4));
+       }
 
        input_unregister_device(ir->input);
        kfree(ir);
index 0085567a1421d3fb5c06b145b0c302ec96a05895..801c736e9328a5c1368db10b7bd4318d4b738525 100644 (file)
@@ -183,6 +183,58 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
        return 1;
 }
 
+/* The new pinnacle PCTV remote (with the colored buttons)
+ *
+ * Ricardo Cerqueira <v4l@cerqueira.org>
+ */
+
+int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+       unsigned char b[4];
+       unsigned int start = 0,parity = 0,code = 0;
+
+       /* poll IR chip */
+       if (4 != i2c_master_recv(&ir->c,b,4)) {
+               dprintk(2,"read error\n");
+               return -EIO;
+       }
+
+       for (start = 0; start<4; start++) {
+               if (b[start] == 0x80) {
+                       code=b[(start+3)%4];
+                       parity=b[(start+2)%4];
+               }
+       }
+
+       /* Empty Request */
+       if (parity==0)
+               return 0;
+
+       /* Repeating... */
+       if (ir->old == parity)
+               return 0;
+
+
+       ir->old = parity;
+
+       /* Reduce code value to fit inside IR_KEYTAB_SIZE
+        *
+        * this is the only value that results in 42 unique
+        * codes < 128
+        */
+
+       code %= 0x88;
+
+       *ir_raw = code;
+       *ir_key = code;
+
+       dprintk(1,"Pinnacle PCTV key %02x\n", code);
+
+       return 1;
+}
+
+EXPORT_SYMBOL_GPL(get_key_pinnacle);
+
 /* ----------------------------------------------------------------------- */
 
 static void ir_key_poll(struct IR_i2c *ir)
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c
new file mode 100644 (file)
index 0000000..0235cef
--- /dev/null
@@ -0,0 +1,1376 @@
+/* saa7115 - Philips SAA7114/SAA7115 video decoder driver
+ *
+ * Based on saa7114 driver by Maxim Yevtyushkin, which is based on
+ * the saa7111 driver by Dave Perks.
+ *
+ * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
+ * Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
+ *
+ * Slight changes for video timing and attachment output by
+ * Wolfgang Scherr <scherr@net4you.net>
+ *
+ * Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
+ * by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
+ * (2/17/2003)
+ *
+ * VBI support (2004) and cleanups (2005) by Hans Verkuil <hverkuil@xs4all.nl>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-common.h>
+
+MODULE_DESCRIPTION("Philips SAA7114/SAA7115 video decoder driver");
+MODULE_AUTHOR("Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, Hans Verkuil");
+MODULE_LICENSE("GPL");
+
+static int debug = 0;
+module_param(debug, int, 0644);
+
+MODULE_PARM_DESC(debug, "Debug level (0-1)");
+
+#define saa7115_dbg(fmt,arg...) \
+       do { \
+               if (debug) \
+                       printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+                              i2c_adapter_id(client->adapter), client->addr , ## arg); \
+       } while (0)
+
+#define saa7115_err(fmt, arg...) do { \
+       printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+#define saa7115_info(fmt, arg...) do { \
+       printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+static unsigned short normal_i2c[] = { 0x42 >> 1, 0x40 >> 1, I2C_CLIENT_END };
+
+
+I2C_CLIENT_INSMOD;
+
+struct saa7115_state {
+       v4l2_std_id std;
+       int input;
+       int enable;
+       int bright;
+       int contrast;
+       int hue;
+       int sat;
+       enum v4l2_chip_ident ident;
+       enum v4l2_audio_clock_freq audclk_freq;
+};
+
+/* ----------------------------------------------------------------------- */
+
+static inline int saa7115_write(struct i2c_client *client, u8 reg, u8 value)
+{
+       return i2c_smbus_write_byte_data(client, reg, value);
+}
+
+static int saa7115_writeregs(struct i2c_client *client, const unsigned char *regs)
+{
+       unsigned char reg, data;
+
+       while (*regs != 0x00) {
+               reg = *(regs++);
+               data = *(regs++);
+               if (saa7115_write(client, reg, data) < 0)
+                       return -1;
+       }
+       return 0;
+}
+
+static inline int saa7115_read(struct i2c_client *client, u8 reg)
+{
+       return i2c_smbus_read_byte_data(client, reg);
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* If a value differs from the Hauppauge driver values, then the comment starts with
+   'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
+   Hauppauge driver sets. */
+
+static const unsigned char saa7115_init_auto_input[] = {
+       0x01, 0x48,             /* white peak control disabled */
+       0x03, 0x20,             /* was 0x30. 0x20: long vertical blanking */
+       0x04, 0x90,             /* analog gain set to 0 */
+       0x05, 0x90,             /* analog gain set to 0 */
+       0x06, 0xeb,             /* horiz sync begin = -21 */
+       0x07, 0xe0,             /* horiz sync stop = -17 */
+       0x0a, 0x80,             /* was 0x88. decoder brightness, 0x80 is itu standard */
+       0x0b, 0x44,             /* was 0x48. decoder contrast, 0x44 is itu standard */
+       0x0c, 0x40,             /* was 0x47. decoder saturation, 0x40 is itu standard */
+       0x0d, 0x00,             /* chrominance hue control */
+       0x0f, 0x00,             /* chrominance gain control: use automicatic mode */
+       0x10, 0x06,             /* chrominance/luminance control: active adaptive combfilter */
+       0x11, 0x00,             /* delay control */
+       0x12, 0x9d,             /* RTS0 output control: VGATE */
+       0x13, 0x80,             /* X-port output control: ITU656 standard mode, RTCO output enable RTCE */
+       0x14, 0x00,             /* analog/ADC/auto compatibility control */
+       0x18, 0x40,             /* raw data gain 0x00 = nominal */
+       0x19, 0x80,             /* raw data offset 0x80 = 0 LSB */
+       0x1a, 0x77,             /* color killer level control 0x77 = recommended */
+       0x1b, 0x42,             /* misc chroma control 0x42 = recommended */
+       0x1c, 0xa9,             /* combfilter control 0xA9 = recommended */
+       0x1d, 0x01,             /* combfilter control 0x01 = recommended */
+       0x88, 0xd0,             /* reset device */
+       0x88, 0xf0,             /* set device programmed, all in operational mode */
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_reset_scaler[] = {
+       0x87, 0x00,             /* disable I-port output */
+       0x88, 0xd0,             /* reset scaler */
+       0x88, 0xf0,             /* activate scaler */
+       0x87, 0x01,             /* enable I-port output */
+       0x00, 0x00
+};
+
+/* ============== SAA7715 VIDEO templates =============  */
+
+static const unsigned char saa7115_cfg_60hz_fullres_x[] = {
+       0xcc, 0xd0,             /* hsize low (output), hor. output window size = 0x2d0 = 720 */
+       0xcd, 0x02,             /* hsize hi (output) */
+
+       /* Why not in 60hz-Land, too? */
+       0xd0, 0x01,             /* downscale = 1 */
+       0xd8, 0x00,             /* hor lum scaling 0x0400 = 1 */
+       0xd9, 0x04,
+       0xdc, 0x00,             /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+       0xdd, 0x02,             /* H-scaling incr chroma */
+
+       0x00, 0x00
+};
+static const unsigned char saa7115_cfg_60hz_fullres_y[] = {
+       0xce, 0xf8,             /* vsize low (output), ver. output window size = 248 (but 60hz is 240?) */
+       0xcf, 0x00,             /* vsize hi (output) */
+
+       /* Why not in 60hz-Land, too? */
+       0xd5, 0x40,             /* Lum contrast, nominal value = 0x40 */
+       0xd6, 0x40,             /* Chroma satur. nominal value = 0x80 */
+
+       0xe0, 0x00,             /* V-scaling incr luma low */
+       0xe1, 0x04,             /* " hi */
+       0xe2, 0x00,             /* V-scaling incr chroma low */
+       0xe3, 0x04,             /* " hi */
+
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_60hz_video[] = {
+       0x80, 0x00,             /* reset tasks */
+       0x88, 0xd0,             /* reset scaler */
+
+       0x15, 0x03,             /* VGATE pulse start */
+       0x16, 0x11,             /* VGATE pulse stop */
+       0x17, 0x9c,             /* VGATE MSB and other values */
+
+       0x08, 0x68,             /* 0xBO: auto detection, 0x68 = NTSC */
+       0x0e, 0x07,             /* lots of different stuff... video autodetection is on */
+
+       0x5a, 0x06,             /* Vertical offset, standard 60hz value for ITU656 line counting */
+
+       /* Task A */
+       0x90, 0x80,             /* Task Handling Control */
+       0x91, 0x48,             /* X-port formats/config */
+       0x92, 0x40,             /* Input Ref. signal Def. */
+       0x93, 0x84,             /* I-port config */
+       0x94, 0x01,             /* hoffset low (input), 0x0002 is minimum */
+       0x95, 0x00,             /* hoffset hi (input) */
+       0x96, 0xd0,             /* hsize low (input), 0x02d0 = 720 */
+       0x97, 0x02,             /* hsize hi (input) */
+       0x98, 0x05,             /* voffset low (input) */
+       0x99, 0x00,             /* voffset hi (input) */
+       0x9a, 0x0c,             /* vsize low (input), 0x0c = 12 */
+       0x9b, 0x00,             /* vsize hi (input) */
+       0x9c, 0xa0,             /* hsize low (output), 0x05a0 = 1440 */
+       0x9d, 0x05,             /* hsize hi (output) */
+       0x9e, 0x0c,             /* vsize low (output), 0x0c = 12 */
+       0x9f, 0x00,             /* vsize hi (output) */
+
+       /* Task B */
+       0xc0, 0x00,             /* Task Handling Control */
+       0xc1, 0x08,             /* X-port formats/config */
+       0xc2, 0x00,             /* Input Ref. signal Def. */
+       0xc3, 0x80,             /* I-port config */
+       0xc4, 0x02,             /* hoffset low (input), 0x0002 is minimum */
+       0xc5, 0x00,             /* hoffset hi (input) */
+       0xc6, 0xd0,             /* hsize low (input), 0x02d0 = 720 */
+       0xc7, 0x02,             /* hsize hi (input) */
+       0xc8, 0x12,             /* voffset low (input), 0x12 = 18 */
+       0xc9, 0x00,             /* voffset hi (input) */
+       0xca, 0xf8,             /* vsize low (input), 0xf8 = 248 */
+       0xcb, 0x00,             /* vsize hi (input) */
+       0xcc, 0xd0,             /* hsize low (output), 0x02d0 = 720 */
+       0xcd, 0x02,             /* hsize hi (output) */
+
+       0xf0, 0xad,             /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
+       0xf1, 0x05,             /* low bit with 0xF0 */
+       0xf5, 0xad,             /* Set pulse generator register */
+       0xf6, 0x01,
+
+       0x87, 0x00,             /* Disable I-port output */
+       0x88, 0xd0,             /* reset scaler */
+       0x80, 0x20,             /* Activate only task "B", continuous mode (was 0xA0) */
+       0x88, 0xf0,             /* activate scaler */
+       0x87, 0x01,             /* Enable I-port output */
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_50hz_fullres_x[] = {
+       0xcc, 0xd0,             /* hsize low (output), 720 same as 60hz */
+       0xcd, 0x02,             /* hsize hi (output) */
+
+       0xd0, 0x01,             /* down scale = 1 */
+       0xd8, 0x00,             /* hor lum scaling 0x0400 = 1 */
+       0xd9, 0x04,
+       0xdc, 0x00,             /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+       0xdd, 0x02,             /* H-scaling incr chroma */
+
+       0x00, 0x00
+};
+static const unsigned char saa7115_cfg_50hz_fullres_y[] = {
+       0xce, 0x20,             /* vsize low (output), 0x0120 = 288 */
+       0xcf, 0x01,             /* vsize hi (output) */
+
+       0xd5, 0x40,             /* Lum contrast, nominal value = 0x40 */
+       0xd6, 0x40,             /* Chroma satur. nominal value = 0x80 */
+
+       0xe0, 0x00,             /* V-scaling incr luma low */
+       0xe1, 0x04,             /* " hi */
+       0xe2, 0x00,             /* V-scaling incr chroma low */
+       0xe3, 0x04,             /* " hi */
+
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_50hz_video[] = {
+       0x80, 0x00,             /* reset tasks */
+       0x88, 0xd0,             /* reset scaler */
+
+       0x15, 0x37,             /* VGATE start */
+       0x16, 0x16,             /* VGATE stop */
+       0x17, 0x99,             /* VGATE MSB and other values */
+
+       0x08, 0x28,             /* 0x28 = PAL */
+       0x0e, 0x07,             /* chrominance control 1 */
+
+       0x5a, 0x03,             /* Vertical offset, standard 50hz value */
+
+       /* Task A */
+       0x90, 0x81,             /* Task Handling Control */
+       0x91, 0x48,             /* X-port formats/config */
+       0x92, 0x40,             /* Input Ref. signal Def. */
+       0x93, 0x84,             /* I-port config */
+       /* This is weird: the datasheet says that you should use 2 as the minimum value, */
+       /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
+       0x94, 0x00,             /* hoffset low (input), 0x0002 is minimum */
+       0x95, 0x00,             /* hoffset hi (input) */
+       0x96, 0xd0,             /* hsize low (input), 0x02d0 = 720 */
+       0x97, 0x02,             /* hsize hi (input) */
+       0x98, 0x03,             /* voffset low (input) */
+       0x99, 0x00,             /* voffset hi (input) */
+       0x9a, 0x12,             /* vsize low (input), 0x12 = 18 */
+       0x9b, 0x00,             /* vsize hi (input) */
+       0x9c, 0xa0,             /* hsize low (output), 0x05a0 = 1440 */
+       0x9d, 0x05,             /* hsize hi (output) */
+       0x9e, 0x12,             /* vsize low (output), 0x12 = 18 */
+       0x9f, 0x00,             /* vsize hi (output) */
+
+       /* Task B */
+       0xc0, 0x00,             /* Task Handling Control */
+       0xc1, 0x08,             /* X-port formats/config */
+       0xc2, 0x00,             /* Input Ref. signal Def. */
+       0xc3, 0x80,             /* I-port config */
+       0xc4, 0x00,             /* hoffset low (input), 0x0002 is minimum. See comment at 0x94 above. */
+       0xc5, 0x00,             /* hoffset hi (input) */
+       0xc6, 0xd0,             /* hsize low (input), 0x02d0 = 720 */
+       0xc7, 0x02,             /* hsize hi (input) */
+       0xc8, 0x16,             /* voffset low (input), 0x16 = 22 */
+       0xc9, 0x00,             /* voffset hi (input) */
+       0xca, 0x20,             /* vsize low (input), 0x0120 = 288 */
+       0xcb, 0x01,             /* vsize hi (input) */
+       0xcc, 0xd0,             /* hsize low (output), 0x02d0 = 720 */
+       0xcd, 0x02,             /* hsize hi (output) */
+       0xce, 0x20,             /* vsize low (output), 0x0120 = 288 */
+       0xcf, 0x01,             /* vsize hi (output) */
+
+       0xf0, 0xb0,             /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
+       0xf1, 0x05,             /* low bit with 0xF0, (was 0x05) */
+       0xf5, 0xb0,             /* Set pulse generator register */
+       0xf6, 0x01,
+
+       0x87, 0x00,             /* Disable I-port output */
+       0x88, 0xd0,             /* reset scaler (was 0xD0) */
+       0x80, 0x20,             /* Activate only task "B" */
+       0x88, 0xf0,             /* activate scaler */
+       0x87, 0x01,             /* Enable I-port output */
+       0x00, 0x00
+};
+
+/* ============== SAA7715 VIDEO templates (end) =======  */
+
+static const unsigned char saa7115_cfg_vbi_on[] = {
+       0x80, 0x00,             /* reset tasks */
+       0x88, 0xd0,             /* reset scaler */
+       0x80, 0x30,             /* Activate both tasks */
+       0x88, 0xf0,             /* activate scaler */
+       0x87, 0x01,             /* Enable I-port output */
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_cfg_vbi_off[] = {
+       0x80, 0x00,             /* reset tasks */
+       0x88, 0xd0,             /* reset scaler */
+       0x80, 0x20,             /* Activate only task "B" */
+       0x88, 0xf0,             /* activate scaler */
+       0x87, 0x01,             /* Enable I-port output */
+       0x00, 0x00
+};
+
+static const unsigned char saa7115_init_misc[] = {
+       0x38, 0x03,             /* audio stuff */
+       0x39, 0x10,
+       0x3a, 0x08,
+
+       0x81, 0x01,             /* reg 0x15,0x16 define blanking window */
+       0x82, 0x00,
+       0x83, 0x01,             /* I port settings */
+       0x84, 0x20,
+       0x85, 0x21,
+       0x86, 0xc5,
+       0x87, 0x01,
+
+       /* Task A */
+       0xa0, 0x01,             /* down scale = 1 */
+       0xa1, 0x00,             /* prescale accumulation length = 1 */
+       0xa2, 0x00,             /* dc gain and fir prefilter control */
+       0xa4, 0x80,             /* Lum Brightness, nominal value = 0x80 */
+       0xa5, 0x40,             /* Lum contrast, nominal value = 0x40 */
+       0xa6, 0x40,             /* Chroma satur. nominal value = 0x80 */
+       0xa8, 0x00,             /* hor lum scaling 0x0200 = 2 zoom */
+       0xa9, 0x02,             /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
+       0xaa, 0x00,             /* H-phase offset Luma = 0 */
+       0xac, 0x00,             /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+       0xad, 0x01,             /* H-scaling incr chroma */
+       0xae, 0x00,             /* H-phase offset chroma. must be offset luma / 2 */
+
+       0xb0, 0x00,             /* V-scaling incr luma low */
+       0xb1, 0x04,             /* " hi */
+       0xb2, 0x00,             /* V-scaling incr chroma low */
+       0xb3, 0x04,             /* " hi */
+       0xb4, 0x01,             /* V-scaling mode control */
+       0xb8, 0x00,             /* V-phase offset chroma 00 */
+       0xb9, 0x00,             /* V-phase offset chroma 01 */
+       0xba, 0x00,             /* V-phase offset chroma 10 */
+       0xbb, 0x00,             /* V-phase offset chroma 11 */
+       0xbc, 0x00,             /* V-phase offset luma 00 */
+       0xbd, 0x00,             /* V-phase offset luma 01 */
+       0xbe, 0x00,             /* V-phase offset luma 10 */
+       0xbf, 0x00,             /* V-phase offset luma 11 */
+
+       /* Task B */
+       0xd0, 0x01,             /* down scale = 1 */
+       0xd1, 0x00,             /* prescale accumulation length = 1 */
+       0xd2, 0x00,             /* dc gain and fir prefilter control */
+       0xd4, 0x80,             /* Lum Brightness, nominal value = 0x80 */
+       0xd5, 0x40,             /* Lum contrast, nominal value = 0x40 */
+       0xd6, 0x40,             /* Chroma satur. nominal value = 0x80 */
+       0xd8, 0x00,             /* hor lum scaling 0x0400 = 1 */
+       0xd9, 0x04,
+       0xda, 0x00,             /* H-phase offset Luma = 0 */
+       0xdc, 0x00,             /* hor chrom scaling 0x0200. must be hor lum scaling / 2 */
+       0xdd, 0x02,             /* H-scaling incr chroma */
+       0xde, 0x00,             /* H-phase offset chroma. must be offset luma / 2 */
+
+       0xe0, 0x00,             /* V-scaling incr luma low */
+       0xe1, 0x04,             /* " hi */
+       0xe2, 0x00,             /* V-scaling incr chroma low */
+       0xe3, 0x04,             /* " hi */
+       0xe4, 0x01,             /* V-scaling mode control */
+       0xe8, 0x00,             /* V-phase offset chroma 00 */
+       0xe9, 0x00,             /* V-phase offset chroma 01 */
+       0xea, 0x00,             /* V-phase offset chroma 10 */
+       0xeb, 0x00,             /* V-phase offset chroma 11 */
+       0xec, 0x00,             /* V-phase offset luma 00 */
+       0xed, 0x00,             /* V-phase offset luma 01 */
+       0xee, 0x00,             /* V-phase offset luma 10 */
+       0xef, 0x00,             /* V-phase offset luma 11 */
+
+       0xf2, 0x50,             /* crystal clock = 24.576 MHz, target = 27MHz */
+       0xf3, 0x46,
+       0xf4, 0x00,
+       0xf7, 0x4b,             /* not the recommended settings! */
+       0xf8, 0x00,
+       0xf9, 0x4b,
+       0xfa, 0x00,
+       0xfb, 0x4b,
+       0xff, 0x88,             /* PLL2 lock detection settings: 71 lines 50% phase error */
+
+       /* Turn off VBI */
+       0x40, 0x20,             /* No framing code errors allowed. */
+       0x41, 0xff,
+       0x42, 0xff,
+       0x43, 0xff,
+       0x44, 0xff,
+       0x45, 0xff,
+       0x46, 0xff,
+       0x47, 0xff,
+       0x48, 0xff,
+       0x49, 0xff,
+       0x4a, 0xff,
+       0x4b, 0xff,
+       0x4c, 0xff,
+       0x4d, 0xff,
+       0x4e, 0xff,
+       0x4f, 0xff,
+       0x50, 0xff,
+       0x51, 0xff,
+       0x52, 0xff,
+       0x53, 0xff,
+       0x54, 0xff,
+       0x55, 0xff,
+       0x56, 0xff,
+       0x57, 0xff,
+       0x58, 0x40,
+       0x59, 0x47,
+       0x5b, 0x83,
+       0x5d, 0xbd,
+       0x5e, 0x35,
+
+       0x02, 0x84,             /* input tuner -> input 4, amplifier active */
+       0x09, 0x53,             /* 0x53, was 0x56 for 60hz. luminance control */
+
+       0x80, 0x20,             /* enable task B */
+       0x88, 0xd0,
+       0x88, 0xf0,
+       0x00, 0x00
+};
+
+/* ============== SAA7715 AUDIO settings ============= */
+
+/* 48.0 kHz */
+static const unsigned char saa7115_cfg_48_audio[] = {
+       0x34, 0xce,
+       0x35, 0xfb,
+       0x36, 0x30,
+       0x00, 0x00
+};
+
+/* 44.1 kHz */
+static const unsigned char saa7115_cfg_441_audio[] = {
+       0x34, 0xf2,
+       0x35, 0x00,
+       0x36, 0x2d,
+       0x00, 0x00
+};
+
+/* 32.0 kHz */
+static const unsigned char saa7115_cfg_32_audio[] = {
+       0x34, 0xdf,
+       0x35, 0xa7,
+       0x36, 0x20,
+       0x00, 0x00
+};
+
+/* 48.0 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_48_audio[] = {
+       0x30, 0xcd,
+       0x31, 0x20,
+       0x32, 0x03,
+       0x00, 0x00
+};
+
+/* 48.0 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_48_audio[] = {
+       0x30, 0x00,
+       0x31, 0xc0,
+       0x32, 0x03,
+       0x00, 0x00
+};
+
+/* 44.1 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_441_audio[] = {
+       0x30, 0xbc,
+       0x31, 0xdf,
+       0x32, 0x02,
+       0x00, 0x00
+};
+
+/* 44.1 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_441_audio[] = {
+       0x30, 0x00,
+       0x31, 0x72,
+       0x32, 0x03,
+       0x00, 0x00
+};
+
+/* 32.0 kHz 60hz */
+static const unsigned char saa7115_cfg_60hz_32_audio[] = {
+       0x30, 0xde,
+       0x31, 0x15,
+       0x32, 0x02,
+       0x00, 0x00
+};
+
+/* 32.0 kHz 50hz */
+static const unsigned char saa7115_cfg_50hz_32_audio[] = {
+       0x30, 0x00,
+       0x31, 0x80,
+       0x32, 0x02,
+       0x00, 0x00
+};
+
+static int saa7115_odd_parity(u8 c)
+{
+       c ^= (c >> 4);
+       c ^= (c >> 2);
+       c ^= (c >> 1);
+
+       return c & 1;
+}
+
+static int saa7115_decode_vps(u8 * dst, u8 * p)
+{
+       static const u8 biphase_tbl[] = {
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+               0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+               0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+               0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+               0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+               0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
+               0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
+               0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
+               0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
+               0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
+               0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
+               0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+               0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+               0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
+               0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
+               0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
+               0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
+               0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
+               0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+               0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
+               0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
+               0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
+               0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
+               0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
+               0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
+       };
+       int i;
+       u8 c, err = 0;
+
+       for (i = 0; i < 2 * 13; i += 2) {
+               err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
+               c = (biphase_tbl[p[i + 1]] & 0xf) | ((biphase_tbl[p[i]] & 0xf) << 4);
+               dst[i / 2] = c;
+       }
+       return err & 0xf0;
+}
+
+static int saa7115_decode_wss(u8 * p)
+{
+       static const int wss_bits[8] = {
+               0, 0, 0, 1, 0, 1, 1, 1
+       };
+       unsigned char parity;
+       int wss = 0;
+       int i;
+
+       for (i = 0; i < 16; i++) {
+               int b1 = wss_bits[p[i] & 7];
+               int b2 = wss_bits[(p[i] >> 3) & 7];
+
+               if (b1 == b2)
+                       return -1;
+               wss |= b2 << i;
+       }
+       parity = wss & 15;
+       parity ^= parity >> 2;
+       parity ^= parity >> 1;
+
+       if (!(parity & 1))
+               return -1;
+
+       return wss;
+}
+
+
+static int saa7115_set_audio_clock_freq(struct i2c_client *client, enum v4l2_audio_clock_freq freq)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+
+       saa7115_dbg("set audio clock freq: %d\n", freq);
+       switch (freq) {
+               case V4L2_AUDCLK_32_KHZ:
+                       saa7115_writeregs(client, saa7115_cfg_32_audio);
+                       if (state->std & V4L2_STD_525_60) {
+                               saa7115_writeregs(client, saa7115_cfg_60hz_32_audio);
+                       } else {
+                               saa7115_writeregs(client, saa7115_cfg_50hz_32_audio);
+                       }
+                       break;
+               case V4L2_AUDCLK_441_KHZ:
+                       saa7115_writeregs(client, saa7115_cfg_441_audio);
+                       if (state->std & V4L2_STD_525_60) {
+                               saa7115_writeregs(client, saa7115_cfg_60hz_441_audio);
+                       } else {
+                               saa7115_writeregs(client, saa7115_cfg_50hz_441_audio);
+                       }
+                       break;
+               case V4L2_AUDCLK_48_KHZ:
+                       saa7115_writeregs(client, saa7115_cfg_48_audio);
+                       if (state->std & V4L2_STD_525_60) {
+                               saa7115_writeregs(client, saa7115_cfg_60hz_48_audio);
+                       } else {
+                               saa7115_writeregs(client, saa7115_cfg_50hz_48_audio);
+                       }
+                       break;
+               default:
+                       saa7115_dbg("invalid audio setting %d\n", freq);
+                       return -EINVAL;
+       }
+       state->audclk_freq = freq;
+       return 0;
+}
+
+static int saa7115_set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+
+       switch (ctrl->id) {
+       case V4L2_CID_BRIGHTNESS:
+               if (ctrl->value < 0 || ctrl->value > 255) {
+                       saa7115_err("invalid brightness setting %d\n", ctrl->value);
+                       return -ERANGE;
+               }
+
+               state->bright = ctrl->value;
+               saa7115_write(client, 0x0a, state->bright);
+               break;
+
+       case V4L2_CID_CONTRAST:
+               if (ctrl->value < 0 || ctrl->value > 127) {
+                       saa7115_err("invalid contrast setting %d\n", ctrl->value);
+                       return -ERANGE;
+               }
+
+               state->contrast = ctrl->value;
+               saa7115_write(client, 0x0b, state->contrast);
+               break;
+
+       case V4L2_CID_SATURATION:
+               if (ctrl->value < 0 || ctrl->value > 127) {
+                       saa7115_err("invalid saturation setting %d\n", ctrl->value);
+                       return -ERANGE;
+               }
+
+               state->sat = ctrl->value;
+               saa7115_write(client, 0x0c, state->sat);
+               break;
+
+       case V4L2_CID_HUE:
+               if (ctrl->value < -127 || ctrl->value > 127) {
+                       saa7115_err("invalid hue setting %d\n", ctrl->value);
+                       return -ERANGE;
+               }
+
+               state->hue = ctrl->value;
+               saa7115_write(client, 0x0d, state->hue);
+               break;
+       }
+
+       return 0;
+}
+
+static int saa7115_get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+
+       switch (ctrl->id) {
+       case V4L2_CID_BRIGHTNESS:
+               ctrl->value = state->bright;
+               break;
+       case V4L2_CID_CONTRAST:
+               ctrl->value = state->contrast;
+               break;
+       case V4L2_CID_SATURATION:
+               ctrl->value = state->sat;
+               break;
+       case V4L2_CID_HUE:
+               ctrl->value = state->hue;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static void saa7115_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       int taskb = saa7115_read(client, 0x80) & 0x10;
+
+       // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
+       if (std & V4L2_STD_525_60) {
+               saa7115_dbg("decoder set standard 60 Hz\n");
+               saa7115_writeregs(client, saa7115_cfg_60hz_video);
+       } else {
+               saa7115_dbg("decoder set standard 50 Hz\n");
+               saa7115_writeregs(client, saa7115_cfg_50hz_video);
+       }
+
+       state->std = std;
+
+       /* restart task B if needed */
+       if (taskb && state->ident == V4L2_IDENT_SAA7114) {
+               saa7115_writeregs(client, saa7115_cfg_vbi_on);
+       }
+
+       /* switch audio mode too! */
+       saa7115_set_audio_clock_freq(client, state->audclk_freq);
+}
+
+static v4l2_std_id saa7115_get_v4lstd(struct i2c_client *client)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+
+       return state->std;
+}
+
+static void saa7115_log_status(struct i2c_client *client)
+{
+       static const char * const audclk_freq_strs[] = {
+               "44.1 kHz",
+               "48 kHz",
+               "32 kHz"
+       };
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       int reg1e, reg1f;
+       int signalOk;
+       int vcr;
+
+       saa7115_info("Audio frequency: %s\n", audclk_freq_strs[state->audclk_freq]);
+       if (client->name[6] == '4') {
+               /* status for the saa7114 */
+               reg1f = saa7115_read(client, 0x1f);
+               signalOk = (reg1f & 0xc1) == 0x81;
+               saa7115_info("Video signal:    %s\n", signalOk ? "ok" : "bad");
+               saa7115_info("Frequency:       %s\n", (reg1f & 0x20) ? "60Hz" : "50Hz");
+               return;
+       }
+
+       /* status for the saa7115 */
+       reg1e = saa7115_read(client, 0x1e);
+       reg1f = saa7115_read(client, 0x1f);
+
+       signalOk = (reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80;
+       vcr = !(reg1f & 0x10);
+
+       saa7115_info("Video signal:    %s\n", signalOk ? (vcr ? "VCR" : "broadcast/DVD") : "bad");
+       saa7115_info("Frequency:       %s\n", (reg1f & 0x20) ? "60Hz" : "50Hz");
+
+       switch (reg1e & 0x03) {
+               case 1:
+                       saa7115_info("Detected format: NTSC\n");
+                       break;
+               case 2:
+                       saa7115_info("Detected format: PAL\n");
+                       break;
+               case 3:
+                       saa7115_info("Detected format: SECAM\n");
+                       break;
+               default:
+                       saa7115_info("Detected format: BW/No color\n");
+                       break;
+       }
+}
+
+/* setup the sliced VBI lcr registers according to the sliced VBI format */
+static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_format *fmt)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       int is_50hz = (state->std & V4L2_STD_625_50);
+       u8 lcr[24];
+       int i, x;
+
+       /* saa7114 doesn't yet support VBI */
+       if (state->ident == V4L2_IDENT_SAA7114)
+               return;
+
+       for (i = 0; i <= 23; i++)
+               lcr[i] = 0xff;
+
+       if (fmt->service_set == 0) {
+               /* raw VBI */
+               if (is_50hz)
+                       for (i = 6; i <= 23; i++)
+                               lcr[i] = 0xdd;
+               else
+                       for (i = 10; i <= 21; i++)
+                               lcr[i] = 0xdd;
+       } else {
+               /* sliced VBI */
+               /* first clear lines that cannot be captured */
+               if (is_50hz) {
+                       for (i = 0; i <= 5; i++)
+                               fmt->service_lines[0][i] =
+                                       fmt->service_lines[1][i] = 0;
+               }
+               else {
+                       for (i = 0; i <= 9; i++)
+                               fmt->service_lines[0][i] =
+                                       fmt->service_lines[1][i] = 0;
+                       for (i = 22; i <= 23; i++)
+                               fmt->service_lines[0][i] =
+                                       fmt->service_lines[1][i] = 0;
+               }
+
+               /* Now set the lcr values according to the specified service */
+               for (i = 6; i <= 23; i++) {
+                       lcr[i] = 0;
+                       for (x = 0; x <= 1; x++) {
+                               switch (fmt->service_lines[1-x][i]) {
+                                       case 0:
+                                               lcr[i] |= 0xf << (4 * x);
+                                               break;
+                                       case V4L2_SLICED_TELETEXT_B:
+                                               lcr[i] |= 1 << (4 * x);
+                                               break;
+                                       case V4L2_SLICED_CAPTION_525:
+                                               lcr[i] |= 4 << (4 * x);
+                                               break;
+                                       case V4L2_SLICED_WSS_625:
+                                               lcr[i] |= 5 << (4 * x);
+                                               break;
+                                       case V4L2_SLICED_VPS:
+                                               lcr[i] |= 7 << (4 * x);
+                                               break;
+                               }
+                       }
+               }
+       }
+
+       /* write the lcr registers */
+       for (i = 2; i <= 23; i++) {
+               saa7115_write(client, i - 2 + 0x41, lcr[i]);
+       }
+
+       /* enable/disable raw VBI capturing */
+       saa7115_writeregs(client, fmt->service_set == 0 ? saa7115_cfg_vbi_on : saa7115_cfg_vbi_off);
+}
+
+static int saa7115_get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+       static u16 lcr2vbi[] = {
+               0, V4L2_SLICED_TELETEXT_B, 0,   /* 1 */
+               0, V4L2_SLICED_CAPTION_525,     /* 4 */
+               V4L2_SLICED_WSS_625, 0,         /* 5 */
+               V4L2_SLICED_VPS, 0, 0, 0, 0,    /* 7 */
+               0, 0, 0, 0
+       };
+       struct v4l2_sliced_vbi_format *sliced = &fmt->fmt.sliced;
+       int i;
+
+       if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+               return -EINVAL;
+       memset(sliced, 0, sizeof(*sliced));
+       /* done if using raw VBI */
+       if (saa7115_read(client, 0x80) & 0x10)
+               return 0;
+       for (i = 2; i <= 23; i++) {
+               u8 v = saa7115_read(client, i - 2 + 0x41);
+
+               sliced->service_lines[0][i] = lcr2vbi[v >> 4];
+               sliced->service_lines[1][i] = lcr2vbi[v & 0xf];
+               sliced->service_set |=
+                       sliced->service_lines[0][i] | sliced->service_lines[1][i];
+       }
+       return 0;
+}
+
+static int saa7115_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       struct v4l2_pix_format *pix;
+       int HPSC, HFSC;
+       int VSCY, Vsrc;
+       int is_50hz = state->std & V4L2_STD_625_50;
+
+       if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
+               saa7115_set_lcr(client, &fmt->fmt.sliced);
+               return 0;
+       }
+       if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               return -EINVAL;
+
+       pix = &(fmt->fmt.pix);
+
+       saa7115_dbg("decoder set size\n");
+
+       /* FIXME need better bounds checking here */
+       if ((pix->width < 1) || (pix->width > 1440))
+               return -EINVAL;
+       if ((pix->height < 1) || (pix->height > 960))
+               return -EINVAL;
+
+       /* probably have a valid size, let's set it */
+       /* Set output width/height */
+       /* width */
+       saa7115_write(client, 0xcc, (u8) (pix->width & 0xff));
+       saa7115_write(client, 0xcd, (u8) ((pix->width >> 8) & 0xff));
+       /* height */
+       saa7115_write(client, 0xce, (u8) (pix->height & 0xff));
+       saa7115_write(client, 0xcf, (u8) ((pix->height >> 8) & 0xff));
+
+       /* Scaling settings */
+       /* Hprescaler is floor(inres/outres) */
+       /* FIXME hardcoding input res */
+       if (pix->width != 720) {
+               HPSC = (int)(720 / pix->width);
+               /* 0 is not allowed (div. by zero) */
+               HPSC = HPSC ? HPSC : 1;
+               HFSC = (int)((1024 * 720) / (HPSC * pix->width));
+
+               saa7115_dbg("Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
+               /* FIXME hardcodes to "Task B"
+                * write H prescaler integer */
+               saa7115_write(client, 0xd0, (u8) (HPSC & 0x3f));
+
+               /* write H fine-scaling (luminance) */
+               saa7115_write(client, 0xd8, (u8) (HFSC & 0xff));
+               saa7115_write(client, 0xd9, (u8) ((HFSC >> 8) & 0xff));
+               /* write H fine-scaling (chrominance)
+                * must be lum/2, so i'll just bitshift :) */
+               saa7115_write(client, 0xDC, (u8) ((HFSC >> 1) & 0xff));
+               saa7115_write(client, 0xDD, (u8) ((HFSC >> 9) & 0xff));
+       } else {
+               if (is_50hz) {
+                       saa7115_dbg("Setting full 50hz width\n");
+                       saa7115_writeregs(client, saa7115_cfg_50hz_fullres_x);
+               } else {
+                       saa7115_dbg("Setting full 60hz width\n");
+                       saa7115_writeregs(client, saa7115_cfg_60hz_fullres_x);
+               }
+       }
+
+       Vsrc = is_50hz ? 576 : 480;
+
+       if (pix->height != Vsrc) {
+               VSCY = (int)((1024 * Vsrc) / pix->height);
+               saa7115_dbg("Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
+
+               /* Correct Contrast and Luminance */
+               saa7115_write(client, 0xd5, (u8) (64 * 1024 / VSCY));
+               saa7115_write(client, 0xd6, (u8) (64 * 1024 / VSCY));
+
+               /* write V fine-scaling (luminance) */
+               saa7115_write(client, 0xe0, (u8) (VSCY & 0xff));
+               saa7115_write(client, 0xe1, (u8) ((VSCY >> 8) & 0xff));
+               /* write V fine-scaling (chrominance) */
+               saa7115_write(client, 0xe2, (u8) (VSCY & 0xff));
+               saa7115_write(client, 0xe3, (u8) ((VSCY >> 8) & 0xff));
+       } else {
+               if (is_50hz) {
+                       saa7115_dbg("Setting full 50Hz height\n");
+                       saa7115_writeregs(client, saa7115_cfg_50hz_fullres_y);
+               } else {
+                       saa7115_dbg("Setting full 60hz height\n");
+                       saa7115_writeregs(client, saa7115_cfg_60hz_fullres_y);
+               }
+       }
+
+       saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+       return 0;
+}
+
+/* Decode the sliced VBI data stream as created by the saa7115.
+   The format is described in the saa7115 datasheet in Tables 25 and 26
+   and in Figure 33.
+   The current implementation uses SAV/EAV codes and not the ancillary data
+   headers. The vbi->p pointer points to the SDID byte right after the SAV
+   code. */
+static void saa7115_decode_vbi_line(struct i2c_client *client,
+                                   struct v4l2_decode_vbi_line *vbi)
+{
+       static const char vbi_no_data_pattern[] = {
+               0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
+       };
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       u8 *p = vbi->p;
+       u32 wss;
+       int id1, id2;   /* the ID1 and ID2 bytes from the internal header */
+
+       vbi->type = 0;  /* mark result as a failure */
+       id1 = p[2];
+       id2 = p[3];
+       /* Note: the field bit is inverted for 60 Hz video */
+       if (state->std & V4L2_STD_525_60)
+               id1 ^= 0x40;
+
+       /* Skip internal header, p now points to the start of the payload */
+       p += 4;
+       vbi->p = p;
+
+       /* calculate field and line number of the VBI packet (1-23) */
+       vbi->is_second_field = ((id1 & 0x40) != 0);
+       vbi->line = (id1 & 0x3f) << 3;
+       vbi->line |= (id2 & 0x70) >> 4;
+
+       /* Obtain data type */
+       id2 &= 0xf;
+
+       /* If the VBI slicer does not detect any signal it will fill up
+          the payload buffer with 0xa0 bytes. */
+       if (!memcmp(p, vbi_no_data_pattern, sizeof(vbi_no_data_pattern)))
+               return;
+
+       /* decode payloads */
+       switch (id2) {
+       case 1:
+               vbi->type = V4L2_SLICED_TELETEXT_B;
+               break;
+       case 4:
+               if (!saa7115_odd_parity(p[0]) || !saa7115_odd_parity(p[1]))
+                       return;
+               vbi->type = V4L2_SLICED_CAPTION_525;
+               break;
+       case 5:
+               wss = saa7115_decode_wss(p);
+               if (wss == -1)
+                       return;
+               p[0] = wss & 0xff;
+               p[1] = wss >> 8;
+               vbi->type = V4L2_SLICED_WSS_625;
+               break;
+       case 7:
+               if (saa7115_decode_vps(p, p) != 0)
+                       return;
+               vbi->type = V4L2_SLICED_VPS;
+               break;
+       default:
+               return;
+       }
+}
+
+/* ============ SAA7115 AUDIO settings (end) ============= */
+
+static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       int *iarg = arg;
+
+       /* ioctls to allow direct access to the saa7115 registers for testing */
+       switch (cmd) {
+       case VIDIOC_S_FMT:
+               return saa7115_set_v4lfmt(client, (struct v4l2_format *)arg);
+
+       case VIDIOC_G_FMT:
+               return saa7115_get_v4lfmt(client, (struct v4l2_format *)arg);
+
+       case VIDIOC_INT_AUDIO_CLOCK_FREQ:
+               return saa7115_set_audio_clock_freq(client, *(enum v4l2_audio_clock_freq *)arg);
+
+       case VIDIOC_G_TUNER:
+       {
+               struct v4l2_tuner *vt = arg;
+               int status;
+
+               status = saa7115_read(client, 0x1f);
+
+               saa7115_dbg("status: 0x%02x\n", status);
+               vt->signal = ((status & (1 << 6)) == 0) ? 0xffff : 0x0;
+               break;
+       }
+
+       case VIDIOC_LOG_STATUS:
+               saa7115_log_status(client);
+               break;
+
+       case VIDIOC_G_CTRL:
+               return saa7115_get_v4lctrl(client, (struct v4l2_control *)arg);
+
+       case VIDIOC_S_CTRL:
+               return saa7115_set_v4lctrl(client, (struct v4l2_control *)arg);
+
+       case VIDIOC_G_STD:
+               *(v4l2_std_id *)arg = saa7115_get_v4lstd(client);
+               break;
+
+       case VIDIOC_S_STD:
+               saa7115_set_v4lstd(client, *(v4l2_std_id *)arg);
+               break;
+
+       case VIDIOC_G_INPUT:
+               *(int *)arg = state->input;
+               break;
+
+       case VIDIOC_S_INPUT:
+               saa7115_dbg("decoder set input %d\n", *iarg);
+               /* inputs from 0-9 are available */
+               if (*iarg < 0 || *iarg > 9) {
+                       return -EINVAL;
+               }
+
+               if (state->input == *iarg)
+                       break;
+               saa7115_dbg("now setting %s input\n",
+                       *iarg >= 6 ? "S-Video" : "Composite");
+               state->input = *iarg;
+
+               /* select mode */
+               saa7115_write(client, 0x02,
+                             (saa7115_read(client, 0x02) & 0xf0) |
+                              state->input);
+
+               /* bypass chrominance trap for modes 6..9 */
+               saa7115_write(client, 0x09,
+                             (saa7115_read(client, 0x09) & 0x7f) |
+                              (state->input < 6 ? 0x0 : 0x80));
+               break;
+
+       case VIDIOC_STREAMON:
+       case VIDIOC_STREAMOFF:
+               saa7115_dbg("%s output\n",
+                       (cmd == VIDIOC_STREAMON) ? "enable" : "disable");
+
+               if (state->enable != (cmd == VIDIOC_STREAMON)) {
+                       state->enable = (cmd == VIDIOC_STREAMON);
+                       saa7115_write(client, 0x87, state->enable);
+               }
+               break;
+
+       case VIDIOC_INT_DECODE_VBI_LINE:
+               saa7115_decode_vbi_line(client, arg);
+               break;
+
+       case VIDIOC_INT_RESET:
+               saa7115_dbg("decoder RESET\n");
+               saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+               break;
+
+       case VIDIOC_INT_G_VBI_DATA:
+       {
+               struct v4l2_sliced_vbi_data *data = arg;
+
+               switch (data->id) {
+               case V4L2_SLICED_WSS_625:
+                       if (saa7115_read(client, 0x6b) & 0xc0)
+                               return -EIO;
+                       data->data[0] = saa7115_read(client, 0x6c);
+                       data->data[1] = saa7115_read(client, 0x6d);
+                       return 0;
+               case V4L2_SLICED_CAPTION_525:
+                       if (data->field == 0) {
+                               /* CC */
+                               if (saa7115_read(client, 0x66) & 0xc0)
+                                       return -EIO;
+                               data->data[0] = saa7115_read(client, 0x67);
+                               data->data[1] = saa7115_read(client, 0x68);
+                               return 0;
+                       }
+                       /* XDS */
+                       if (saa7115_read(client, 0x66) & 0x30)
+                               return -EIO;
+                       data->data[0] = saa7115_read(client, 0x69);
+                       data->data[1] = saa7115_read(client, 0x6a);
+                       return 0;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       }
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       case VIDIOC_INT_G_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_SAA711X)
+                       return -EINVAL;
+               reg->val = saa7115_read(client, reg->reg & 0xff);
+               break;
+       }
+
+       case VIDIOC_INT_S_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_SAA711X)
+                       return -EINVAL;
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EPERM;
+               saa7115_write(client, reg->reg & 0xff, reg->val & 0xff);
+               break;
+       }
+#endif
+
+       case VIDIOC_INT_G_CHIP_IDENT:
+               *iarg = state->ident;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static struct i2c_driver i2c_driver_saa7115;
+
+static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind)
+{
+       struct i2c_client *client;
+       struct saa7115_state *state;
+       u8 chip_id;
+
+       /* Check if the adapter supports the needed features */
+       if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+               return 0;
+
+       client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+       if (client == 0)
+               return -ENOMEM;
+       memset(client, 0, sizeof(struct i2c_client));
+       client->addr = address;
+       client->adapter = adapter;
+       client->driver = &i2c_driver_saa7115;
+       client->flags = I2C_CLIENT_ALLOW_USE;
+       snprintf(client->name, sizeof(client->name) - 1, "saa7115");
+
+       saa7115_dbg("detecting saa7115 client on address 0x%x\n", address << 1);
+
+       saa7115_write(client, 0, 5);
+       chip_id = saa7115_read(client, 0) & 0x0f;
+       if (chip_id != 4 && chip_id != 5) {
+               saa7115_dbg("saa7115 not found\n");
+               kfree(client);
+               return 0;
+       }
+       if (chip_id == 4) {
+               snprintf(client->name, sizeof(client->name) - 1, "saa7114");
+       }
+       saa7115_info("saa711%d found @ 0x%x (%s)\n", chip_id, address << 1, adapter->name);
+
+       state = kmalloc(sizeof(struct saa7115_state), GFP_KERNEL);
+       i2c_set_clientdata(client, state);
+       if (state == NULL) {
+               kfree(client);
+               return -ENOMEM;
+       }
+       memset(state, 0, sizeof(struct saa7115_state));
+       state->std = V4L2_STD_NTSC;
+       state->input = -1;
+       state->enable = 1;
+       state->bright = 128;
+       state->contrast = 64;
+       state->hue = 0;
+       state->sat = 64;
+       state->ident = (chip_id == 4) ? V4L2_IDENT_SAA7114 : V4L2_IDENT_SAA7115;
+       state->audclk_freq = V4L2_AUDCLK_48_KHZ;
+
+       saa7115_dbg("writing init values\n");
+
+       /* init to 60hz/48khz */
+       saa7115_writeregs(client, saa7115_init_auto_input);
+       saa7115_writeregs(client, saa7115_init_misc);
+       saa7115_writeregs(client, saa7115_cfg_60hz_fullres_x);
+       saa7115_writeregs(client, saa7115_cfg_60hz_fullres_y);
+       saa7115_writeregs(client, saa7115_cfg_60hz_video);
+       saa7115_writeregs(client, saa7115_cfg_48_audio);
+       saa7115_writeregs(client, saa7115_cfg_60hz_48_audio);
+       saa7115_writeregs(client, saa7115_cfg_reset_scaler);
+
+       i2c_attach_client(client);
+
+       saa7115_dbg("status: (1E) 0x%02x, (1F) 0x%02x\n",
+               saa7115_read(client, 0x1e), saa7115_read(client, 0x1f));
+
+       return 0;
+}
+
+static int saa7115_probe(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+       if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+       if (adapter->id == I2C_HW_B_BT848)
+#endif
+               return i2c_probe(adapter, &addr_data, &saa7115_attach);
+       return 0;
+}
+
+static int saa7115_detach(struct i2c_client *client)
+{
+       struct saa7115_state *state = i2c_get_clientdata(client);
+       int err;
+
+       err = i2c_detach_client(client);
+       if (err) {
+               return err;
+       }
+
+       kfree(state);
+       kfree(client);
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* i2c implementation */
+static struct i2c_driver i2c_driver_saa7115 = {
+       .name = "saa7115",
+       .id = I2C_DRIVERID_SAA711X,
+       .flags = I2C_DF_NOTIFY,
+       .attach_adapter = saa7115_probe,
+       .detach_client = saa7115_detach,
+       .command = saa7115_command,
+       .owner = THIS_MODULE,
+};
+
+
+static int __init saa7115_init_module(void)
+{
+       return i2c_add_driver(&i2c_driver_saa7115);
+}
+
+static void __exit saa7115_cleanup_module(void)
+{
+       i2c_del_driver(&i2c_driver_saa7115);
+}
+
+module_init(saa7115_init_module);
+module_exit(saa7115_cleanup_module);
index 9aa8827de2c36a3863a2d67fd842ba56dc52537d..25b30f352d84103564e661dca26d6580e5a2afe3 100644 (file)
@@ -36,7 +36,6 @@
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <linux/sched.h>
-#include <asm/segment.h>
 #include <linux/types.h>
 #include <asm/uaccess.h>
 #include <linux/videodev.h>
diff --git a/drivers/media/video/saa7127.c b/drivers/media/video/saa7127.c
new file mode 100644 (file)
index 0000000..843431f
--- /dev/null
@@ -0,0 +1,849 @@
+/*
+ * saa7127 - Philips SAA7127/SAA7129 video encoder driver
+ *
+ * Copyright (C) 2003 Roy Bulter <rbulter@hetnet.nl>
+ *
+ * Based on SAA7126 video encoder driver by Gillem & Andreas Oberritter
+ *
+ * Copyright (C) 2000-2001 Gillem <htoa@gmx.net>
+ * Copyright (C) 2002 Andreas Oberritter <obi@saftware.de>
+ *
+ * Based on Stadis 4:2:2 MPEG-2 Decoder Driver by Nathan Laredo
+ *
+ * Copyright (C) 1999 Nathan Laredo <laredo@gnu.org>
+ *
+ * This driver is designed for the Hauppauge 250/350 Linux driver
+ * from the ivtv Project
+ *
+ * Copyright (C) 2003 Kevin Thayer <nufan_wfk@yahoo.com>
+ *
+ * Dual output support:
+ * Copyright (C) 2004 Eric Varsanyi
+ *
+ * NTSC Tuning and 7.5 IRE Setup
+ * Copyright (C) 2004  Chris Kennedy <c@groovy.org>
+ *
+ * VBI additions & cleanup:
+ * Copyright (C) 2004, 2005 Hans Verkuil <hverkuil@xs4all.nl>
+ *
+ * Note: the saa7126 is identical to the saa7127, and the saa7128 is
+ * identical to the saa7129, except that the saa7126 and saa7128 have
+ * macrovision anti-taping support. This driver will almost certainly
+ * work find for those chips, except of course for the missing anti-taping
+ * support.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-common.h>
+
+static int debug = 0;
+static int test_image = 0;
+
+MODULE_DESCRIPTION("Philips SAA7127/9 video encoder driver");
+MODULE_AUTHOR("Kevin Thayer, Chris Kennedy, Hans Verkuil");
+MODULE_LICENSE("GPL");
+module_param(debug, int, 0644);
+module_param(test_image, int, 0644);
+MODULE_PARM_DESC(debug, "debug level (0-2)");
+MODULE_PARM_DESC(test_image, "test_image (0-1)");
+
+#define saa7127_dbg(fmt, arg...) \
+       do { \
+               if (debug >= 1) \
+                       printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+                              i2c_adapter_id(client->adapter), client->addr , ## arg); \
+       } while (0)
+
+/* High volume debug. Use with care. */
+#define saa7127_dbg_highvol(fmt, arg...) \
+       do { \
+               if (debug == 2) \
+                       printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \
+                              i2c_adapter_id(client->adapter), client->addr , ## arg); \
+       } while (0)
+
+#define saa7127_err(fmt, arg...) do { \
+       printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+#define saa7127_info(fmt, arg...) do { \
+       printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \
+              i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0)
+
+static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
+
+
+I2C_CLIENT_INSMOD;
+
+/*
+ * SAA7127 registers
+ */
+
+#define SAA7127_REG_STATUS                           0x00
+#define SAA7127_REG_WIDESCREEN_CONFIG                0x26
+#define SAA7127_REG_WIDESCREEN_ENABLE                0x27
+#define SAA7127_REG_BURST_START                      0x28
+#define SAA7127_REG_BURST_END                        0x29
+#define SAA7127_REG_COPYGEN_0                        0x2a
+#define SAA7127_REG_COPYGEN_1                        0x2b
+#define SAA7127_REG_COPYGEN_2                        0x2c
+#define SAA7127_REG_OUTPUT_PORT_CONTROL              0x2d
+#define SAA7127_REG_GAIN_LUMINANCE_RGB               0x38
+#define SAA7127_REG_GAIN_COLORDIFF_RGB               0x39
+#define SAA7127_REG_INPUT_PORT_CONTROL_1             0x3a
+#define SAA7129_REG_FADE_KEY_COL2                   0x4f
+#define SAA7127_REG_CHROMA_PHASE                     0x5a
+#define SAA7127_REG_GAINU                            0x5b
+#define SAA7127_REG_GAINV                            0x5c
+#define SAA7127_REG_BLACK_LEVEL                      0x5d
+#define SAA7127_REG_BLANKING_LEVEL                   0x5e
+#define SAA7127_REG_VBI_BLANKING                     0x5f
+#define SAA7127_REG_DAC_CONTROL                      0x61
+#define SAA7127_REG_BURST_AMP                        0x62
+#define SAA7127_REG_SUBC3                            0x63
+#define SAA7127_REG_SUBC2                            0x64
+#define SAA7127_REG_SUBC1                            0x65
+#define SAA7127_REG_SUBC0                            0x66
+#define SAA7127_REG_LINE_21_ODD_0                    0x67
+#define SAA7127_REG_LINE_21_ODD_1                    0x68
+#define SAA7127_REG_LINE_21_EVEN_0                   0x69
+#define SAA7127_REG_LINE_21_EVEN_1                   0x6a
+#define SAA7127_REG_RCV_PORT_CONTROL                 0x6b
+#define SAA7127_REG_VTRIG                            0x6c
+#define SAA7127_REG_HTRIG_HI                         0x6d
+#define SAA7127_REG_MULTI                            0x6e
+#define SAA7127_REG_CLOSED_CAPTION                   0x6f
+#define SAA7127_REG_RCV2_OUTPUT_START                0x70
+#define SAA7127_REG_RCV2_OUTPUT_END                  0x71
+#define SAA7127_REG_RCV2_OUTPUT_MSBS                 0x72
+#define SAA7127_REG_TTX_REQUEST_H_START              0x73
+#define SAA7127_REG_TTX_REQUEST_H_DELAY_LENGTH       0x74
+#define SAA7127_REG_CSYNC_ADVANCE_VSYNC_SHIFT        0x75
+#define SAA7127_REG_TTX_ODD_REQ_VERT_START           0x76
+#define SAA7127_REG_TTX_ODD_REQ_VERT_END             0x77
+#define SAA7127_REG_TTX_EVEN_REQ_VERT_START          0x78
+#define SAA7127_REG_TTX_EVEN_REQ_VERT_END            0x79
+#define SAA7127_REG_FIRST_ACTIVE                     0x7a
+#define SAA7127_REG_LAST_ACTIVE                      0x7b
+#define SAA7127_REG_MSB_VERTICAL                     0x7c
+#define SAA7127_REG_DISABLE_TTX_LINE_LO_0            0x7e
+#define SAA7127_REG_DISABLE_TTX_LINE_LO_1            0x7f
+
+/*
+ **********************************************************************
+ *
+ *  Arrays with configuration parameters for the SAA7127
+ *
+ **********************************************************************
+ */
+
+struct i2c_reg_value {
+       unsigned char reg;
+       unsigned char value;
+};
+
+static const struct i2c_reg_value saa7129_init_config_extra[] = {
+       { SAA7127_REG_OUTPUT_PORT_CONTROL,              0x38 },
+       { SAA7127_REG_VTRIG,                            0xfa },
+};
+
+static const struct i2c_reg_value saa7127_init_config_common[] = {
+       { SAA7127_REG_WIDESCREEN_CONFIG,                0x0d },
+       { SAA7127_REG_WIDESCREEN_ENABLE,                0x00 },
+       { SAA7127_REG_COPYGEN_0,                        0x77 },
+       { SAA7127_REG_COPYGEN_1,                        0x41 },
+       { SAA7127_REG_COPYGEN_2,                        0x00 }, /* Macrovision enable/disable */
+       { SAA7127_REG_OUTPUT_PORT_CONTROL,              0x9e },
+       { SAA7127_REG_GAIN_LUMINANCE_RGB,               0x00 },
+       { SAA7127_REG_GAIN_COLORDIFF_RGB,               0x00 },
+       { SAA7127_REG_INPUT_PORT_CONTROL_1,             0x80 }, /* for color bars */
+       { SAA7127_REG_LINE_21_ODD_0,                    0x77 },
+       { SAA7127_REG_LINE_21_ODD_1,                    0x41 },
+       { SAA7127_REG_LINE_21_EVEN_0,                   0x88 },
+       { SAA7127_REG_LINE_21_EVEN_1,                   0x41 },
+       { SAA7127_REG_RCV_PORT_CONTROL,                 0x12 },
+       { SAA7127_REG_VTRIG,                            0xf9 },
+       { SAA7127_REG_HTRIG_HI,                         0x00 },
+       { SAA7127_REG_RCV2_OUTPUT_START,                0x41 },
+       { SAA7127_REG_RCV2_OUTPUT_END,                  0xc3 },
+       { SAA7127_REG_RCV2_OUTPUT_MSBS,                 0x00 },
+       { SAA7127_REG_TTX_REQUEST_H_START,              0x3e },
+       { SAA7127_REG_TTX_REQUEST_H_DELAY_LENGTH,       0xb8 },
+       { SAA7127_REG_CSYNC_ADVANCE_VSYNC_SHIFT,        0x03 },
+       { SAA7127_REG_TTX_ODD_REQ_VERT_START,           0x15 },
+       { SAA7127_REG_TTX_ODD_REQ_VERT_END,             0x16 },
+       { SAA7127_REG_TTX_EVEN_REQ_VERT_START,          0x15 },
+       { SAA7127_REG_TTX_EVEN_REQ_VERT_END,            0x16 },
+       { SAA7127_REG_FIRST_ACTIVE,                     0x1a },
+       { SAA7127_REG_LAST_ACTIVE,                      0x01 },
+       { SAA7127_REG_MSB_VERTICAL,                     0xc0 },
+       { SAA7127_REG_DISABLE_TTX_LINE_LO_0,            0x00 },
+       { SAA7127_REG_DISABLE_TTX_LINE_LO_1,            0x00 },
+       { 0, 0 }
+};
+
+#define SAA7127_60HZ_DAC_CONTROL 0x15
+static const struct i2c_reg_value saa7127_init_config_60hz[] = {
+       { SAA7127_REG_BURST_START,                      0x19 },
+       /* BURST_END is also used as a chip ID in saa7127_detect_client */
+       { SAA7127_REG_BURST_END,                        0x1d },
+       { SAA7127_REG_CHROMA_PHASE,                     0xa3 },
+       { SAA7127_REG_GAINU,                            0x98 },
+       { SAA7127_REG_GAINV,                            0xd3 },
+       { SAA7127_REG_BLACK_LEVEL,                      0x39 },
+       { SAA7127_REG_BLANKING_LEVEL,                   0x2e },
+       { SAA7127_REG_VBI_BLANKING,                     0x2e },
+       { SAA7127_REG_DAC_CONTROL,                      0x15 },
+       { SAA7127_REG_BURST_AMP,                        0x4d },
+       { SAA7127_REG_SUBC3,                            0x1f },
+       { SAA7127_REG_SUBC2,                            0x7c },
+       { SAA7127_REG_SUBC1,                            0xf0 },
+       { SAA7127_REG_SUBC0,                            0x21 },
+       { SAA7127_REG_MULTI,                            0x90 },
+       { SAA7127_REG_CLOSED_CAPTION,                   0x11 },
+       { 0, 0 }
+};
+
+#define SAA7127_50HZ_DAC_CONTROL 0x02
+struct i2c_reg_value saa7127_init_config_50hz[] = {
+       { SAA7127_REG_BURST_START,                      0x21 },
+       /* BURST_END is also used as a chip ID in saa7127_detect_client */
+       { SAA7127_REG_BURST_END,                        0x1d },
+       { SAA7127_REG_CHROMA_PHASE,                     0x3f },
+       { SAA7127_REG_GAINU,                            0x7d },
+       { SAA7127_REG_GAINV,                            0xaf },
+       { SAA7127_REG_BLACK_LEVEL,                      0x33 },
+       { SAA7127_REG_BLANKING_LEVEL,                   0x35 },
+       { SAA7127_REG_VBI_BLANKING,                     0x35 },
+       { SAA7127_REG_DAC_CONTROL,                      0x02 },
+       { SAA7127_REG_BURST_AMP,                        0x2f },
+       { SAA7127_REG_SUBC3,                            0xcb },
+       { SAA7127_REG_SUBC2,                            0x8a },
+       { SAA7127_REG_SUBC1,                            0x09 },
+       { SAA7127_REG_SUBC0,                            0x2a },
+       { SAA7127_REG_MULTI,                            0xa0 },
+       { SAA7127_REG_CLOSED_CAPTION,                   0x00 },
+       { 0, 0 }
+};
+
+/* Enumeration for the Supported input types */
+enum saa7127_input_type {
+       SAA7127_INPUT_TYPE_NORMAL,
+       SAA7127_INPUT_TYPE_TEST_IMAGE
+};
+
+/* Enumeration for the Supported Output signal types */
+enum saa7127_output_type {
+       SAA7127_OUTPUT_TYPE_BOTH,
+       SAA7127_OUTPUT_TYPE_COMPOSITE,
+       SAA7127_OUTPUT_TYPE_SVIDEO,
+       SAA7127_OUTPUT_TYPE_RGB,
+       SAA7127_OUTPUT_TYPE_YUV_C,
+       SAA7127_OUTPUT_TYPE_YUV_V
+};
+
+/*
+ **********************************************************************
+ *
+ *  Encoder Struct, holds the configuration state of the encoder
+ *
+ **********************************************************************
+ */
+
+struct saa7127_state {
+       v4l2_std_id std;
+       enum v4l2_chip_ident ident;
+       enum saa7127_input_type input_type;
+       enum saa7127_output_type output_type;
+       int video_enable;
+       int wss_enable;
+       u16 wss_mode;
+       int cc_enable;
+       u16 cc_data;
+       int xds_enable;
+       u16 xds_data;
+       int vps_enable;
+       u8 vps_data[5];
+       u8 reg_2d;
+       u8 reg_3a;
+       u8 reg_3a_cb;   /* colorbar bit */
+       u8 reg_61;
+};
+
+static const char * const output_strs[] =
+{
+       "S-Video + Composite",
+       "Composite",
+       "S-Video",
+       "RGB",
+       "YUV C",
+       "YUV V"
+};
+
+static const char * const wss_strs[] = {
+       "invalid",
+       "letterbox 14:9 center",
+       "letterbox 14:9 top",
+       "invalid",
+       "letterbox 16:9 top",
+       "invalid",
+       "invalid",
+       "16:9 full format anamorphic"
+       "4:3 full format",
+       "invalid",
+       "invalid",
+       "letterbox 16:9 center",
+       "invalid",
+       "letterbox >16:9 center",
+       "14:9 full format center",
+       "invalid",
+};
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_read(struct i2c_client *client, u8 reg)
+{
+       return i2c_smbus_read_byte_data(client, reg);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_write(struct i2c_client *client, u8 reg, u8 val)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+               if (i2c_smbus_write_byte_data(client, reg, val) == 0)
+                       return 0;
+       }
+       saa7127_err("I2C Write Problem\n");
+       return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_write_inittab(struct i2c_client *client,
+                                const struct i2c_reg_value *regs)
+{
+       while (regs->reg != 0) {
+               saa7127_write(client, regs->reg, regs->value);
+               regs++;
+       }
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_vps(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       int enable = (data->line != 0);
+
+       if (enable && (data->field != 0 || data->line != 16))
+               return -EINVAL;
+       if (state->vps_enable != enable) {
+               saa7127_dbg("Turn VPS Signal %s\n", enable ? "on" : "off");
+               saa7127_write(client, 0x54, enable << 7);
+               state->vps_enable = enable;
+       }
+       if (!enable)
+               return 0;
+
+       state->vps_data[0] = data->data[4];
+       state->vps_data[1] = data->data[10];
+       state->vps_data[2] = data->data[11];
+       state->vps_data[3] = data->data[12];
+       state->vps_data[4] = data->data[13];
+       saa7127_dbg("Set VPS data %02x %02x %02x %02x %02x\n",
+               state->vps_data[0], state->vps_data[1],
+               state->vps_data[2], state->vps_data[3],
+               state->vps_data[4]);
+       saa7127_write(client, 0x55, state->vps_data[0]);
+       saa7127_write(client, 0x56, state->vps_data[1]);
+       saa7127_write(client, 0x57, state->vps_data[2]);
+       saa7127_write(client, 0x58, state->vps_data[3]);
+       saa7127_write(client, 0x59, state->vps_data[4]);
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_cc(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       u16 cc = data->data[0] << 8 | data->data[1];
+       int enable = (data->line != 0);
+
+       if (enable && (data->field != 0 || data->line != 21))
+               return -EINVAL;
+       if (state->cc_enable != enable) {
+               saa7127_dbg("Turn CC %s\n", enable ? "on" : "off");
+               saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
+                               (enable << 6) | 0x11);
+               state->cc_enable = enable;
+       }
+       if (!enable)
+               return 0;
+
+       saa7127_dbg_highvol("CC data: %04x\n", cc);
+       saa7127_write(client, SAA7127_REG_LINE_21_ODD_0, cc & 0xff);
+       saa7127_write(client, SAA7127_REG_LINE_21_ODD_1, cc >> 8);
+       state->cc_data = cc;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_xds(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       u16 xds = data->data[1] << 8 | data->data[0];
+       int enable = (data->line != 0);
+
+       if (enable && (data->field != 1 || data->line != 21))
+               return -EINVAL;
+       if (state->xds_enable != enable) {
+               saa7127_dbg("Turn XDS %s\n", enable ? "on" : "off");
+               saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
+                               (enable << 7) | 0x11);
+               state->xds_enable = enable;
+       }
+       if (!enable)
+               return 0;
+
+       saa7127_dbg_highvol("XDS data: %04x\n", xds);
+       saa7127_write(client, SAA7127_REG_LINE_21_EVEN_0, xds & 0xff);
+       saa7127_write(client, SAA7127_REG_LINE_21_EVEN_1, xds >> 8);
+       state->xds_data = xds;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_wss(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       int enable = (data->line != 0);
+
+       if (enable && (data->field != 0 || data->line != 23))
+               return -EINVAL;
+       if (state->wss_enable != enable) {
+               saa7127_dbg("Turn WSS %s\n", enable ? "on" : "off");
+               saa7127_write(client, 0x27, enable << 7);
+               state->wss_enable = enable;
+       }
+       if (!enable)
+               return 0;
+
+       saa7127_write(client, 0x26, data->data[0]);
+       saa7127_write(client, 0x27, 0x80 | (data->data[1] & 0x3f));
+       saa7127_dbg("WSS mode: %s\n", wss_strs[data->data[0] & 0xf]);
+       state->wss_mode = (data->data[1] & 0x3f) << 8 | data->data[0];
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_video_enable(struct i2c_client *client, int enable)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+
+       if (enable) {
+               saa7127_dbg("Enable Video Output\n");
+               saa7127_write(client, 0x2d, state->reg_2d);
+               saa7127_write(client, 0x61, state->reg_61);
+       } else {
+               saa7127_dbg("Disable Video Output\n");
+               saa7127_write(client, 0x2d, (state->reg_2d & 0xf0));
+               saa7127_write(client, 0x61, (state->reg_61 | 0xc0));
+       }
+       state->video_enable = enable;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_std(struct i2c_client *client, v4l2_std_id std)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       const struct i2c_reg_value *inittab;
+
+       if (std & V4L2_STD_525_60) {
+               saa7127_dbg("Selecting 60 Hz video Standard\n");
+               inittab = saa7127_init_config_60hz;
+               state->reg_61 = SAA7127_60HZ_DAC_CONTROL;
+       } else {
+               saa7127_dbg("Selecting 50 Hz video Standard\n");
+               inittab = saa7127_init_config_50hz;
+               state->reg_61 = SAA7127_50HZ_DAC_CONTROL;
+       }
+
+       /* Write Table */
+       saa7127_write_inittab(client, inittab);
+       state->std = std;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_output_type(struct i2c_client *client, int output)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+
+       switch (output) {
+       case SAA7127_OUTPUT_TYPE_RGB:
+               state->reg_2d = 0x0f;   /* RGB + CVBS (for sync) */
+               state->reg_3a = 0x13;   /* by default switch YUV to RGB-matrix on */
+               break;
+
+       case SAA7127_OUTPUT_TYPE_COMPOSITE:
+               state->reg_2d = 0x08;   /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
+               state->reg_3a = 0x13;   /* by default switch YUV to RGB-matrix on */
+               break;
+
+       case SAA7127_OUTPUT_TYPE_SVIDEO:
+               state->reg_2d = 0xff;   /* 11111111  croma -> R, luma -> CVBS + G + B */
+               state->reg_3a = 0x13;   /* by default switch YUV to RGB-matrix on */
+               break;
+
+       case SAA7127_OUTPUT_TYPE_YUV_V:
+               state->reg_2d = 0x4f;   /* reg 2D = 01001111, all DAC's on, RGB + VBS */
+               state->reg_3a = 0x0b;   /* reg 3A = 00001011, bypass RGB-matrix */
+               break;
+
+       case SAA7127_OUTPUT_TYPE_YUV_C:
+               state->reg_2d = 0x0f;   /* reg 2D = 00001111, all DAC's on, RGB + CVBS */
+               state->reg_3a = 0x0b;   /* reg 3A = 00001011, bypass RGB-matrix */
+               break;
+
+       case SAA7127_OUTPUT_TYPE_BOTH:
+               state->reg_2d = 0xbf;
+               state->reg_3a = 0x13;   /* by default switch YUV to RGB-matrix on */
+               break;
+
+       default:
+               return -EINVAL;
+       }
+       saa7127_dbg("Selecting %s output type\n", output_strs[output]);
+
+       /* Configure Encoder */
+       saa7127_write(client, 0x2d, state->reg_2d);
+       saa7127_write(client, 0x3a, state->reg_3a | state->reg_3a_cb);
+       state->output_type = output;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_set_input_type(struct i2c_client *client, int input)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+
+       switch (input) {
+       case SAA7127_INPUT_TYPE_NORMAL: /* avia */
+               saa7127_dbg("Selecting Normal Encoder Input\n");
+               state->reg_3a_cb = 0;
+               break;
+
+       case SAA7127_INPUT_TYPE_TEST_IMAGE:     /* color bar */
+               saa7127_dbg("Selecting Color Bar generator\n");
+               state->reg_3a_cb = 0x80;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+       saa7127_write(client, 0x3a, state->reg_3a | state->reg_3a_cb);
+       state->input_type = input;
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_command(struct i2c_client *client,
+                          unsigned int cmd, void *arg)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       struct v4l2_format *fmt = arg;
+       int *iarg = arg;
+
+       switch (cmd) {
+       case VIDIOC_S_STD:
+               if (state->std == *(v4l2_std_id *)arg)
+                       break;
+               return saa7127_set_std(client, *(v4l2_std_id *)arg);
+
+       case VIDIOC_G_STD:
+               *(v4l2_std_id *)arg = state->std;
+               break;
+
+       case VIDIOC_S_INPUT:
+               if (state->input_type == *iarg)
+                       break;
+               return saa7127_set_input_type(client, *iarg);
+
+       case VIDIOC_S_OUTPUT:
+               if (state->output_type == *iarg)
+                       break;
+               return saa7127_set_output_type(client, *iarg);
+
+       case VIDIOC_STREAMON:
+       case VIDIOC_STREAMOFF:
+               if (state->video_enable == (cmd == VIDIOC_STREAMON))
+                       break;
+               return saa7127_set_video_enable(client, cmd == VIDIOC_STREAMON);
+
+       case VIDIOC_G_FMT:
+               if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+                       return -EINVAL;
+
+               memset(&fmt->fmt.sliced, 0, sizeof(fmt->fmt.sliced));
+               if (state->vps_enable)
+                       fmt->fmt.sliced.service_lines[0][16] = V4L2_SLICED_VPS;
+               if (state->wss_enable)
+                       fmt->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
+               if (state->cc_enable) {
+                       fmt->fmt.sliced.service_lines[0][21] = V4L2_SLICED_CAPTION_525;
+                       fmt->fmt.sliced.service_lines[1][21] = V4L2_SLICED_CAPTION_525;
+               }
+               fmt->fmt.sliced.service_set =
+                       (state->vps_enable ? V4L2_SLICED_VPS : 0) |
+                       (state->wss_enable ? V4L2_SLICED_WSS_625 : 0) |
+                       (state->cc_enable ? V4L2_SLICED_CAPTION_525 : 0);
+               break;
+
+       case VIDIOC_LOG_STATUS:
+               saa7127_info("Standard: %s\n", (state->std & V4L2_STD_525_60) ? "60 Hz" : "50 Hz");
+               saa7127_info("Input:    %s\n", state->input_type ?  "color bars" : "normal");
+               saa7127_info("Output:   %s\n", state->video_enable ?
+                       output_strs[state->output_type] : "disabled");
+               saa7127_info("WSS:      %s\n", state->wss_enable ?
+                       wss_strs[state->wss_mode] : "disabled");
+               saa7127_info("VPS:      %s\n", state->vps_enable ? "enabled" : "disabled");
+               saa7127_info("CC:       %s\n", state->cc_enable ? "enabled" : "disabled");
+               break;
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       case VIDIOC_INT_G_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_SAA7127)
+                       return -EINVAL;
+               reg->val = saa7127_read(client, reg->reg & 0xff);
+               break;
+       }
+
+       case VIDIOC_INT_S_REGISTER:
+       {
+               struct v4l2_register *reg = arg;
+
+               if (reg->i2c_id != I2C_DRIVERID_SAA7127)
+                       return -EINVAL;
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EPERM;
+               saa7127_write(client, reg->reg & 0xff, reg->val & 0xff);
+               break;
+       }
+#endif
+
+       case VIDIOC_INT_S_VBI_DATA:
+       {
+               struct v4l2_sliced_vbi_data *data = arg;
+
+               switch (data->id) {
+                       case V4L2_SLICED_WSS_625:
+                               return saa7127_set_wss(client, data);
+                       case V4L2_SLICED_VPS:
+                               return saa7127_set_vps(client, data);
+                       case V4L2_SLICED_CAPTION_525:
+                               if (data->field == 0)
+                                       return saa7127_set_cc(client, data);
+                               return saa7127_set_xds(client, data);
+                       default:
+                               return -EINVAL;
+               }
+               break;
+       }
+
+       case VIDIOC_INT_G_CHIP_IDENT:
+               *(enum v4l2_chip_ident *)arg = state->ident;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+struct i2c_driver i2c_driver_saa7127;
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_attach(struct i2c_adapter *adapter, int address, int kind)
+{
+       struct i2c_client *client;
+       struct saa7127_state *state;
+       struct v4l2_sliced_vbi_data vbi = { 0, 0, 0, 0 };  /* set to disabled */
+       int read_result = 0;
+
+       /* Check if the adapter supports the needed features */
+       if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+               return 0;
+
+       client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+       if (client == 0)
+               return -ENOMEM;
+
+       memset(client, 0, sizeof(struct i2c_client));
+       client->addr = address;
+       client->adapter = adapter;
+       client->driver = &i2c_driver_saa7127;
+       client->flags = I2C_CLIENT_ALLOW_USE;
+       snprintf(client->name, sizeof(client->name) - 1, "saa7127");
+
+       saa7127_dbg("detecting saa7127 client on address 0x%x\n", address << 1);
+
+       /* First test register 0: Bits 5-7 are a version ID (should be 0),
+          and bit 2 should also be 0.
+          This is rather general, so the second test is more specific and
+          looks at the 'ending point of burst in clock cycles' which is
+          0x1d after a reset and not expected to ever change. */
+       if ((saa7127_read(client, 0) & 0xe4) != 0 ||
+                       (saa7127_read(client, 0x29) & 0x3f) != 0x1d) {
+               saa7127_dbg("saa7127 not found\n");
+               kfree(client);
+               return 0;
+       }
+       state = kmalloc(sizeof(struct saa7127_state), GFP_KERNEL);
+
+       if (state == NULL) {
+               kfree(client);
+               return (-ENOMEM);
+       }
+
+       i2c_set_clientdata(client, state);
+       memset(state, 0, sizeof(struct saa7127_state));
+
+       /* Configure Encoder */
+
+       saa7127_dbg("Configuring encoder\n");
+       saa7127_write_inittab(client, saa7127_init_config_common);
+       saa7127_set_std(client, V4L2_STD_NTSC);
+       saa7127_set_output_type(client, SAA7127_OUTPUT_TYPE_BOTH);
+       saa7127_set_vps(client, &vbi);
+       saa7127_set_wss(client, &vbi);
+       saa7127_set_cc(client, &vbi);
+       saa7127_set_xds(client, &vbi);
+       if (test_image == 1) {
+               /* The Encoder has an internal Colorbar generator */
+               /* This can be used for debugging */
+               saa7127_set_input_type(client, SAA7127_INPUT_TYPE_TEST_IMAGE);
+       } else {
+               saa7127_set_input_type(client, SAA7127_INPUT_TYPE_NORMAL);
+       }
+       saa7127_set_video_enable(client, 1);
+
+       /* Detect if it's an saa7129 */
+       read_result = saa7127_read(client, SAA7129_REG_FADE_KEY_COL2);
+       saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, 0xaa);
+       if (saa7127_read(client, SAA7129_REG_FADE_KEY_COL2) == 0xaa) {
+               saa7127_info("saa7129 found @ 0x%x (%s)\n", address << 1, adapter->name);
+               saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, read_result);
+               saa7127_write_inittab(client, saa7129_init_config_extra);
+               state->ident = V4L2_IDENT_SAA7129;
+       } else {
+               saa7127_info("saa7127 found @ 0x%x (%s)\n", address << 1, adapter->name);
+               state->ident = V4L2_IDENT_SAA7127;
+       }
+
+       i2c_attach_client(client);
+
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_probe(struct i2c_adapter *adapter)
+{
+#ifdef I2C_CLASS_TV_ANALOG
+       if (adapter->class & I2C_CLASS_TV_ANALOG)
+#else
+       if (adapter->id == I2C_HW_B_BT848)
+#endif
+               return i2c_probe(adapter, &addr_data, saa7127_attach);
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int saa7127_detach(struct i2c_client *client)
+{
+       struct saa7127_state *state = i2c_get_clientdata(client);
+       int err;
+
+       /* Turn off TV output */
+       saa7127_set_video_enable(client, 0);
+
+       err = i2c_detach_client(client);
+
+       if (err) {
+               return err;
+       }
+
+       kfree(state);
+       kfree(client);
+       return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+struct i2c_driver i2c_driver_saa7127 = {
+       .name = "saa7127",
+       .id = I2C_DRIVERID_SAA7127,
+       .flags = I2C_DF_NOTIFY,
+       .attach_adapter = saa7127_probe,
+       .detach_client = saa7127_detach,
+       .command = saa7127_command,
+       .owner = THIS_MODULE,
+};
+
+
+/* ----------------------------------------------------------------------- */
+
+static int __init saa7127_init_module(void)
+{
+       return i2c_add_driver(&i2c_driver_saa7127);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void __exit saa7127_cleanup_module(void)
+{
+       i2c_del_driver(&i2c_driver_saa7127);
+}
+
+/* ----------------------------------------------------------------------- */
+
+module_init(saa7127_init_module);
+module_exit(saa7127_cleanup_module);
index 624e8808a517e4d1561a18132b48037a9096ff35..7bdeabe638cacef344f30fc933fbb9b1fe6c95c7 100644 (file)
@@ -1,10 +1,11 @@
 config VIDEO_SAA7134
        tristate "Philips SAA7134 support"
-       depends on VIDEO_DEV && PCI && I2C && SOUND
+       depends on VIDEO_DEV && PCI && I2C && SOUND && SND
        select VIDEO_BUF
        select VIDEO_IR
        select VIDEO_TUNER
        select CRC32
+       select SND_PCM_OSS
        ---help---
          This is a video4linux driver for Philips SAA713x based
          TV cards.
index e0b28f0533af02549d0b9e1722e3e744196d80cd..4226b61cc613a60d5a67ebdb5851aac26ee06619 100644 (file)
@@ -1,10 +1,11 @@
 
 saa7134-objs :=        saa7134-cards.o saa7134-core.o saa7134-i2c.o    \
-               saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o    \
-               saa7134-vbi.o saa7134-video.o saa7134-input.o
+               saa7134-ts.o saa7134-tvaudio.o saa7134-vbi.o    \
+               saa7134-video.o saa7134-input.o
 
 obj-$(CONFIG_VIDEO_SAA7134) +=  saa7134.o saa7134-empress.o \
-                               saa6752hs.o saa7134-alsa.o
+                               saa6752hs.o saa7134-alsa.o \
+                               saa7134-oss.o
 obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
 
 EXTRA_CFLAGS += -I$(src)/..
index 4f3c423543290492cad0fdca4a1ad200ed53d43f..5707c666660b724c592ea170cdea7a03186d0e81 100644 (file)
@@ -30,7 +30,9 @@
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
+#include <sound/pcm_params.h>
 #include <sound/initval.h>
+#include <linux/interrupt.h>
 
 #include "saa7134.h"
 #include "saa7134-reg.h"
@@ -56,6 +58,8 @@ static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
 
+int position;
+
 #define dprintk(fmt, arg...)    if (debug) \
         printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
 
@@ -68,7 +72,7 @@ typedef struct snd_card_saa7134 {
        int mixer_volume[MIXER_ADDR_LAST+1][2];
        int capture_source[MIXER_ADDR_LAST+1][2];
        struct pci_dev *pci;
-       struct saa7134_dev *saadev;
+       struct saa7134_dev *dev;
 
        unsigned long iobase;
        int irq;
@@ -83,12 +87,10 @@ typedef struct snd_card_saa7134 {
  */
 
 typedef struct snd_card_saa7134_pcm {
-       struct saa7134_dev *saadev;
+       struct saa7134_dev *dev;
 
        spinlock_t lock;
-       unsigned int pcm_size;          /* buffer size */
-       unsigned int pcm_count;         /* bytes per period */
-       unsigned int pcm_bps;           /* bytes per second */
+
        snd_pcm_substream_t *substream;
 } snd_card_saa7134_pcm_t;
 
@@ -100,13 +102,11 @@ static snd_card_t *snd_saa7134_cards[SNDRV_CARDS];
  *
  *   Called when the capture device is released or the buffer overflows
  *
- *   - Copied verbatim from saa7134-oss's dsp_dma_stop. Can be dropped
- *     if we just share dsp_dma_stop and use it here
+ *   - Copied verbatim from saa7134-oss's dsp_dma_stop.
  *
  */
 
 static void saa7134_dma_stop(struct saa7134_dev *dev)
-
 {
        dev->dmasound.dma_blk     = -1;
        dev->dmasound.dma_running = 0;
@@ -118,8 +118,7 @@ static void saa7134_dma_stop(struct saa7134_dev *dev)
  *
  *   Called when preparing the capture device for use
  *
- *   - Copied verbatim from saa7134-oss's dsp_dma_start. Can be dropped
- *     if we just share dsp_dma_start and use it here
+ *   - Copied verbatim from saa7134-oss's dsp_dma_start.
  *
  */
 
@@ -170,9 +169,9 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
        if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
                dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count,
                        dev->dmasound.bufsize, dev->dmasound.blocks);
+               spin_unlock(&dev->slock);
                snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN);
-               saa7134_dma_stop(dev);
-               goto done;
+               return;
        }
 
        /* next block addr */
@@ -194,6 +193,7 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
                snd_pcm_period_elapsed(dev->dmasound.substream);
                spin_lock(&dev->slock);
        }
+
  done:
        spin_unlock(&dev->slock);
 
@@ -209,7 +209,9 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
 
 static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-       struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
+        struct saa7134_dmasound *dmasound = dev_id;
+        struct saa7134_dev *dev = dmasound->priv_data;
+
        unsigned long report, status;
        int loop, handled = 0;
 
@@ -248,56 +250,23 @@ static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
                                          int cmd)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
-       struct saa7134_dev *dev=saapcm->saadev;
+       snd_card_saa7134_pcm_t *pcm = runtime->private_data;
+       struct saa7134_dev *dev=pcm->dev;
        int err = 0;
 
-       spin_lock_irq(&dev->slock);
-        if (cmd == SNDRV_PCM_TRIGGER_START) {
+       spin_lock(&dev->slock);
+       if (cmd == SNDRV_PCM_TRIGGER_START) {
                /* start dma */
                saa7134_dma_start(dev);
-        } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
+       } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
                /* stop dma */
                saa7134_dma_stop(dev);
-        } else {
-                err = -EINVAL;
-        }
-       spin_unlock_irq(&dev->slock);
-
-        return err;
-}
-
-/*
- * DMA buffer config
- *
- *   Sets the values that will later be used as the size of the buffer,
- *  size of the fragments, and total number of fragments.
- *   Must be called during the preparation stage, before memory is
- *  allocated
- *
- *   - Copied verbatim from saa7134-oss. Can be dropped
- *     if we just share dsp_buffer_conf from OSS.
- */
+       } else {
+               err = -EINVAL;
+       }
+       spin_unlock(&dev->slock);
 
-static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
-{
-       if (blksize < 0x100)
-               blksize = 0x100;
-       if (blksize > 0x10000)
-               blksize = 0x10000;
-
-       if (blocks < 2)
-               blocks = 2;
-       if ((blksize * blocks) > 1024*1024)
-               blocks = 1024*1024 / blksize;
-
-       dev->dmasound.blocks  = blocks;
-       dev->dmasound.blksize = blksize;
-       dev->dmasound.bufsize = blksize * blocks;
-
-       dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
-               blocks,blksize,blksize * blocks / 1024);
-       return 0;
+       return err;
 }
 
 /*
@@ -307,16 +276,16 @@ static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
  *  ALSA, but I was unable to use ALSA's own DMA, and had to force the
  *  usage of V4L's
  *
- *   - Copied verbatim from saa7134-oss. Can be dropped
- *     if we just share dsp_buffer_init from OSS.
+ *   - Copied verbatim from saa7134-oss.
+ *
  */
 
 static int dsp_buffer_init(struct saa7134_dev *dev)
 {
        int err;
 
-       if (!dev->dmasound.bufsize)
-               BUG();
+       BUG_ON(!dev->dmasound.bufsize);
+
        videobuf_dma_init(&dev->dmasound.dma);
        err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
                                       (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
@@ -325,6 +294,28 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
        return 0;
 }
 
+/*
+ * DMA buffer release
+ *
+ *   Called after closing the device, during snd_card_saa7134_capture_close
+ *
+ */
+
+static int dsp_buffer_free(struct saa7134_dev *dev)
+{
+       if (!dev->dmasound.blksize)
+               BUG();
+
+       videobuf_dma_free(&dev->dmasound.dma);
+
+       dev->dmasound.blocks  = 0;
+       dev->dmasound.blksize = 0;
+       dev->dmasound.bufsize = 0;
+
+       return 0;
+}
+
+
 /*
  * ALSA PCM preparation
  *
@@ -340,84 +331,30 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
 static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       int err, bswap, sign;
+       int bswap, sign;
        u32 fmt, control;
        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
        struct saa7134_dev *dev;
-       snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
-       unsigned int bps;
-       unsigned long size;
-       unsigned count;
-
-       size = snd_pcm_lib_buffer_bytes(substream);
-       count = snd_pcm_lib_period_bytes(substream);
-
-       saapcm->saadev->dmasound.substream = substream;
-       bps = runtime->rate * runtime->channels;
-       bps *= snd_pcm_format_width(runtime->format);
-       bps /= 8;
-       if (bps <= 0)
-               return -EINVAL;
-       saapcm->pcm_bps = bps;
-       saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream);
-       saapcm->pcm_count = snd_pcm_lib_period_bytes(substream);
-
+       snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 
-       dev=saa7134->saadev;
+       pcm->dev->dmasound.substream = substream;
 
-       dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count));
+       dev = saa7134->dev;
 
-       err = dsp_buffer_init(dev);
-       if (0 != err)
-               goto fail2;
-
-       /* prepare buffer */
-       if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
-               return err;
-       if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
-               goto fail1;
-       if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
-                                             dev->dmasound.dma.sglist,
-                                             dev->dmasound.dma.sglen,
-                                             0)))
-               goto fail2;
-
-
-
-       switch (runtime->format) {
-         case SNDRV_PCM_FORMAT_U8:
-         case SNDRV_PCM_FORMAT_S8:
+       if (snd_pcm_format_width(runtime->format) == 8)
                fmt = 0x00;
-               break;
-         case SNDRV_PCM_FORMAT_U16_LE:
-         case SNDRV_PCM_FORMAT_U16_BE:
-         case SNDRV_PCM_FORMAT_S16_LE:
-         case SNDRV_PCM_FORMAT_S16_BE:
+       else
                fmt = 0x01;
-               break;
-         default:
-               err = -EINVAL;
-               return 1;
-       }
 
-       switch (runtime->format) {
-         case SNDRV_PCM_FORMAT_S8:
-         case SNDRV_PCM_FORMAT_S16_LE:
-         case SNDRV_PCM_FORMAT_S16_BE:
+       if (snd_pcm_format_signed(runtime->format))
                sign = 1;
-               break;
-         default:
+       else
                sign = 0;
-               break;
-       }
 
-       switch (runtime->format) {
-         case SNDRV_PCM_FORMAT_U16_BE:
-         case SNDRV_PCM_FORMAT_S16_BE:
-               bswap = 1; break;
-         default:
-               bswap = 0; break;
-       }
+       if (snd_pcm_format_big_endian(runtime->format))
+               bswap = 1;
+       else
+               bswap = 0;
 
        switch (dev->pci->device) {
          case PCI_DEVICE_ID_PHILIPS_SAA7134:
@@ -445,7 +382,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
                        fmt |= 0x04;
                saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
                saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
-               //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210);
                break;
        }
 
@@ -459,12 +395,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
        if (bswap)
                control |= SAA7134_RS_CONTROL_BSWAP;
 
-       /* I should be able to use runtime->dma_addr in the control
-          byte, but it doesn't work. So I allocate the DMA using the
-          V4L functions, and force ALSA to use that as the DMA area */
-
-       runtime->dma_area = dev->dmasound.dma.vmalloc;
-
        saa_writel(SAA7134_RS_BA1(6),0);
        saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
        saa_writel(SAA7134_RS_PITCH(6),0);
@@ -473,12 +403,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
        dev->dmasound.rate = runtime->rate;
 
        return 0;
- fail2:
-       saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
- fail1:
-       videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
-       return err;
-
 
 }
 
@@ -496,10 +420,8 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
 static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
-       struct saa7134_dev *dev=saapcm->saadev;
-
-
+       snd_card_saa7134_pcm_t *pcm = runtime->private_data;
+       struct saa7134_dev *dev=pcm->dev;
 
        if (dev->dmasound.read_count) {
                dev->dmasound.read_count  -= snd_pcm_lib_period_bytes(substream);
@@ -540,9 +462,9 @@ static snd_pcm_hardware_t snd_card_saa7134_capture =
 
 static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
 {
-       snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
+       snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 
-       kfree(saapcm);
+       kfree(pcm);
 }
 
 
@@ -552,17 +474,76 @@ static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
  *   - One of the ALSA capture callbacks.
  *
  *   Called on initialization, right before the PCM preparation
- *   Usually used in ALSA to allocate the DMA, but since we don't use the
- *  ALSA DMA it does nothing
  *
  */
 
 static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
                                    snd_pcm_hw_params_t * hw_params)
 {
+       snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
+       struct saa7134_dev *dev;
+       unsigned int period_size, periods;
+       int err;
 
-       return 0;
+       period_size = params_period_bytes(hw_params);
+       periods = params_periods(hw_params);
+
+       snd_assert(period_size >= 0x100 && period_size <= 0x10000,
+                  return -EINVAL);
+       snd_assert(periods >= 2, return -EINVAL);
+       snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL);
 
+       dev = saa7134->dev;
+
+       if (dev->dmasound.blocks == periods &&
+           dev->dmasound.blksize == period_size)
+               return 0;
+
+       /* release the old buffer */
+       if (substream->runtime->dma_area) {
+               saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+               videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+               dsp_buffer_free(dev);
+               substream->runtime->dma_area = NULL;
+       }
+       dev->dmasound.blocks  = periods;
+       dev->dmasound.blksize = period_size;
+       dev->dmasound.bufsize = period_size * periods;
+
+       err = dsp_buffer_init(dev);
+       if (0 != err) {
+               dev->dmasound.blocks  = 0;
+               dev->dmasound.blksize = 0;
+               dev->dmasound.bufsize = 0;
+               return err;
+       }
+
+       if (0 != (err = videobuf_dma_pci_map(dev->pci, &dev->dmasound.dma))) {
+               dsp_buffer_free(dev);
+               return err;
+       }
+       if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) {
+               videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+               dsp_buffer_free(dev);
+               return err;
+       }
+       if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
+                                               dev->dmasound.dma.sglist,
+                                               dev->dmasound.dma.sglen,
+                                               0))) {
+               saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+               videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+               dsp_buffer_free(dev);
+               return err;
+       }
+
+       /* I should be able to use runtime->dma_addr in the control
+          byte, but it doesn't work. So I allocate the DMA using the
+          V4L functions, and force ALSA to use that as the DMA area */
+
+       substream->runtime->dma_area = dev->dmasound.dma.vmalloc;
+
+       return 1;
 
 }
 
@@ -572,33 +553,23 @@ static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
  *   - One of the ALSA capture callbacks.
  *
  *   Called after closing the device, but before snd_card_saa7134_capture_close
- *   Usually used in ALSA to free the DMA, but since we don't use the
- *  ALSA DMA I'm almost sure this isn't necessary.
+ *   It stops the DMA audio and releases the buffers.
  *
  */
 
 static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
 {
-       return 0;
-}
-
-/*
- * DMA buffer release
- *
- *   Called after closing the device, during snd_card_saa7134_capture_close
- *
- */
-
-static int dsp_buffer_free(struct saa7134_dev *dev)
-{
-       if (!dev->dmasound.blksize)
-               BUG();
+       snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
+       struct saa7134_dev *dev;
 
-       videobuf_dma_free(&dev->dmasound.dma);
+       dev = saa7134->dev;
 
-       dev->dmasound.blocks  = 0;
-       dev->dmasound.blksize = 0;
-       dev->dmasound.bufsize = 0;
+       if (substream->runtime->dma_area) {
+               saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
+               videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma);
+               dsp_buffer_free(dev);
+               substream->runtime->dma_area = NULL;
+       }
 
        return 0;
 }
@@ -608,21 +579,12 @@ static int dsp_buffer_free(struct saa7134_dev *dev)
  *
  *   - One of the ALSA capture callbacks.
  *
- *   Called after closing the device. It stops the DMA audio and releases
- *  the buffers
+ *   Called after closing the device.
  *
  */
 
 static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
 {
-       snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream);
-       struct saa7134_dev *dev = chip->saadev;
-
-       /* unlock buffer */
-       saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
-       videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
-
-       dsp_buffer_free(dev);
        return 0;
 }
 
@@ -639,29 +601,28 @@ static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
 static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_saa7134_pcm_t *saapcm;
+       snd_card_saa7134_pcm_t *pcm;
        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
-       struct saa7134_dev *dev = saa7134->saadev;
+       struct saa7134_dev *dev = saa7134->dev;
        int err;
 
        down(&dev->dmasound.lock);
 
-       dev->dmasound.afmt        = SNDRV_PCM_FORMAT_U8;
-       dev->dmasound.channels    = 2;
        dev->dmasound.read_count  = 0;
        dev->dmasound.read_offset = 0;
 
        up(&dev->dmasound.lock);
 
-       saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL);
-       if (saapcm == NULL)
+       pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
+       if (pcm == NULL)
                return -ENOMEM;
-       saapcm->saadev=saa7134->saadev;
 
-       spin_lock_init(&saapcm->lock);
+       pcm->dev=saa7134->dev;
 
-       saapcm->substream = substream;
-       runtime->private_data = saapcm;
+       spin_lock_init(&pcm->lock);
+
+       pcm->substream = substream;
+       runtime->private_data = pcm;
        runtime->private_free = snd_card_saa7134_runtime_free;
        runtime->hw = snd_card_saa7134_capture;
 
@@ -736,7 +697,6 @@ static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
 static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        int change, addr = kcontrol->private_value;
        int left, right;
 
@@ -750,12 +710,12 @@ static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
                right = 0;
        if (right > 20)
                right = 20;
-       spin_lock_irqsave(&chip->mixer_lock, flags);
+       spin_lock_irq(&chip->mixer_lock);
        change = chip->mixer_volume[addr][0] != left ||
                 chip->mixer_volume[addr][1] != right;
        chip->mixer_volume[addr][0] = left;
        chip->mixer_volume[addr][1] = right;
-       spin_unlock_irqrestore(&chip->mixer_lock, flags);
+       spin_unlock_irq(&chip->mixer_lock);
        return change;
 }
 
@@ -777,38 +737,37 @@ static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_
 static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        int addr = kcontrol->private_value;
 
-       spin_lock_irqsave(&chip->mixer_lock, flags);
+       spin_lock_irq(&chip->mixer_lock);
        ucontrol->value.integer.value[0] = chip->capture_source[addr][0];
        ucontrol->value.integer.value[1] = chip->capture_source[addr][1];
-       spin_unlock_irqrestore(&chip->mixer_lock, flags);
+       spin_unlock_irq(&chip->mixer_lock);
+
        return 0;
 }
 
 static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        int change, addr = kcontrol->private_value;
        int left, right;
        u32 anabar, xbarin;
        int analog_io, rate;
        struct saa7134_dev *dev;
 
-       dev = chip->saadev;
+       dev = chip->dev;
 
        left = ucontrol->value.integer.value[0] & 1;
        right = ucontrol->value.integer.value[1] & 1;
-       spin_lock_irqsave(&chip->mixer_lock, flags);
+       spin_lock_irq(&chip->mixer_lock);
 
        change = chip->capture_source[addr][0] != left ||
                 chip->capture_source[addr][1] != right;
        chip->capture_source[addr][0] = left;
        chip->capture_source[addr][1] = right;
        dev->dmasound.input=addr;
-       spin_unlock_irqrestore(&chip->mixer_lock, flags);
+       spin_unlock_irq(&chip->mixer_lock);
 
 
        if (change) {
@@ -898,43 +857,44 @@ static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
        return 0;
 }
 
-static int snd_saa7134_free(snd_card_saa7134_t *chip)
+static void snd_saa7134_free(snd_card_t * card)
 {
-       return 0;
-}
+       snd_card_saa7134_t *chip = card->private_data;
+
+       if (chip->dev->dmasound.priv_data == NULL)
+               return;
+
+       if (chip->irq >= 0) {
+               synchronize_irq(chip->irq);
+               free_irq(chip->irq, &chip->dev->dmasound);
+       }
+
+       chip->dev->dmasound.priv_data = NULL;
 
-static int snd_saa7134_dev_free(snd_device_t *device)
-{
-       snd_card_saa7134_t *chip = device->device_data;
-       return snd_saa7134_free(chip);
 }
 
 /*
  * ALSA initialization
  *
- *   Called by saa7134-core, it creates the basic structures and registers
- *  the ALSA devices
+ *   Called by the init routine, once for each saa7134 device present,
+ *  it creates the basic structures and registers the ALSA devices
  *
  */
 
-int alsa_card_saa7134_create (struct saa7134_dev *saadev)
+int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
 {
-       static int dev;
 
        snd_card_t *card;
        snd_card_saa7134_t *chip;
        int err;
-       static snd_device_ops_t ops = {
-               .dev_free =     snd_saa7134_dev_free,
-       };
 
 
-       if (dev >= SNDRV_CARDS)
+       if (devnum >= SNDRV_CARDS)
                return -ENODEV;
-       if (!enable[dev])
+       if (!enable[devnum])
                return -ENODEV;
 
-       card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
+       card = snd_card_new(index[devnum], id[devnum], THIS_MODULE, sizeof(snd_card_saa7134_t));
 
        if (card == NULL)
                return -ENOMEM;
@@ -943,34 +903,33 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev)
 
        /* Card "creation" */
 
-       chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
-       if (chip == NULL) {
-               return -ENOMEM;
-       }
+       card->private_free = snd_saa7134_free;
+       chip = (snd_card_saa7134_t *) card->private_data;
 
        spin_lock_init(&chip->lock);
        spin_lock_init(&chip->mixer_lock);
 
-       chip->saadev = saadev;
+       chip->dev = dev;
 
        chip->card = card;
 
-       chip->pci = saadev->pci;
-       chip->irq = saadev->pci->irq;
-       chip->iobase = pci_resource_start(saadev->pci, 0);
+       chip->pci = dev->pci;
+       chip->iobase = pci_resource_start(dev->pci, 0);
 
-       err = request_irq(saadev->pci->irq, saa7134_alsa_irq,
-                               SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev);
+
+       err = request_irq(dev->pci->irq, saa7134_alsa_irq,
+                               SA_SHIRQ | SA_INTERRUPT, dev->name,
+                               (void*) &dev->dmasound);
 
        if (err < 0) {
                printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
-                       saadev->name, saadev->pci->irq);
+                       dev->name, dev->pci->irq);
                goto __nodev;
        }
 
-       if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
-               goto __nodev;
-       }
+       chip->irq = dev->pci->irq;
+
+       init_MUTEX(&dev->dmasound.lock);
 
        if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
                goto __nodev;
@@ -984,16 +943,15 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev)
 
        strcpy(card->shortname, "SAA7134");
        sprintf(card->longname, "%s at 0x%lx irq %d",
-               chip->saadev->name, chip->iobase, chip->irq);
+               chip->dev->name, chip->iobase, chip->irq);
 
        if ((err = snd_card_register(card)) == 0) {
-               snd_saa7134_cards[dev] = card;
+               snd_saa7134_cards[devnum] = card;
                return 0;
        }
 
 __nodev:
        snd_card_free(card);
-       kfree(chip);
        return err;
 }
 
@@ -1007,21 +965,29 @@ __nodev:
 
 static int saa7134_alsa_init(void)
 {
-        struct saa7134_dev *saadev = NULL;
-        struct list_head *list;
+       struct saa7134_dev *dev = NULL;
+       struct list_head *list;
 
-       printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
+       position = 0;
 
-        list_for_each(list,&saa7134_devlist) {
-                saadev = list_entry(list, struct saa7134_dev, devlist);
-               alsa_card_saa7134_create(saadev);
-        }
+        printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
 
-       if (saadev == NULL)
+       list_for_each(list,&saa7134_devlist) {
+               dev = list_entry(list, struct saa7134_dev, devlist);
+               if (dev->dmasound.priv_data == NULL) {
+                       dev->dmasound.priv_data = dev;
+                       alsa_card_saa7134_create(dev,position);
+                       position++;
+               } else {
+                       printk(KERN_ERR "saa7134 ALSA: DMA sound is being handled by OSS. ignoring %s\n",dev->name);
+                       return -EBUSY;
+               }
+       }
+
+       if (dev == NULL)
                printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
 
        return 0;
-
 }
 
 /*
index 663d03e5bc67331fced022c7143953e93d184adc..75abc20b0ccdbdabd0fa69474df09eaaf69adf61 100644 (file)
@@ -2529,6 +2529,32 @@ struct saa7134_board saa7134_boards[] = {
                        .amux   = LINE1,
                }},
        },
+       [SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
+               .name           = "MSI TV@Anywhere plus",
+               .audio_clock    = 0x00187de7,
+               .tuner_type     = TUNER_PHILIPS_TDA8290,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .inputs = {{
+                       .name   = name_tv,
+                       .vmux   = 1,
+                       .amux   = TV,
+                       .tv     = 1,
+               },{
+                       .name   = name_comp1,
+                       .vmux   = 3,
+                       .amux   = LINE1,
+               },{
+                       .name   = name_svideo,
+                       .vmux   = 0,
+                       .amux   = LINE1,
+               }},
+               .radio = {
+                       .name   = name_radio,
+                       .amux   = LINE1,
+               },
+       },
 };
 
 const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -2969,6 +2995,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subvendor    = PCI_VENDOR_ID_PHILIPS,
                .subdevice    = 0x2018,
                .driver_data  = SAA7134_BOARD_PHILIPS_TIGER,
+       },{
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+               .subvendor    = 0x1462,
+               .subdevice    = 0x6231,
+               .driver_data  = SAA7134_BOARD_MSI_TVATANYWHERE_PLUS,
        },{
                /* --- boards without eeprom + subsystem ID --- */
                .vendor       = PCI_VENDOR_ID_PHILIPS,
index 19b88744fb31ab3f252b02aa5e5f6b458011b537..4275d2ddb8640af1e02e83b803ba917b5eda0cb1 100644 (file)
@@ -53,13 +53,13 @@ static unsigned int gpio_tracking = 0;
 module_param(gpio_tracking, int, 0644);
 MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
 
-static unsigned int oss = 0;
-module_param(oss, int, 0444);
-MODULE_PARM_DESC(oss,"register oss devices (default: no)");
-
 static unsigned int alsa = 0;
-module_param(alsa, int, 0444);
-MODULE_PARM_DESC(alsa,"register alsa devices (default: no)");
+module_param(alsa, int, 0644);
+MODULE_PARM_DESC(alsa,"enable ALSA DMA sound [dmasound]");
+
+static unsigned int oss = 0;
+module_param(oss, int, 0644);
+MODULE_PARM_DESC(oss,"enable OSS DMA sound [dmasound]");
 
 static unsigned int latency = UNSET;
 module_param(latency, int, 0444);
@@ -68,24 +68,18 @@ MODULE_PARM_DESC(latency,"pci latency timer");
 static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int vbi_nr[]   = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
-static unsigned int dsp_nr[]   = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
-static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int tuner[]    = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int card[]     = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 
 module_param_array(video_nr, int, NULL, 0444);
 module_param_array(vbi_nr,   int, NULL, 0444);
 module_param_array(radio_nr, int, NULL, 0444);
-module_param_array(dsp_nr,   int, NULL, 0444);
-module_param_array(mixer_nr, int, NULL, 0444);
 module_param_array(tuner,    int, NULL, 0444);
 module_param_array(card,     int, NULL, 0444);
 
 MODULE_PARM_DESC(video_nr, "video device number");
 MODULE_PARM_DESC(vbi_nr,   "vbi device number");
 MODULE_PARM_DESC(radio_nr, "radio device number");
-MODULE_PARM_DESC(dsp_nr,   "oss dsp device number");
-MODULE_PARM_DESC(mixer_nr, "oss mixer device number");
 MODULE_PARM_DESC(tuner,    "tuner type");
 MODULE_PARM_DESC(card,     "card type");
 
@@ -195,6 +189,7 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
 static int need_empress;
 static int need_dvb;
 static int need_alsa;
+static int need_oss;
 
 static int pending_call(struct notifier_block *self, unsigned long state,
                        void *module)
@@ -208,6 +203,8 @@ static int pending_call(struct notifier_block *self, unsigned long state,
                request_module("saa7134-dvb");
        if (need_alsa)
                request_module("saa7134-alsa");
+       if (need_oss)
+               request_module("saa7134-oss");
        return NOTIFY_DONE;
 }
 
@@ -218,10 +215,11 @@ static struct notifier_block pending_notifier = {
 
 static void request_module_depend(char *name, int *flag)
 {
+       int err;
        switch (THIS_MODULE->state) {
        case MODULE_STATE_COMING:
                if (!pending_registered) {
-                       register_module_notifier(&pending_notifier);
+                       err = register_module_notifier(&pending_notifier);
                        pending_registered = 1;
                }
                *flag = 1;
@@ -578,12 +576,14 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
                        goto out;
                }
 
-               /* If alsa support is active and we get a sound report, exit
-                  and let the saa7134-alsa module deal with it */
+               /* If dmasound support is active and we get a sound report, exit
+                  and let the saa7134-alsa/oss module deal with it */
 
-               if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && alsa)  {
+               if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
+                       (dev->dmasound.priv_data != NULL) )
+               {
                        if (irq_debug > 1)
-                               printk(KERN_DEBUG "%s/irq: ignoring interrupt for ALSA\n",
+                               printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n",
                                       dev->name);
                        goto out;
                }
@@ -609,12 +609,6 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
                    card_has_mpeg(dev))
                        saa7134_irq_ts_done(dev,status);
 
-               if ((report & SAA7134_IRQ_REPORT_DONE_RA3))  {
-                       if (oss) {
-                               saa7134_irq_oss_done(dev,status);
-                       }
-               }
-
                if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
                               SAA7134_IRQ_REPORT_GPIO18)) &&
                    dev->remote)
@@ -689,14 +683,6 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
         * audio will not work.
         */
 
-       switch (dev->pci->device) {
-       case PCI_DEVICE_ID_PHILIPS_SAA7134:
-       case PCI_DEVICE_ID_PHILIPS_SAA7133:
-       case PCI_DEVICE_ID_PHILIPS_SAA7135:
-               saa7134_oss_init1(dev);
-               break;
-       }
-
        /* enable peripheral devices */
        saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
 
@@ -728,8 +714,6 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
                irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18  |
                              SAA7134_IRQ2_INTE_GPIO18A |
                              SAA7134_IRQ2_INTE_GPIO16  );
-       else if (dev->has_remote == SAA7134_REMOTE_I2C)
-               request_module("ir-kbd-i2c");
 
        saa_writel(SAA7134_IRQ1, 0);
        saa_writel(SAA7134_IRQ2, irq2_mask);
@@ -742,13 +726,6 @@ static int saa7134_hwfini(struct saa7134_dev *dev)
 {
        dprintk("hwfini\n");
 
-       switch (dev->pci->device) {
-       case PCI_DEVICE_ID_PHILIPS_SAA7134:
-       case PCI_DEVICE_ID_PHILIPS_SAA7133:
-       case PCI_DEVICE_ID_PHILIPS_SAA7135:
-               saa7134_oss_fini(dev);
-               break;
-       }
        if (card_has_mpeg(dev))
                saa7134_ts_fini(dev);
        saa7134_input_fini(dev);
@@ -986,11 +963,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        if (card_is_dvb(dev))
                request_module_depend("saa7134-dvb",&need_dvb);
 
-       if (!oss && alsa) {
-               dprintk("Requesting ALSA module\n");
+
+       if (alsa)
                request_module_depend("saa7134-alsa",&need_alsa);
-       }
 
+       if (oss)
+               request_module_depend("saa7134-oss",&need_oss);
 
        v4l2_prio_init(&dev->prio);
 
@@ -1024,32 +1002,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
                       dev->name,dev->radio_dev->minor & 0x1f);
        }
 
-       /* register oss devices */
-       switch (dev->pci->device) {
-       case PCI_DEVICE_ID_PHILIPS_SAA7134:
-       case PCI_DEVICE_ID_PHILIPS_SAA7133:
-       case PCI_DEVICE_ID_PHILIPS_SAA7135:
-               if (oss) {
-                       err = dev->dmasound.minor_dsp =
-                               register_sound_dsp(&saa7134_dsp_fops,
-                                                  dsp_nr[dev->nr]);
-                       if (err < 0) {
-                               goto fail4;
-                       }
-                       printk(KERN_INFO "%s: registered device dsp%d\n",
-                              dev->name,dev->dmasound.minor_dsp >> 4);
-
-                       err = dev->dmasound.minor_mixer =
-                               register_sound_mixer(&saa7134_mixer_fops,
-                                                    mixer_nr[dev->nr]);
-                       if (err < 0)
-                               goto fail5;
-                       printk(KERN_INFO "%s: registered device mixer%d\n",
-                              dev->name,dev->dmasound.minor_mixer >> 4);
-               }
-               break;
-       }
-
        /* everything worked */
        pci_set_drvdata(pci_dev,dev);
        saa7134_devcount++;
@@ -1064,17 +1016,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
 
        /* check for signal */
        saa7134_irq_video_intl(dev);
+
        return 0;
 
- fail5:
-       switch (dev->pci->device) {
-       case PCI_DEVICE_ID_PHILIPS_SAA7134:
-       case PCI_DEVICE_ID_PHILIPS_SAA7133:
-       case PCI_DEVICE_ID_PHILIPS_SAA7135:
-               if (oss)
-                       unregister_sound_dsp(dev->dmasound.minor_dsp);
-               break;
-       }
  fail4:
        saa7134_unregister_video(dev);
        saa7134_i2c_unregister(dev);
@@ -1125,19 +1069,16 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
        saa7134_devcount--;
 
        saa7134_i2c_unregister(dev);
-       switch (dev->pci->device) {
-       case PCI_DEVICE_ID_PHILIPS_SAA7134:
-       case PCI_DEVICE_ID_PHILIPS_SAA7133:
-       case PCI_DEVICE_ID_PHILIPS_SAA7135:
-               if (oss) {
-                       unregister_sound_mixer(dev->dmasound.minor_mixer);
-                       unregister_sound_dsp(dev->dmasound.minor_dsp);
-               }
-               break;
-       }
        saa7134_unregister_video(dev);
 
-       /* release ressources */
+       /* the DMA sound modules should be unloaded before reaching
+          this, but just in case they are still present... */
+       if (dev->dmasound.priv_data != NULL) {
+               free_irq(pci_dev->irq, &dev->dmasound);
+               dev->dmasound.priv_data = NULL;
+       }
+
+       /* release resources */
        free_irq(pci_dev->irq, dev);
        iounmap(dev->lmmio);
        release_mem_region(pci_resource_start(pci_dev,0),
@@ -1225,7 +1166,7 @@ EXPORT_SYMBOL(saa7134_i2c_call_clients);
 EXPORT_SYMBOL(saa7134_devlist);
 EXPORT_SYMBOL(saa7134_boards);
 
-/* ----------------- For ALSA -------------------------------- */
+/* ----------------- for the DMA sound modules --------------- */
 
 EXPORT_SYMBOL(saa7134_pgtable_free);
 EXPORT_SYMBOL(saa7134_pgtable_build);
index 329accda6d45a73774bf1bf28cd90c496e3f6582..e648cc3bc96d33220527a7bd409034370ae72e4c 100644 (file)
@@ -485,64 +485,6 @@ static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
 
 };
 
-static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
-       [ 0x59 ] = KEY_MUTE,
-       [ 0x4a ] = KEY_POWER,
-
-       [ 0x18 ] = KEY_TEXT,
-       [ 0x26 ] = KEY_TV,
-       [ 0x3d ] = KEY_PRINT,
-
-       [ 0x48 ] = KEY_RED,
-       [ 0x04 ] = KEY_GREEN,
-       [ 0x11 ] = KEY_YELLOW,
-       [ 0x00 ] = KEY_BLUE,
-
-       [ 0x2d ] = KEY_VOLUMEUP,
-       [ 0x1e ] = KEY_VOLUMEDOWN,
-
-       [ 0x49 ] = KEY_MENU,
-
-       [ 0x16 ] = KEY_CHANNELUP,
-       [ 0x17 ] = KEY_CHANNELDOWN,
-
-       [ 0x20 ] = KEY_UP,
-       [ 0x21 ] = KEY_DOWN,
-       [ 0x22 ] = KEY_LEFT,
-       [ 0x23 ] = KEY_RIGHT,
-       [ 0x0d ] = KEY_SELECT,
-
-
-
-       [ 0x08 ] = KEY_BACK,
-       [ 0x07 ] = KEY_REFRESH,
-
-       [ 0x2f ] = KEY_ZOOM,
-       [ 0x29 ] = KEY_RECORD,
-
-       [ 0x4b ] = KEY_PAUSE,
-       [ 0x4d ] = KEY_REWIND,
-       [ 0x2e ] = KEY_PLAY,
-       [ 0x4e ] = KEY_FORWARD,
-       [ 0x53 ] = KEY_PREVIOUS,
-       [ 0x4c ] = KEY_STOP,
-       [ 0x54 ] = KEY_NEXT,
-
-       [ 0x69 ] = KEY_KP0,
-       [ 0x6a ] = KEY_KP1,
-       [ 0x6b ] = KEY_KP2,
-       [ 0x6c ] = KEY_KP3,
-       [ 0x6d ] = KEY_KP4,
-       [ 0x6e ] = KEY_KP5,
-       [ 0x6f ] = KEY_KP6,
-       [ 0x70 ] = KEY_KP7,
-       [ 0x71 ] = KEY_KP8,
-       [ 0x72 ] = KEY_KP9,
-
-       [ 0x74 ] = KEY_CHANNEL,
-       [ 0x0a ] = KEY_BACKSPACE,
-};
-
 /* Mapping for the 28 key remote control as seen at
    http://www.sednacomputer.com/photo/cardbus-tv.jpg
    Pavel Mihaylov <bin@bash.info> */
@@ -635,57 +577,6 @@ static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
        return 1;
 }
 
-/* The new pinnacle PCTV remote (with the colored buttons)
- *
- * Ricardo Cerqueira <v4l@cerqueira.org>
- */
-
-static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
-{
-       unsigned char b[4];
-       unsigned int start = 0,parity = 0,code = 0;
-
-       /* poll IR chip */
-       if (4 != i2c_master_recv(&ir->c,b,4)) {
-               i2cdprintk("read error\n");
-               return -EIO;
-       }
-
-       for (start = 0; start<4; start++) {
-               if (b[start] == 0x80) {
-                       code=b[(start+3)%4];
-                       parity=b[(start+2)%4];
-               }
-       }
-
-       /* Empty Request */
-       if (parity==0)
-               return 0;
-
-       /* Repeating... */
-       if (ir->old == parity)
-               return 0;
-
-
-       ir->old = parity;
-
-       /* Reduce code value to fit inside IR_KEYTAB_SIZE
-        *
-        * this is the only value that results in 42 unique
-        * codes < 128
-        */
-
-       code %= 0x88;
-
-       *ir_raw = code;
-       *ir_key = code;
-
-       i2cdprintk("Pinnacle PCTV key %02x\n", code);
-
-       return 1;
-}
-
-
 void saa7134_input_irq(struct saa7134_dev *dev)
 {
        struct saa7134_ir *ir = dev->remote;
index fd53dfcc16444eb175a03239cf922991ddf0a425..fd9ed11ab1e29c844649803003ce8dc01e8b3794 100644 (file)
@@ -4,6 +4,8 @@
  * oss dsp interface
  *
  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ *     2005 conversion to standalone module:
+ *         Ricardo Cerqueira <v4l@cerqueira.org>
  *
  *  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
@@ -25,7 +27,9 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
+#include <linux/interrupt.h>
 #include <linux/slab.h>
+#include <linux/sound.h>
 #include <linux/soundcard.h>
 
 #include "saa7134-reg.h"
 
 /* ------------------------------------------------------------------ */
 
-static unsigned int oss_debug  = 0;
-module_param(oss_debug, int, 0644);
-MODULE_PARM_DESC(oss_debug,"enable debug messages [oss]");
+static unsigned int debug  = 0;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug,"enable debug messages [oss]");
 
-static unsigned int oss_rate  = 0;
-module_param(oss_rate, int, 0444);
-MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)");
+static unsigned int rate  = 0;
+module_param(rate, int, 0444);
+MODULE_PARM_DESC(rate,"sample rate (valid are: 32000,48000)");
 
-#define dprintk(fmt, arg...)   if (oss_debug) \
+static unsigned int dsp_nr[]   = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM_DESC(dsp_nr, "device numbers for SAA7134 capture interface(s).");
+module_param_array(dsp_nr,   int, NULL, 0444);
+
+static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM_DESC(mixer_nr, "mixer numbers for SAA7134 capture interface(s).");
+module_param_array(mixer_nr, int, NULL, 0444);
+
+#define dprintk(fmt, arg...)   if (debug) \
        printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg)
 
 
@@ -369,7 +381,7 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
        int __user *p = argp;
        int val = 0;
 
-       if (oss_debug > 1)
+       if (debug > 1)
                saa7134_print_ioctl(dev->name,cmd);
        switch (cmd) {
        case OSS_GETVERSION:
@@ -665,7 +677,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
        void __user *argp = (void __user *) arg;
        int __user *p = argp;
 
-       if (oss_debug > 1)
+       if (debug > 1)
                saa7134_print_ioctl(dev->name,cmd);
        switch (cmd) {
        case OSS_GETVERSION:
@@ -768,8 +780,41 @@ struct file_operations saa7134_mixer_fops = {
 
 /* ------------------------------------------------------------------ */
 
+static irqreturn_t saa7134_oss_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+        struct saa7134_dmasound *dmasound = dev_id;
+        struct saa7134_dev *dev = dmasound->priv_data;
+        unsigned long report, status;
+        int loop, handled = 0;
+
+        for (loop = 0; loop < 10; loop++) {
+                report = saa_readl(SAA7134_IRQ_REPORT);
+                status = saa_readl(SAA7134_IRQ_STATUS);
+
+                if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
+                        handled = 1;
+                        saa_writel(SAA7134_IRQ_REPORT,report);
+                        saa7134_irq_oss_done(dev, status);
+                } else {
+                        goto out;
+                }
+        }
+
+        if (loop == 10) {
+                dprintk("error! looping IRQ!");
+        }
+out:
+        return IRQ_RETVAL(handled);
+}
+
 int saa7134_oss_init1(struct saa7134_dev *dev)
 {
+
+        if ((request_irq(dev->pci->irq, saa7134_oss_irq,
+                         SA_SHIRQ | SA_INTERRUPT, dev->name,
+                       (void*) &dev->dmasound)) < 0)
+               return -1;
+
        /* general */
        init_MUTEX(&dev->dmasound.lock);
        init_waitqueue_head(&dev->dmasound.wq);
@@ -785,8 +830,8 @@ int saa7134_oss_init1(struct saa7134_dev *dev)
 
        /* dsp */
        dev->dmasound.rate = 32000;
-       if (oss_rate)
-               dev->dmasound.rate = oss_rate;
+       if (rate)
+               dev->dmasound.rate = rate;
        dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000;
 
        /* mixer */
@@ -840,7 +885,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
        /* next block addr */
        next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
        saa_writel(reg,next_blk * dev->dmasound.blksize);
-       if (oss_debug > 2)
+       if (debug > 2)
                dprintk("irq: ok, %s, next_blk=%d, addr=%x\n",
                        (status & 0x10000000) ? "even" : "odd ", next_blk,
                        next_blk * dev->dmasound.blksize);
@@ -854,6 +899,98 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
        spin_unlock(&dev->slock);
 }
 
+int saa7134_dsp_create(struct saa7134_dev *dev)
+{
+       int err;
+
+                        err = dev->dmasound.minor_dsp =
+                                register_sound_dsp(&saa7134_dsp_fops,
+                                                   dsp_nr[dev->nr]);
+                        if (err < 0) {
+                                goto fail;
+                        }
+                        printk(KERN_INFO "%s: registered device dsp%d\n",
+                               dev->name,dev->dmasound.minor_dsp >> 4);
+
+                        err = dev->dmasound.minor_mixer =
+                                register_sound_mixer(&saa7134_mixer_fops,
+                                                     mixer_nr[dev->nr]);
+                        if (err < 0)
+                                goto fail;
+                        printk(KERN_INFO "%s: registered device mixer%d\n",
+                               dev->name,dev->dmasound.minor_mixer >> 4);
+
+       return 0;
+
+fail:
+        unregister_sound_dsp(dev->dmasound.minor_dsp);
+       return 0;
+
+
+}
+
+static int saa7134_oss_init(void)
+{
+        struct saa7134_dev *dev = NULL;
+        struct list_head *list;
+
+        printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n");
+
+        list_for_each(list,&saa7134_devlist) {
+                dev = list_entry(list, struct saa7134_dev, devlist);
+               if (dev->dmasound.priv_data == NULL) {
+                       dev->dmasound.priv_data = dev;
+                       saa7134_oss_init1(dev);
+                       saa7134_dsp_create(dev);
+               } else {
+                       printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name);
+                       return -EBUSY;
+               }
+        }
+
+        if (dev == NULL)
+                printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n");
+
+        return 0;
+
+}
+
+void saa7134_oss_exit(void)
+{
+        struct saa7134_dev *dev = NULL;
+        struct list_head *list;
+
+        list_for_each(list,&saa7134_devlist) {
+                dev = list_entry(list, struct saa7134_dev, devlist);
+
+               /* Device isn't registered by OSS, probably ALSA's */
+               if (!dev->dmasound.minor_dsp)
+                       continue;
+
+                unregister_sound_mixer(dev->dmasound.minor_mixer);
+                unregister_sound_dsp(dev->dmasound.minor_dsp);
+
+               saa7134_oss_fini(dev);
+
+               if (dev->pci->irq > 0) {
+                       synchronize_irq(dev->pci->irq);
+                       free_irq(dev->pci->irq,&dev->dmasound);
+               }
+
+               dev->dmasound.priv_data = NULL;
+
+        }
+
+        printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
+
+        return;
+}
+
+module_init(saa7134_oss_init);
+module_exit(saa7134_oss_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
+
 /* ----------------------------------------------------------- */
 /*
  * Local variables:
index fb97274716615e18f52a21537c6d865d3e0ad752..244e1973081cc2e8ca64de7638ec218423f504c0 100644 (file)
@@ -208,6 +208,7 @@ struct saa7134_format {
 #define SAA7134_BOARD_SEDNA_PC_TV_CARDBUS     79
 #define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80
 #define SAA7134_BOARD_PHILIPS_TIGER  81
+#define SAA7134_BOARD_MSI_TVATANYWHERE_PLUS  82
 
 #define SAA7134_MAXBOARDS 8
 #define SAA7134_INPUT_MAX 8
@@ -383,6 +384,7 @@ struct saa7134_dmasound {
        unsigned int               dma_blk;
        unsigned int               read_offset;
        unsigned int               read_count;
+       void *                     priv_data;
        snd_pcm_substream_t        *substream;
 };
 
index b2dfe07e9f9d7abd055df318b4b08e3567152000..61d94ddaff41f836f925a96a997266623aabb8c8 100644 (file)
@@ -437,6 +437,10 @@ static void set_audio(struct tuner *t)
                t->sgIF = 124;
                t->tda8290_easy_mode = 0x20;
                mode = "L";
+       } else if (t->std & V4L2_STD_SECAM_LC) {
+               t->sgIF = 20;
+               t->tda8290_easy_mode = 0x40;
+               mode = "LC";
        }
     tuner_dbg("setting tda8290 to system %s\n", mode);
 }
index 73c4041c35d78811f1fdd25585c6187c5ffa32b3..e58abdfcaab8bcfc5c64adf572fb55818ef785a5 100644 (file)
@@ -251,7 +251,7 @@ static inline int check_mode(struct tuner *t, char *cmd)
 
 static char pal[] = "-";
 module_param_string(pal, pal, sizeof(pal), 0644);
-static char secam[] = "-";
+static char secam[] = "--";
 module_param_string(secam, secam, sizeof(secam), 0644);
 
 /* get more precise norm info from insmod option */
@@ -307,8 +307,13 @@ static int tuner_fixup_std(struct tuner *t)
                        break;
                case 'l':
                case 'L':
-                       tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
-                       t->std = V4L2_STD_SECAM_L;
+                       if ((secam[1]=='C')||(secam[1]=='c')) {
+                               tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
+                               t->std = V4L2_STD_SECAM_LC;
+                       } else {
+                               tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
+                               t->std = V4L2_STD_SECAM_L;
+                       }
                        break;
                case '-':
                        /* default parameter, do nothing */
index d832205818f21ef94b0c0d85e4e2e016a938a5db..e0c9fdb9914a673846ba6ffb3aae3cee5d55d7c3 100644 (file)
@@ -233,7 +233,7 @@ static struct tunertype tuners[] = {
        { "Ymec TVision TVF-5533MF", Philips, NTSC,
          16*160.00,16*454.00,0x01,0x02,0x04,0x8e,732},
 
-       /* 60-68 */
+       /* 60-69 */
        { "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC,
          16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732},
        { "Tena TNF9533-D/IF/TNF9533-B/DF", Philips, PAL,
@@ -252,6 +252,8 @@ static struct tunertype tuners[] = {
          16*160.00,16*442.00,0xa1,0xa2,0xa4,0xc8,623 },
        { "Philips TUV1236D ATSC/NTSC dual in", Philips, ATSC,
          16*157.25,16*454.00,0x01,0x02,0x04,0xce,732 },
+       { "Tena TNF 5335 MF", Philips, NTSC,
+         16*157.25,16*454.00,0x01,0x02,0x04,0x8e,732 },
 };
 
 unsigned const int tuner_count = ARRAY_SIZE(tuners);
index 22f2862220048c4b0c56a09215a16344a675a1ba..a6936ad74fcf49073bc635aba17c84dd09dd262a 100644 (file)
@@ -5,6 +5,11 @@
  *
  * Based on saa7115 driver
  *
+ * Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
+ * - Cleanup
+ * - V4L2 API update
+ * - sound fixes
+ *
  * 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
@@ -31,7 +36,7 @@
 #include <media/audiochip.h>
 
 MODULE_DESCRIPTION("wm8775 driver");
-MODULE_AUTHOR("Ulf Eklund");
+MODULE_AUTHOR("Ulf Eklund, Hans Verkuil");
 MODULE_LICENSE("GPL");
 
 #define wm8775_err(fmt, arg...) do { \
index 7daa0ed7331cd9a46ee537f1939af2bf464e2b0e..1eab7cffceaa10180b79df6cd404f5146f81a189 100644 (file)
@@ -138,9 +138,8 @@ static struct mcp_ops mcp_sa11x0 = {
        .disable                = mcp_sa11x0_disable,
 };
 
-static int mcp_sa11x0_probe(struct device *dev)
+static int mcp_sa11x0_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct mcp_plat_data *data = pdev->dev.platform_data;
        struct mcp *mcp;
        int ret;
@@ -165,7 +164,7 @@ static int mcp_sa11x0_probe(struct device *dev)
        mcp->dma_telco_rd       = DMA_Ser4MCP1Rd;
        mcp->dma_telco_wr       = DMA_Ser4MCP1Wr;
 
-       dev_set_drvdata(dev, mcp);
+       platform_set_drvdata(pdev, mcp);
 
        if (machine_is_assabet()) {
                ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);
@@ -202,26 +201,26 @@ static int mcp_sa11x0_probe(struct device *dev)
 
  release:
        release_mem_region(0x80060000, 0x60);
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
  out:
        return ret;
 }
 
-static int mcp_sa11x0_remove(struct device *dev)
+static int mcp_sa11x0_remove(struct platform_device *dev)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
        mcp_host_unregister(mcp);
        release_mem_region(0x80060000, 0x60);
 
        return 0;
 }
 
-static int mcp_sa11x0_suspend(struct device *dev, pm_message_t state)
+static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
        priv(mcp)->mccr0 = Ser4MCCR0;
        priv(mcp)->mccr1 = Ser4MCCR1;
@@ -230,9 +229,9 @@ static int mcp_sa11x0_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int mcp_sa11x0_resume(struct device *dev)
+static int mcp_sa11x0_resume(struct platform_device *dev)
 {
-       struct mcp *mcp = dev_get_drvdata(dev);
+       struct mcp *mcp = platform_get_drvdata(dev);
 
        Ser4MCCR1 = priv(mcp)->mccr1;
        Ser4MCCR0 = priv(mcp)->mccr0;
@@ -243,13 +242,14 @@ static int mcp_sa11x0_resume(struct device *dev)
 /*
  * The driver for the SA11x0 MCP port.
  */
-static struct device_driver mcp_sa11x0_driver = {
-       .name           = "sa11x0-mcp",
-       .bus            = &platform_bus_type,
+static struct platform_driver mcp_sa11x0_driver = {
        .probe          = mcp_sa11x0_probe,
        .remove         = mcp_sa11x0_remove,
        .suspend        = mcp_sa11x0_suspend,
        .resume         = mcp_sa11x0_resume,
+       .driver         = {
+               .name   = "sa11x0-mcp",
+       },
 };
 
 /*
@@ -257,12 +257,12 @@ static struct device_driver mcp_sa11x0_driver = {
  */
 static int __init mcp_sa11x0_init(void)
 {
-       return driver_register(&mcp_sa11x0_driver);
+       return platform_driver_register(&mcp_sa11x0_driver);
 }
 
 static void __exit mcp_sa11x0_exit(void)
 {
-       driver_unregister(&mcp_sa11x0_driver);
+       platform_driver_unregister(&mcp_sa11x0_driver);
 }
 
 module_init(mcp_sa11x0_init);
index bc2b72b3290547dce8a0a0214f542e105bdeac73..11a801be71c88f9b39cd04c41336fdf1c25d6ee0 100644 (file)
@@ -26,8 +26,8 @@
 
 #define SKY_CPUSTATE_VERSION           "1.1"
 
-static int hdpu_cpustate_probe(struct device *ddev);
-static int hdpu_cpustate_remove(struct device *ddev);
+static int hdpu_cpustate_probe(struct platform_device *pdev);
+static int hdpu_cpustate_remove(struct platform_device *pdev);
 
 struct cpustate_t cpustate;
 
@@ -158,11 +158,12 @@ static int cpustate_read_proc(char *page, char **start, off_t off,
        return len;
 }
 
-static struct device_driver hdpu_cpustate_driver = {
-       .name = HDPU_CPUSTATE_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver hdpu_cpustate_driver = {
        .probe = hdpu_cpustate_probe,
        .remove = hdpu_cpustate_remove,
+       .driver = {
+               .name = HDPU_CPUSTATE_NAME,
+       },
 };
 
 /*
@@ -187,9 +188,8 @@ static struct miscdevice cpustate_dev = {
        &cpustate_fops
 };
 
-static int hdpu_cpustate_probe(struct device *ddev)
+static int hdpu_cpustate_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
        struct proc_dir_entry *proc_de;
        int ret;
@@ -217,7 +217,7 @@ static int hdpu_cpustate_probe(struct device *ddev)
        return 0;
 }
 
-static int hdpu_cpustate_remove(struct device *ddev)
+static int hdpu_cpustate_remove(struct platform_device *pdev)
 {
 
        cpustate.set_addr = NULL;
@@ -232,13 +232,13 @@ static int hdpu_cpustate_remove(struct device *ddev)
 static int __init cpustate_init(void)
 {
        int rc;
-       rc = driver_register(&hdpu_cpustate_driver);
+       rc = platform_driver_register(&hdpu_cpustate_driver);
        return rc;
 }
 
 static void __exit cpustate_exit(void)
 {
-       driver_unregister(&hdpu_cpustate_driver);
+       platform_driver_unregister(&hdpu_cpustate_driver);
 }
 
 module_init(cpustate_init);
index 4bb461793851c0d704b8ac320a000571051f10ac..ea9d5f233c83037568350a82224d5870bda6a7ba 100644 (file)
 
 #include <linux/platform_device.h>
 
-static int hdpu_nexus_probe(struct device *ddev);
-static int hdpu_nexus_remove(struct device *ddev);
+static int hdpu_nexus_probe(struct platform_device *pdev);
+static int hdpu_nexus_remove(struct platform_device *pdev);
 
 static struct proc_dir_entry *hdpu_slot_id;
 static struct proc_dir_entry *hdpu_chassis_id;
 static int slot_id = -1;
 static int chassis_id = -1;
 
-static struct device_driver hdpu_nexus_driver = {
-       .name = HDPU_NEXUS_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver hdpu_nexus_driver = {
        .probe = hdpu_nexus_probe,
        .remove = hdpu_nexus_remove,
+       .driver = {
+               .name = HDPU_NEXUS_NAME,
+       },
 };
 
 int hdpu_slot_id_read(char *buffer, char **buffer_location, off_t offset,
@@ -55,9 +56,8 @@ int hdpu_chassis_id_read(char *buffer, char **buffer_location, off_t offset,
        return sprintf(buffer, "%d\n", chassis_id);
 }
 
-static int hdpu_nexus_probe(struct device *ddev)
+static int hdpu_nexus_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -80,7 +80,7 @@ static int hdpu_nexus_probe(struct device *ddev)
        return 0;
 }
 
-static int hdpu_nexus_remove(struct device *ddev)
+static int hdpu_nexus_remove(struct platform_device *pdev)
 {
        slot_id = -1;
        chassis_id = -1;
@@ -94,13 +94,13 @@ static int hdpu_nexus_remove(struct device *ddev)
 static int __init nexus_init(void)
 {
        int rc;
-       rc = driver_register(&hdpu_nexus_driver);
+       rc = platform_driver_register(&hdpu_nexus_driver);
        return rc;
 }
 
 static void __exit nexus_exit(void)
 {
-       driver_unregister(&hdpu_nexus_driver);
+       platform_driver_unregister(&hdpu_nexus_driver);
 }
 
 module_init(nexus_init);
index 1e6bdba2675639568443cc1afb7ca5e603ae151a..166c9b0ad04ef7a43be4e63f6f5e66483cbdd80a 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <asm/div64.h>
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/scatterlist.h>
 #include <asm/sizes.h>
 #include <asm/hardware/amba.h>
index f31e247b2cbeabf479c912ae896453db70278935..ee8f8a0420d1c7d16c164d65746f9c9411141892 100644 (file)
@@ -428,9 +428,8 @@ static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs)
        return IRQ_HANDLED;
 }
 
-static int pxamci_probe(struct device *dev)
+static int pxamci_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct mmc_host *mmc;
        struct pxamci_host *host = NULL;
        struct resource *r;
@@ -445,7 +444,7 @@ static int pxamci_probe(struct device *dev)
        if (!r)
                return -EBUSY;
 
-       mmc = mmc_alloc_host(sizeof(struct pxamci_host), dev);
+       mmc = mmc_alloc_host(sizeof(struct pxamci_host), &pdev->dev);
        if (!mmc) {
                ret = -ENOMEM;
                goto out;
@@ -474,7 +473,7 @@ static int pxamci_probe(struct device *dev)
                         host->pdata->ocr_mask :
                         MMC_VDD_32_33|MMC_VDD_33_34;
 
-       host->sg_cpu = dma_alloc_coherent(dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL);
+       host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL);
        if (!host->sg_cpu) {
                ret = -ENOMEM;
                goto out;
@@ -511,10 +510,10 @@ static int pxamci_probe(struct device *dev)
        if (ret)
                goto out;
 
-       dev_set_drvdata(dev, mmc);
+       platform_set_drvdata(pdev, mmc);
 
        if (host->pdata && host->pdata->init)
-               host->pdata->init(dev, pxamci_detect_irq, mmc);
+               host->pdata->init(&pdev->dev, pxamci_detect_irq, mmc);
 
        mmc_add_host(mmc);
 
@@ -527,7 +526,7 @@ static int pxamci_probe(struct device *dev)
                if (host->base)
                        iounmap(host->base);
                if (host->sg_cpu)
-                       dma_free_coherent(dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
+                       dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
        }
        if (mmc)
                mmc_free_host(mmc);
@@ -535,17 +534,17 @@ static int pxamci_probe(struct device *dev)
        return ret;
 }
 
-static int pxamci_remove(struct device *dev)
+static int pxamci_remove(struct platform_device *pdev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (mmc) {
                struct pxamci_host *host = mmc_priv(mmc);
 
                if (host->pdata && host->pdata->exit)
-                       host->pdata->exit(dev, mmc);
+                       host->pdata->exit(&pdev->dev, mmc);
 
                mmc_remove_host(mmc);
 
@@ -560,7 +559,7 @@ static int pxamci_remove(struct device *dev)
                free_irq(host->irq, host);
                pxa_free_dma(host->dma);
                iounmap(host->base);
-               dma_free_coherent(dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
+               dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
 
                release_resource(host->res);
 
@@ -570,9 +569,9 @@ static int pxamci_remove(struct device *dev)
 }
 
 #ifdef CONFIG_PM
-static int pxamci_suspend(struct device *dev, pm_message_t state)
+static int pxamci_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
        if (mmc)
@@ -581,9 +580,9 @@ static int pxamci_suspend(struct device *dev, pm_message_t state)
        return ret;
 }
 
-static int pxamci_resume(struct device *dev)
+static int pxamci_resume(struct platform_device *dev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
        if (mmc)
@@ -596,23 +595,24 @@ static int pxamci_resume(struct device *dev)
 #define pxamci_resume  NULL
 #endif
 
-static struct device_driver pxamci_driver = {
-       .name           = DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver pxamci_driver = {
        .probe          = pxamci_probe,
        .remove         = pxamci_remove,
        .suspend        = pxamci_suspend,
        .resume         = pxamci_resume,
+       .driver         = {
+               .name   = DRIVER_NAME,
+       },
 };
 
 static int __init pxamci_init(void)
 {
-       return driver_register(&pxamci_driver);
+       return platform_driver_register(&pxamci_driver);
 }
 
 static void __exit pxamci_exit(void)
 {
-       driver_unregister(&pxamci_driver);
+       platform_driver_unregister(&pxamci_driver);
 }
 
 module_init(pxamci_init);
index e954b8354fef74f3e7f8d6a9dabdfef7814a9c95..c7eb7c269081860303ce07f95369a29e0f30e2e3 100644 (file)
@@ -42,7 +42,7 @@
 #include "wbsd.h"
 
 #define DRIVER_NAME "wbsd"
-#define DRIVER_VERSION "1.4"
+#define DRIVER_VERSION "1.5"
 
 #ifdef CONFIG_MMC_DEBUG
 #define DBG(x...) \
@@ -1932,14 +1932,14 @@ static void __devexit wbsd_shutdown(struct device* dev, int pnp)
  * Non-PnP
  */
 
-static int __devinit wbsd_probe(struct device* dev)
+static int __devinit wbsd_probe(struct platform_device* dev)
 {
-       return wbsd_init(dev, io, irq, dma, 0);
+       return wbsd_init(&dev->dev, io, irq, dma, 0);
 }
 
-static int __devexit wbsd_remove(struct device* dev)
+static int __devexit wbsd_remove(struct platform_device* dev)
 {
-       wbsd_shutdown(dev, 0);
+       wbsd_shutdown(&dev->dev, 0);
 
        return 0;
 }
@@ -1983,9 +1983,9 @@ static void __devexit wbsd_pnp_remove(struct pnp_dev * dev)
 
 #ifdef CONFIG_PM
 
-static int wbsd_suspend(struct device *dev, pm_message_t state)
+static int wbsd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
        int ret;
 
@@ -2005,9 +2005,9 @@ static int wbsd_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int wbsd_resume(struct device *dev)
+static int wbsd_resume(struct platform_device *dev)
 {
-       struct mmc_host *mmc = dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
 
        if (!mmc)
@@ -2038,14 +2038,15 @@ static int wbsd_resume(struct device *dev)
 
 static struct platform_device *wbsd_device;
 
-static struct device_driver wbsd_driver = {
-       .name           = DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver wbsd_driver = {
        .probe          = wbsd_probe,
-       .remove         = wbsd_remove,
+       .remove         = __devexit_p(wbsd_remove),
 
        .suspend        = wbsd_suspend,
        .resume         = wbsd_resume,
+       .driver         = {
+               .name   = DRIVER_NAME,
+       },
 };
 
 #ifdef CONFIG_PNP
@@ -2054,7 +2055,7 @@ static struct pnp_driver wbsd_pnp_driver = {
        .name           = DRIVER_NAME,
        .id_table       = pnp_dev_table,
        .probe          = wbsd_pnp_probe,
-       .remove         = wbsd_pnp_remove,
+       .remove         = __devexit_p(wbsd_pnp_remove),
 };
 
 #endif /* CONFIG_PNP */
@@ -2085,7 +2086,7 @@ static int __init wbsd_drv_init(void)
 
        if (nopnp)
        {
-               result = driver_register(&wbsd_driver);
+               result = platform_driver_register(&wbsd_driver);
                if (result < 0)
                        return result;
 
@@ -2111,7 +2112,7 @@ static void __exit wbsd_drv_exit(void)
        {
                platform_device_unregister(wbsd_device);
 
-               driver_unregister(&wbsd_driver);
+               platform_driver_unregister(&wbsd_driver);
        }
 
        DBG("unloaded\n");
@@ -2127,6 +2128,7 @@ module_param(irq, uint, 0444);
 module_param(dma, int, 0444);
 
 MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>");
 MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver");
 MODULE_VERSION(DRIVER_VERSION);
 
index 48638c8097a56b9204bcec9dad9019121b681d40..846a533323a8ee845da72d8299b6425f6a47ffcd 100644 (file)
@@ -94,7 +94,7 @@ config MTD_NETSC520
 
 config MTD_TS5500
        tristate "JEDEC Flash device mapped on Technologic Systems TS-5500"
-       depends on ELAN
+       depends on X86
        select MTD_PARTITIONS
        select MTD_JEDECPROBE
        select MTD_CFI_AMDSTD
index b7858eb935347acb767d2961de8896027b4b1674..51f962dd7e31c42054850e3344326f69acbf2752 100644 (file)
@@ -63,11 +63,6 @@ struct bast_flash_info {
 
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 
-static struct bast_flash_info *to_bast_info(struct device *dev)
-{
-       return (struct bast_flash_info *)dev_get_drvdata(dev);
-}
-
 static void bast_flash_setrw(int to)
 {
        unsigned int val;
@@ -87,11 +82,11 @@ static void bast_flash_setrw(int to)
        local_irq_restore(flags);
 }
 
-static int bast_flash_remove(struct device *dev)
+static int bast_flash_remove(struct platform_device *pdev)
 {
-       struct bast_flash_info *info = to_bast_info(dev);
+       struct bast_flash_info *info = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info == NULL)
                return 0;
@@ -116,9 +111,8 @@ static int bast_flash_remove(struct device *dev)
        return 0;
 }
 
-static int bast_flash_probe(struct device *dev)
+static int bast_flash_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct bast_flash_info *info;
        struct resource *res;
        int err = 0;
@@ -131,13 +125,13 @@ static int bast_flash_probe(struct device *dev)
        }
 
        memzero(info, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
        res = pdev->resource;  /* assume that the flash has one resource */
 
        info->map.phys = res->start;
        info->map.size = res->end - res->start + 1;
-       info->map.name = dev->bus_id;
+       info->map.name = pdev->dev.bus_id;      
        info->map.bankwidth = 2;
 
        if (info->map.size > AREA_MAXSIZE)
@@ -199,27 +193,28 @@ static int bast_flash_probe(struct device *dev)
        /* fall through to exit error */
 
  exit_error:
-       bast_flash_remove(dev);
+       bast_flash_remove(pdev);
        return err;
 }
 
-static struct device_driver bast_flash_driver = {
-       .name           = "bast-nor",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver bast_flash_driver = {
        .probe          = bast_flash_probe,
        .remove         = bast_flash_remove,
+       .driver         = {
+               .name   = "bast-nor",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init bast_flash_init(void)
 {
        printk("BAST NOR-Flash Driver, (c) 2004 Simtec Electronics\n");
-       return driver_register(&bast_flash_driver);
+       return platform_driver_register(&bast_flash_driver);
 }
 
 static void __exit bast_flash_exit(void)
 {
-       driver_unregister(&bast_flash_driver);
+       platform_driver_unregister(&bast_flash_driver);
 }
 
 module_init(bast_flash_init);
index fe738fd8d6f89f068910a82cd636a4bb431eb4c9..a3ba52fbd86835968bc01a3c9ffe053641265d25 100644 (file)
@@ -67,9 +67,8 @@ static void armflash_set_vpp(struct map_info *map, int on)
 
 static const char *probes[] = { "cmdlinepart", "RedBoot", "afs", NULL };
 
-static int armflash_probe(struct device *_dev)
+static int armflash_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
        struct resource *res = dev->resource;
        unsigned int size = res->end - res->start + 1;
@@ -138,7 +137,7 @@ static int armflash_probe(struct device *_dev)
        }
 
        if (err == 0)
-               dev_set_drvdata(&dev->dev, info);
+               platform_set_drvdata(dev, info);
 
        /*
         * If we got an error, free all resources.
@@ -163,12 +162,11 @@ static int armflash_probe(struct device *_dev)
        return err;
 }
 
-static int armflash_remove(struct device *_dev)
+static int armflash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-       struct armflash_info *info = dev_get_drvdata(&dev->dev);
+       struct armflash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (info) {
                if (info->mtd) {
@@ -190,21 +188,22 @@ static int armflash_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver armflash_driver = {
-       .name           = "armflash",
-       .bus            = &platform_bus_type,
+static struct platform_driver armflash_driver = {
        .probe          = armflash_probe,
        .remove         = armflash_remove,
+       .driver         = {
+               .name   = "armflash",
+       },
 };
 
 static int __init armflash_init(void)
 {
-       return driver_register(&armflash_driver);
+       return platform_driver_register(&armflash_driver);
 }
 
 static void __exit armflash_exit(void)
 {
-       driver_unregister(&armflash_driver);
+       platform_driver_unregister(&armflash_driver);
 }
 
 module_init(armflash_init);
index 641eb2b55e9f4733b6cbc1d8ad8ef8e21e05b962..fc7a78e31735bc4ea35f56f9a34480e79aa23101 100644 (file)
@@ -111,13 +111,12 @@ static void ixp2000_flash_copy_to(struct map_info *map, unsigned long to,
 }
 
 
-static int ixp2000_flash_remove(struct device *_dev)
+static int ixp2000_flash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
-       struct ixp2000_flash_info *info = dev_get_drvdata(&dev->dev);
+       struct ixp2000_flash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if(!info)
                return 0;
@@ -143,10 +142,9 @@ static int ixp2000_flash_remove(struct device *_dev)
 }
 
 
-static int ixp2000_flash_probe(struct device *_dev)
+static int ixp2000_flash_probe(struct platform_device *dev)
 {
        static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
-       struct platform_device *dev = to_platform_device(_dev);
        struct ixp2000_flash_data *ixp_data = dev->dev.platform_data;
        struct flash_platform_data *plat;
        struct ixp2000_flash_info *info;
@@ -177,7 +175,7 @@ static int ixp2000_flash_probe(struct device *_dev)
        }
        memzero(info, sizeof(struct ixp2000_flash_info));
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /*
         * Tell the MTD layer we're not 1:1 mapped so that it does
@@ -248,25 +246,26 @@ static int ixp2000_flash_probe(struct device *_dev)
        return 0;
 
 Error:
-       ixp2000_flash_remove(_dev);
+       ixp2000_flash_remove(dev);
        return err;
 }
 
-static struct device_driver ixp2000_flash_driver = {
-       .name           = "IXP2000-Flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp2000_flash_driver = {
        .probe          = &ixp2000_flash_probe,
        .remove         = &ixp2000_flash_remove
+       .driver         = {
+               .name   = "IXP2000-Flash",
+       },
 };
 
 static int __init ixp2000_flash_init(void)
 {
-       return driver_register(&ixp2000_flash_driver);
+       return platform_driver_register(&ixp2000_flash_driver);
 }
 
 static void __exit ixp2000_flash_exit(void)
 {
-       driver_unregister(&ixp2000_flash_driver);
+       platform_driver_unregister(&ixp2000_flash_driver);
 }
 
 module_init(ixp2000_flash_init);
index 56b3a355bf7b83f934a77eeca368b2cdfa25d96c..a59f8027903c5d632975bbb28e23ad91f369b35f 100644 (file)
@@ -99,13 +99,12 @@ struct ixp4xx_flash_info {
 
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 
-static int ixp4xx_flash_remove(struct device *_dev)
+static int ixp4xx_flash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
-       struct ixp4xx_flash_info *info = dev_get_drvdata(&dev->dev);
+       struct ixp4xx_flash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if(!info)
                return 0;
@@ -130,9 +129,8 @@ static int ixp4xx_flash_remove(struct device *_dev)
        return 0;
 }
 
-static int ixp4xx_flash_probe(struct device *_dev)
+static int ixp4xx_flash_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
        struct ixp4xx_flash_info *info;
        int err = -1;
@@ -153,7 +151,7 @@ static int ixp4xx_flash_probe(struct device *_dev)
        }
        memzero(info, sizeof(struct ixp4xx_flash_info));
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /*
         * Tell the MTD layer we're not 1:1 mapped so that it does
@@ -214,25 +212,26 @@ static int ixp4xx_flash_probe(struct device *_dev)
        return 0;
 
 Error:
-       ixp4xx_flash_remove(_dev);
+       ixp4xx_flash_remove(dev);
        return err;
 }
 
-static struct device_driver ixp4xx_flash_driver = {
-       .name           = "IXP4XX-Flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver ixp4xx_flash_driver = {
        .probe          = ixp4xx_flash_probe,
        .remove         = ixp4xx_flash_remove,
+       .driver         = {
+               .name   = "IXP4XX-Flash",
+       },
 };
 
 static int __init ixp4xx_flash_init(void)
 {
-       return driver_register(&ixp4xx_flash_driver);
+       return platform_driver_register(&ixp4xx_flash_driver);
 }
 
 static void __exit ixp4xx_flash_exit(void)
 {
-       driver_unregister(&ixp4xx_flash_driver);
+       platform_driver_unregister(&ixp4xx_flash_driver);
 }
 
 
index fd3b4a5fc2072653a6f2c919d5c9984004a87a04..418afffb2d8026bd85fea3270895f067a7fca4b0 100644 (file)
@@ -70,11 +70,10 @@ static void omap_set_vpp(struct map_info *map, int enable)
        }
 }
 
-static int __devinit omapflash_probe(struct device *dev)
+static int __devinit omapflash_probe(struct platform_device *pdev)
 {
        int err;
        struct omapflash_info *info;
-       struct platform_device *pdev = to_platform_device(dev);
        struct flash_platform_data *pdata = pdev->dev.platform_data;
        struct resource *res = pdev->resource;
        unsigned long size = res->end - res->start + 1;
@@ -119,7 +118,7 @@ static int __devinit omapflash_probe(struct device *dev)
 #endif
                add_mtd_device(info->mtd);
 
-       dev_set_drvdata(&pdev->dev, info);
+       platform_set_drvdata(pdev, info);
 
        return 0;
 
@@ -133,12 +132,11 @@ out_free_info:
        return err;
 }
 
-static int __devexit omapflash_remove(struct device *dev)
+static int __devexit omapflash_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct omapflash_info *info = dev_get_drvdata(&pdev->dev);
+       struct omapflash_info *info = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(&pdev->dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info) {
                if (info->parts) {
@@ -155,21 +153,22 @@ static int __devexit omapflash_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver omapflash_driver = {
-       .name   = "omapflash",
-       .bus    = &platform_bus_type,
+static struct platform_driver omapflash_driver = {
        .probe  = omapflash_probe,
        .remove = __devexit_p(omapflash_remove),
+       .driver = {
+               .name   = "omapflash",
+       },
 };
 
 static int __init omapflash_init(void)
 {
-       return driver_register(&omapflash_driver);
+       return platform_driver_register(&omapflash_driver);
 }
 
 static void __exit omapflash_exit(void)
 {
-       driver_unregister(&omapflash_driver);
+       platform_driver_unregister(&omapflash_driver);
 }
 
 module_init(omapflash_init);
index a02eed94a231ecbf39686d2db1733b65a3fdfd4c..5d3c75451ca292afb002d6f817f5c7e6bc3c4569 100644 (file)
@@ -56,9 +56,9 @@ struct platram_info {
  * device private data to struct platram_info conversion
 */
 
-static inline struct platram_info *to_platram_info(struct device *dev)
+static inline struct platram_info *to_platram_info(struct platform_device *dev)
 {
-       return (struct platram_info *)dev_get_drvdata(dev);
+       return (struct platram_info *)platform_get_drvdata(dev);
 }
 
 /* platram_setrw
@@ -83,13 +83,13 @@ static inline void platram_setrw(struct platram_info *info, int to)
  * called to remove the device from the driver's control
 */
 
-static int platram_remove(struct device *dev)
+static int platram_remove(struct platform_device *pdev)
 {
-       struct platram_info *info = to_platram_info(dev);
+       struct platram_info *info = to_platram_info(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
-       dev_dbg(dev, "removing device\n");
+       dev_dbg(&pdev->dev, "removing device\n");
 
        if (info == NULL)
                return 0;
@@ -130,61 +130,60 @@ static int platram_remove(struct device *dev)
  * driver is found.
 */
 
-static int platram_probe(struct device *dev)
+static int platram_probe(struct platform_device *pdev)
 {
-       struct platform_device *pd = to_platform_device(dev);
        struct platdata_mtd_ram *pdata;
        struct platram_info *info;
        struct resource *res;
        int err = 0;
 
-       dev_dbg(dev, "probe entered\n");
+       dev_dbg(&pdev->dev, "probe entered\n");
 
-       if (dev->platform_data == NULL) {
-               dev_err(dev, "no platform data supplied\n");
+       if (pdev->dev.platform_data == NULL) {
+               dev_err(&pdev->dev, "no platform data supplied\n");
                err = -ENOENT;
                goto exit_error;
        }
 
-       pdata = dev->platform_data;
+       pdata = pdev->dev.platform_data;
 
        info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL) {
-               dev_err(dev, "no memory for flash info\n");
+               dev_err(&pdev->dev, "no memory for flash info\n");
                err = -ENOMEM;
                goto exit_error;
        }
 
        memset(info, 0, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       info->dev = dev;
+       info->dev = &pdev->dev;
        info->pdata = pdata;
 
        /* get the resource for the memory mapping */
 
-       res = platform_get_resource(pd, IORESOURCE_MEM, 0);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        if (res == NULL) {
-               dev_err(dev, "no memory resource specified\n");
+               dev_err(&pdev->dev, "no memory resource specified\n");
                err = -ENOENT;
                goto exit_free;
        }
 
-       dev_dbg(dev, "got platform resource %p (0x%lx)\n", res, res->start);
+       dev_dbg(&pdev->dev, "got platform resource %p (0x%lx)\n", res, res->start);
 
        /* setup map parameters */
 
        info->map.phys = res->start;
        info->map.size = (res->end - res->start) + 1;
-       info->map.name = pdata->mapname != NULL ? pdata->mapname : (char *)pd->name;
+       info->map.name = pdata->mapname != NULL ? pdata->mapname : (char *)pdev->name;
        info->map.bankwidth = pdata->bankwidth;
 
        /* register our usage of the memory area */
 
-       info->area = request_mem_region(res->start, info->map.size, pd->name);
+       info->area = request_mem_region(res->start, info->map.size, pdev->name);
        if (info->area == NULL) {
-               dev_err(dev, "failed to request memory region\n");
+               dev_err(&pdev->dev, "failed to request memory region\n");
                err = -EIO;
                goto exit_free;
        }
@@ -192,23 +191,23 @@ static int platram_probe(struct device *dev)
        /* remap the memory area */
 
        info->map.virt = ioremap(res->start, info->map.size);
-       dev_dbg(dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
+       dev_dbg(&pdev->dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
 
        if (info->map.virt == NULL) {
-               dev_err(dev, "failed to ioremap() region\n");
+               dev_err(&pdev->dev, "failed to ioremap() region\n");
                err = -EIO;
                goto exit_free;
        }
 
        simple_map_init(&info->map);
 
-       dev_dbg(dev, "initialised map, probing for mtd\n");
+       dev_dbg(&pdev->dev, "initialised map, probing for mtd\n");
 
        /* probe for the right mtd map driver */
 
        info->mtd = do_map_probe("map_ram" , &info->map);
        if (info->mtd == NULL) {
-               dev_err(dev, "failed to probe for map_ram\n");
+               dev_err(&pdev->dev, "failed to probe for map_ram\n");
                err = -ENOMEM;
                goto exit_free;
        }
@@ -237,27 +236,28 @@ static int platram_probe(struct device *dev)
 #endif /* CONFIG_MTD_PARTITIONS */
 
        if (add_mtd_device(info->mtd)) {
-               dev_err(dev, "add_mtd_device() failed\n");
+               dev_err(&pdev->dev, "add_mtd_device() failed\n");
                err = -ENOMEM;
        }
 
-       dev_info(dev, "registered mtd device\n");
+       dev_info(&pdev->dev, "registered mtd device\n");
        return err;
 
  exit_free:
-       platram_remove(dev);
+       platram_remove(pdev);
  exit_error:
        return err;
 }
 
 /* device driver info */
 
-static struct device_driver platram_driver = {
-       .name           = "mtd-ram",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver platram_driver = {
        .probe          = platram_probe,
        .remove         = platram_remove,
+       .driver         = {
+               .name   = "mtd-ram",
+               .owner  = THIS_MODULE,
+       },
 };
 
 /* module init/exit */
@@ -265,12 +265,12 @@ static struct device_driver platram_driver = {
 static int __init platram_init(void)
 {
        printk("Generic platform RAM MTD, (c) 2004 Simtec Electronics\n");
-       return driver_register(&platram_driver);
+       return platform_driver_register(&platram_driver);
 }
 
 static void __exit platram_exit(void)
 {
-       driver_unregister(&platram_driver);
+       platform_driver_unregister(&platram_driver);
 }
 
 module_init(platram_init);
index 9e8bb1782be00318ab3eb58264ccf087e3761c8d..5cefb015633ce896e2a08dc75269c93169496573 100644 (file)
@@ -356,9 +356,8 @@ sa1100_setup_mtd(struct platform_device *pdev, struct flash_platform_data *plat)
 
 static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
-static int __init sa1100_mtd_probe(struct device *dev)
+static int __init sa1100_mtd_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct flash_platform_data *plat = pdev->dev.platform_data;
        struct mtd_partition *parts;
        const char *part_type = NULL;
@@ -402,28 +401,28 @@ static int __init sa1100_mtd_probe(struct device *dev)
 
        info->nr_parts = nr_parts;
 
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
        err = 0;
 
  out:
        return err;
 }
 
-static int __exit sa1100_mtd_remove(struct device *dev)
+static int __exit sa1100_mtd_remove(struct platform_device *pdev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
-       struct flash_platform_data *plat = dev->platform_data;
+       struct sa_info *info = platform_get_drvdata(pdev);
+       struct flash_platform_data *plat = pdev->dev.platform_data;
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        sa1100_destroy(info, plat);
 
        return 0;
 }
 
 #ifdef CONFIG_PM
-static int sa1100_mtd_suspend(struct device *dev, pm_message_t state)
+static int sa1100_mtd_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        int ret = 0;
 
        if (info)
@@ -432,17 +431,17 @@ static int sa1100_mtd_suspend(struct device *dev, pm_message_t state)
        return ret;
 }
 
-static int sa1100_mtd_resume(struct device *dev)
+static int sa1100_mtd_resume(struct platform_device *dev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        if (info)
                info->mtd->resume(info->mtd);
        return 0;
 }
 
-static void sa1100_mtd_shutdown(struct device *dev)
+static void sa1100_mtd_shutdown(struct platform_device *dev)
 {
-       struct sa_info *info = dev_get_drvdata(dev);
+       struct sa_info *info = platform_get_drvdata(dev);
        if (info && info->mtd->suspend(info->mtd) == 0)
                info->mtd->resume(info->mtd);
 }
@@ -452,24 +451,25 @@ static void sa1100_mtd_shutdown(struct device *dev)
 #define sa1100_mtd_shutdown NULL
 #endif
 
-static struct device_driver sa1100_mtd_driver = {
-       .name           = "flash",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100_mtd_driver = {
        .probe          = sa1100_mtd_probe,
        .remove         = __exit_p(sa1100_mtd_remove),
        .suspend        = sa1100_mtd_suspend,
        .resume         = sa1100_mtd_resume,
        .shutdown       = sa1100_mtd_shutdown,
+       .driver         = {
+               .name   = "flash",
+       },
 };
 
 static int __init sa1100_mtd_init(void)
 {
-       return driver_register(&sa1100_mtd_driver);
+       return platform_driver_register(&sa1100_mtd_driver);
 }
 
 static void __exit sa1100_mtd_exit(void)
 {
-       driver_unregister(&sa1100_mtd_driver);
+       platform_driver_unregister(&sa1100_mtd_driver);
 }
 
 module_init(sa1100_mtd_init);
index 97e9b7892d29dfce8f5eab6f724b85f9740940ed..d209214b1318b451e9680c629b3db767438c51b0 100644 (file)
@@ -125,14 +125,14 @@ static struct s3c2410_nand_info *s3c2410_nand_mtd_toinfo(struct mtd_info *mtd)
        return s3c2410_nand_mtd_toours(mtd)->info;
 }
 
-static struct s3c2410_nand_info *to_nand_info(struct device *dev)
+static struct s3c2410_nand_info *to_nand_info(struct platform_device *dev)
 {
-       return dev_get_drvdata(dev);
+       return platform_get_drvdata(dev);
 }
 
-static struct s3c2410_platform_nand *to_nand_plat(struct device *dev)
+static struct s3c2410_platform_nand *to_nand_plat(struct platform_device *dev)
 {
-       return dev->platform_data;
+       return dev->dev.platform_data;
 }
 
 /* timing calculations */
@@ -165,9 +165,9 @@ static int s3c2410_nand_calc_rate(int wanted, unsigned long clk, int max)
 /* controller setup */
 
 static int s3c2410_nand_inithw(struct s3c2410_nand_info *info,
-                              struct device *dev)
+                              struct platform_device *pdev)
 {
-       struct s3c2410_platform_nand *plat = to_nand_plat(dev);
+       struct s3c2410_platform_nand *plat = to_nand_plat(pdev);
        unsigned long clkrate = clk_get_rate(info->clk);
        int tacls, twrph0, twrph1;
        unsigned long cfg;
@@ -430,11 +430,11 @@ static void s3c2410_nand_write_buf(struct mtd_info *mtd,
 
 /* device management functions */
 
-static int s3c2410_nand_remove(struct device *dev)
+static int s3c2410_nand_remove(struct platform_device *pdev)
 {
-       struct s3c2410_nand_info *info = to_nand_info(dev);
+       struct s3c2410_nand_info *info = to_nand_info(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (info == NULL)
                return 0;
@@ -562,10 +562,9 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
  * nand layer to look for devices
 */
 
-static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
+static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct s3c2410_platform_nand *plat = to_nand_plat(dev);
+       struct s3c2410_platform_nand *plat = to_nand_plat(pdev);
        struct s3c2410_nand_info *info;
        struct s3c2410_nand_mtd *nmtd;
        struct s3c2410_nand_set *sets;
@@ -575,26 +574,26 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        int nr_sets;
        int setno;
 
-       pr_debug("s3c2410_nand_probe(%p)\n", dev);
+       pr_debug("s3c2410_nand_probe(%p)\n", pdev);
 
        info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL) {
-               dev_err(dev, "no memory for flash info\n");
+               dev_err(&pdev->dev, "no memory for flash info\n");
                err = -ENOMEM;
                goto exit_error;
        }
 
        memzero(info, sizeof(*info));
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
        spin_lock_init(&info->controller.lock);
        init_waitqueue_head(&info->controller.wq);
 
        /* get the clock source and enable it */
 
-       info->clk = clk_get(dev, "nand");
+       info->clk = clk_get(&pdev->dev, "nand");
        if (IS_ERR(info->clk)) {
-               dev_err(dev, "failed to get clock");
+               dev_err(&pdev->dev, "failed to get clock");
                err = -ENOENT;
                goto exit_error;
        }
@@ -611,27 +610,27 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        info->area = request_mem_region(res->start, size, pdev->name);
 
        if (info->area == NULL) {
-               dev_err(dev, "cannot reserve register region\n");
+               dev_err(&pdev->dev, "cannot reserve register region\n");
                err = -ENOENT;
                goto exit_error;
        }
 
-       info->device     = dev;
+       info->device     = &pdev->dev;
        info->platform   = plat;
        info->regs       = ioremap(res->start, size);
        info->is_s3c2440 = is_s3c2440;
 
        if (info->regs == NULL) {
-               dev_err(dev, "cannot reserve register region\n");
+               dev_err(&pdev->dev, "cannot reserve register region\n");
                err = -EIO;
                goto exit_error;
        }
 
-       dev_dbg(dev, "mapped registers at %p\n", info->regs);
+       dev_dbg(&pdev->dev, "mapped registers at %p\n", info->regs);
 
        /* initialise the hardware */
 
-       err = s3c2410_nand_inithw(info, dev);
+       err = s3c2410_nand_inithw(info, pdev);
        if (err != 0)
                goto exit_error;
 
@@ -645,7 +644,7 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        size = nr_sets * sizeof(*info->mtds);
        info->mtds = kmalloc(size, GFP_KERNEL);
        if (info->mtds == NULL) {
-               dev_err(dev, "failed to allocate mtd storage\n");
+               dev_err(&pdev->dev, "failed to allocate mtd storage\n");
                err = -ENOMEM;
                goto exit_error;
        }
@@ -677,7 +676,7 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
        return 0;
 
  exit_error:
-       s3c2410_nand_remove(dev);
+       s3c2410_nand_remove(pdev);
 
        if (err == 0)
                err = -EINVAL;
@@ -686,44 +685,46 @@ static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440)
 
 /* driver device registration */
 
-static int s3c2410_nand_probe(struct device *dev)
+static int s3c2410_nand_probe(struct platform_device *dev)
 {
        return s3c24xx_nand_probe(dev, 0);
 }
 
-static int s3c2440_nand_probe(struct device *dev)
+static int s3c2440_nand_probe(struct platform_device *dev)
 {
        return s3c24xx_nand_probe(dev, 1);
 }
 
-static struct device_driver s3c2410_nand_driver = {
-       .name           = "s3c2410-nand",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_nand_driver = {
        .probe          = s3c2410_nand_probe,
        .remove         = s3c2410_nand_remove,
+       .driver         = {
+               .name   = "s3c2410-nand",
+               .owner  = THIS_MODULE,
+       },
 };
 
-static struct device_driver s3c2440_nand_driver = {
-       .name           = "s3c2440-nand",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_nand_driver = {
        .probe          = s3c2440_nand_probe,
        .remove         = s3c2410_nand_remove,
+       .driver         = {
+               .name   = "s3c2440-nand",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init s3c2410_nand_init(void)
 {
        printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics\n");
 
-       driver_register(&s3c2440_nand_driver);
-       return driver_register(&s3c2410_nand_driver);
+       platform_driver_register(&s3c2440_nand_driver);
+       return platform_driver_register(&s3c2410_nand_driver);
 }
 
 static void __exit s3c2410_nand_exit(void)
 {
-       driver_unregister(&s3c2440_nand_driver);
-       driver_unregister(&s3c2410_nand_driver);
+       platform_driver_unregister(&s3c2440_nand_driver);
+       platform_driver_unregister(&s3c2410_nand_driver);
 }
 
 module_init(s3c2410_nand_init);
index 977935a3d898d00fcfb6a2c12e297f6a7a49cc83..824e430486c2720dce930244b149dcd0650a60e5 100644 (file)
@@ -84,6 +84,7 @@ static int max_interrupt_work = 10;
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/skbuff.h>
 #include <linux/delay.h>       /* for udelay() */
 #include <linux/spinlock.h>
@@ -173,7 +174,7 @@ struct el3_private {
        /* skb send-queue */
        int head, size;
        struct sk_buff *queue[SKB_QUEUE_SIZE];
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
        struct pm_dev *pmdev;
 #endif
        enum {
@@ -200,7 +201,7 @@ static void el3_tx_timeout (struct net_device *dev);
 static void el3_down(struct net_device *dev);
 static void el3_up(struct net_device *dev);
 static struct ethtool_ops ethtool_ops;
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
 static int el3_suspend(struct pm_dev *pdev);
 static int el3_resume(struct pm_dev *pdev);
 static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data);
@@ -361,7 +362,7 @@ static void el3_common_remove (struct net_device *dev)
        struct el3_private *lp = netdev_priv(dev);
 
        (void) lp;                              /* Keep gcc quiet... */
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
        if (lp->pmdev)
                pm_unregister(lp->pmdev);
 #endif
@@ -571,7 +572,7 @@ no_pnp:
        if (err)
                goto out1;
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
        /* register power management */
        lp->pmdev = pm_register(PM_ISA_DEV, card_idx, el3_pm_callback);
        if (lp->pmdev) {
@@ -1479,7 +1480,7 @@ el3_up(struct net_device *dev)
 }
 
 /* Power Management support functions */
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
 
 static int
 el3_suspend(struct pm_dev *pdev)
@@ -1548,7 +1549,7 @@ el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data)
        return 0;
 }
 
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM_LEGACY */
 
 /* Parameters that may be passed into the module. */
 static int debug = -1;
index 5c69d57f8548aa41b84f45e5cf2101fa80f47d64..ebd7313d7fc1c1652d26c37e9c984b92c57bcbe7 100644 (file)
@@ -812,7 +812,7 @@ config SMC91X
        tristate "SMC 91C9x/91C1xxx support"
        select CRC32
        select MII
-       depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH)
+       depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00)
        help
          This is a driver for SMC's 91x series of Ethernet chipsets,
          including the SMC91C94 and the SMC91C111. Say Y if you want it
index 332e9953c55cdd4d80a50ba1fcfcaa0be6d52b45..cd0b1dccfb6102119334a357762b1c93502fec72 100644 (file)
@@ -32,6 +32,7 @@
  * 
  */
 
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
index 8f464271664dd0644878aeddaa5b52a19ad55abe..49fa1e4413fa470ddf7feadae6ec937a22c80e6e 100644 (file)
@@ -2707,7 +2707,7 @@ bnx2_init_nvram(struct bnx2 *bp)
 
        if (j == entry_count) {
                bp->flash_info = NULL;
-               printk(KERN_ALERT "Unknown flash/EEPROM type.\n");
+               printk(KERN_ALERT PFX "Unknown flash/EEPROM type.\n");
                rc = -ENODEV;
        }
 
@@ -3903,6 +3903,8 @@ bnx2_test_loopback(struct bnx2 *bp)
 
        pkt_size = 1514;
        skb = dev_alloc_skb(pkt_size);
+       if (!skb)
+               return -ENOMEM;
        packet = skb_put(skb, pkt_size);
        memcpy(packet, bp->mac_addr, 6);
        memset(packet + 6, 0x0, 8);
@@ -4798,11 +4800,7 @@ bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
        struct bnx2 *bp = dev->priv;
        int rc;
 
-       if (eeprom->offset > bp->flash_info->total_size)
-               return -EINVAL;
-
-       if ((eeprom->offset + eeprom->len) > bp->flash_info->total_size)
-               eeprom->len = bp->flash_info->total_size - eeprom->offset;
+       /* parameters already validated in ethtool_get_eeprom */
 
        rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
 
@@ -4816,11 +4814,7 @@ bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
        struct bnx2 *bp = dev->priv;
        int rc;
 
-       if (eeprom->offset > bp->flash_info->total_size)
-               return -EINVAL;
-
-       if ((eeprom->offset + eeprom->len) > bp->flash_info->total_size)
-               eeprom->len = bp->flash_info->total_size - eeprom->offset;
+       /* parameters already validated in ethtool_set_eeprom */
 
        rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
 
index 0d33a93df96b8a2081ad5e984b14121462cffd76..03804cc38be084f3ecb30a05518e9ea130520ebf 100644 (file)
@@ -398,13 +398,19 @@ static struct mca_driver depca_mca_driver = {
 };
 #endif
 
-static int depca_isa_probe (struct device *);
+static int depca_isa_probe (struct platform_device *);
 
-static struct device_driver depca_isa_driver = {
-       .name   = depca_string,
-       .bus    = &platform_bus_type,
+static int __devexit depca_isa_remove(struct platform_device *pdev)
+{
+       return depca_device_remove(&pdev->dev);
+}
+
+static struct platform_driver depca_isa_driver = {
        .probe  = depca_isa_probe,
-       .remove = __devexit_p(depca_device_remove),
+       .remove = __devexit_p(depca_isa_remove),
+       .driver = {
+               .name   = depca_string,
+       },
 };
        
 /*
@@ -1525,7 +1531,7 @@ static enum depca_type __init depca_shmem_probe (ulong *mem_start)
        return adapter;
 }
 
-static int __init depca_isa_probe (struct device *device)
+static int __init depca_isa_probe (struct platform_device *device)
 {
        struct net_device *dev;
        struct depca_private *lp;
@@ -1533,7 +1539,7 @@ static int __init depca_isa_probe (struct device *device)
        enum depca_type adapter = unknown;
        int status = 0;
 
-       ioaddr = (u_long) device->platform_data;
+       ioaddr = (u_long) device->dev.platform_data;
 
        if ((status = depca_common_init (ioaddr, &dev)))
                goto out;
@@ -1553,7 +1559,7 @@ static int __init depca_isa_probe (struct device *device)
        lp->adapter = adapter;
        lp->mem_start = mem_start;
        
-       if ((status = depca_hw_init(dev, device)))
+       if ((status = depca_hw_init(dev, &device->dev)))
                goto out_free;
        
        return 0;
@@ -2082,7 +2088,7 @@ static int __init depca_module_init (void)
 #ifdef CONFIG_EISA
         err |= eisa_driver_register (&depca_eisa_driver);
 #endif
-       err |= driver_register (&depca_isa_driver);
+       err |= platform_driver_register (&depca_isa_driver);
        depca_platform_probe ();
        
         return err;
@@ -2097,7 +2103,7 @@ static void __exit depca_module_exit (void)
 #ifdef CONFIG_EISA
         eisa_driver_unregister (&depca_eisa_driver);
 #endif
-       driver_unregister (&depca_isa_driver);
+       platform_driver_unregister (&depca_isa_driver);
 
        for (i = 0; depca_io_ports[i].iobase; i++) {
                if (depca_io_ports[i].device) {
index f8c9bcdab68beca268889ad07e005848e597a623..24996da4c1c44f9919b3a6277422c158c0312232 100644 (file)
@@ -148,7 +148,7 @@ typedef struct board_info {
 } board_info_t;
 
 /* function declaration ------------------------------------- */
-static int dm9000_probe(struct device *);
+static int dm9000_probe(struct platform_device *);
 static int dm9000_open(struct net_device *);
 static int dm9000_start_xmit(struct sk_buff *, struct net_device *);
 static int dm9000_stop(struct net_device *);
@@ -378,9 +378,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db)
  * Search DM9000 board, allocate space and register it
  */
 static int
-dm9000_probe(struct device *dev)
+dm9000_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct dm9000_plat_data *pdata = pdev->dev.platform_data;
        struct board_info *db;  /* Point a board information structure */
        struct net_device *ndev;
@@ -398,7 +397,7 @@ dm9000_probe(struct device *dev)
        }
 
        SET_MODULE_OWNER(ndev);
-       SET_NETDEV_DEV(ndev, dev);
+       SET_NETDEV_DEV(ndev, &pdev->dev);
 
        PRINTK2("dm9000_probe()");
 
@@ -569,7 +568,7 @@ dm9000_probe(struct device *dev)
                printk("%s: Invalid ethernet MAC address.  Please "
                       "set using ifconfig\n", ndev->name);
 
-       dev_set_drvdata(dev, ndev);
+       platform_set_drvdata(pdev, ndev);
        ret = register_netdev(ndev);
 
        if (ret == 0) {
@@ -1140,9 +1139,9 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
 }
 
 static int
-dm9000_drv_suspend(struct device *dev, pm_message_t state)
+dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                if (netif_running(ndev)) {
@@ -1154,9 +1153,9 @@ dm9000_drv_suspend(struct device *dev, pm_message_t state)
 }
 
 static int
-dm9000_drv_resume(struct device *dev)
+dm9000_drv_resume(struct platform_device *dev)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
        board_info_t *db = (board_info_t *) ndev->priv;
 
        if (ndev) {
@@ -1172,12 +1171,11 @@ dm9000_drv_resume(struct device *dev)
 }
 
 static int
-dm9000_drv_remove(struct device *dev)
+dm9000_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        unregister_netdev(ndev);
        dm9000_release_board(pdev, (board_info_t *) ndev->priv);
@@ -1188,13 +1186,14 @@ dm9000_drv_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver dm9000_driver = {
-       .name    = "dm9000",
-       .bus     = &platform_bus_type,
+static struct platform_driver dm9000_driver = {
        .probe   = dm9000_probe,
        .remove  = dm9000_drv_remove,
        .suspend = dm9000_drv_suspend,
        .resume  = dm9000_drv_resume,
+       .driver = {
+               .name   = "dm9000",
+       },
 };
 
 static int __init
@@ -1202,13 +1201,13 @@ dm9000_init(void)
 {
        printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
 
-       return driver_register(&dm9000_driver); /* search board and register */
+       return platform_driver_register(&dm9000_driver);        /* search board and register */
 }
 
 static void __exit
 dm9000_cleanup(void)
 {
-       driver_unregister(&dm9000_driver);
+       platform_driver_unregister(&dm9000_driver);
 }
 
 module_init(dm9000_init);
index 7a6aeae2c9fa9698f6ccd8bc9914e4b1e6b3e850..22cd045567075d33f26356cac785866212362506 100644 (file)
 
 #define DRV_NAME               "e100"
 #define DRV_EXT                "-NAPI"
-#define DRV_VERSION            "3.4.14-k2"DRV_EXT
+#define DRV_VERSION            "3.4.14-k4"DRV_EXT
 #define DRV_DESCRIPTION                "Intel(R) PRO/100 Network Driver"
 #define DRV_COPYRIGHT          "Copyright(c) 1999-2005 Intel Corporation"
 #define PFX                    DRV_NAME ": "
@@ -903,8 +903,8 @@ static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
 
 static void e100_get_defaults(struct nic *nic)
 {
-       struct param_range rfds = { .min = 16, .max = 256, .count = 64 };
-       struct param_range cbs  = { .min = 64, .max = 256, .count = 64 };
+       struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
+       struct param_range cbs  = { .min = 64, .max = 256, .count = 128 };
 
        pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);
        /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
@@ -1007,25 +1007,264 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
                c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
 }
 
+/********************************************************/
+/*  Micro code for 8086:1229 Rev 8                      */
+/********************************************************/
+
+/*  Parameter values for the D101M B-step  */
+#define D101M_CPUSAVER_TIMER_DWORD             78
+#define D101M_CPUSAVER_BUNDLE_DWORD            65
+#define D101M_CPUSAVER_MIN_SIZE_DWORD          126
+
+#define D101M_B_RCVBUNDLE_UCODE \
+{\
+0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
+0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
+0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
+0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
+0x00380438, 0x00000000, 0x00140000, 0x00380555, \
+0x00308000, 0x00100662, 0x00100561, 0x000E0408, \
+0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
+0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
+0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
+0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
+0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
+0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
+0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
+0x00041000, 0x00010004, 0x00130826, 0x000C0006, \
+0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
+0x00101210, 0x00380C34, 0x00000000, 0x00000000, \
+0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
+0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
+0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
+0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
+0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
+0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
+0x00130826, 0x000C0001, 0x00220559, 0x00101313, \
+0x00380559, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00130831, 0x0010090B, 0x00124813, \
+0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
+0x003806A8, 0x00000000, 0x00000000, 0x00000000, \
+}
+
+/********************************************************/
+/*  Micro code for 8086:1229 Rev 9                      */
+/********************************************************/
+
+/*  Parameter values for the D101S  */
+#define D101S_CPUSAVER_TIMER_DWORD             78
+#define D101S_CPUSAVER_BUNDLE_DWORD            67
+#define D101S_CPUSAVER_MIN_SIZE_DWORD          128
+
+#define D101S_RCVBUNDLE_UCODE \
+{\
+0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
+0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
+0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
+0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
+0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
+0x00308000, 0x00100610, 0x00100561, 0x000E0408, \
+0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
+0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
+0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
+0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
+0x003A047E, 0x00044010, 0x00380819, 0x00000000, \
+0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
+0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
+0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
+0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
+0x00101313, 0x00380700, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
+0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
+0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
+0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
+0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
+0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
+0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
+0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
+0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
+0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00130831, \
+0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
+0x00041000, 0x00010004, 0x00380700  \
+}
+
+/********************************************************/
+/*  Micro code for the 8086:1229 Rev F/10               */
+/********************************************************/
+
+/*  Parameter values for the D102 E-step  */
+#define D102_E_CPUSAVER_TIMER_DWORD            42
+#define D102_E_CPUSAVER_BUNDLE_DWORD           54
+#define D102_E_CPUSAVER_MIN_SIZE_DWORD         46
+
+#define     D102_E_RCVBUNDLE_UCODE \
+{\
+0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \
+0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
+0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
+0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
+0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
+0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
+0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
+0x00300006, 0x00E014FB, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \
+0x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+0x00000000, 0x00000000, 0x00000000, 0x00000000, \
+}
+
 static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
 {
-       int i;
-       static const u32 ucode[UCODE_SIZE] = {
-               /* NFS packets are misinterpreted as TCO packets and
-                * incorrectly routed to the BMC over SMBus.  This
-                * microcode patch checks the fragmented IP bit in the
-                * NFS/UDP header to distinguish between NFS and TCO. */
-               0x0EF70E36, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF,
-               0x1FFF1FFF, 0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000,
-               0x00906EFD, 0x00900EFD, 0x00E00EF8,
-       };
-
-       if(nic->mac == mac_82551_F || nic->mac == mac_82551_10) {
-               for(i = 0; i < UCODE_SIZE; i++)
+/* *INDENT-OFF* */
+       static struct {
+               u32 ucode[UCODE_SIZE + 1];
+               u8 mac;
+               u8 timer_dword;
+               u8 bundle_dword;
+               u8 min_size_dword;
+       } ucode_opts[] = {
+               { D101M_B_RCVBUNDLE_UCODE,
+                 mac_82559_D101M,
+                 D101M_CPUSAVER_TIMER_DWORD,
+                 D101M_CPUSAVER_BUNDLE_DWORD,
+                 D101M_CPUSAVER_MIN_SIZE_DWORD },
+               { D101S_RCVBUNDLE_UCODE,
+                 mac_82559_D101S,
+                 D101S_CPUSAVER_TIMER_DWORD,
+                 D101S_CPUSAVER_BUNDLE_DWORD,
+                 D101S_CPUSAVER_MIN_SIZE_DWORD },
+               { D102_E_RCVBUNDLE_UCODE,
+                 mac_82551_F,
+                 D102_E_CPUSAVER_TIMER_DWORD,
+                 D102_E_CPUSAVER_BUNDLE_DWORD,
+                 D102_E_CPUSAVER_MIN_SIZE_DWORD },
+               { D102_E_RCVBUNDLE_UCODE,
+                 mac_82551_10,
+                 D102_E_CPUSAVER_TIMER_DWORD,
+                 D102_E_CPUSAVER_BUNDLE_DWORD,
+                 D102_E_CPUSAVER_MIN_SIZE_DWORD },
+               { {0}, 0, 0, 0, 0}
+       }, *opts;
+/* *INDENT-ON* */
+
+/*************************************************************************
+*  CPUSaver parameters
+*
+*  All CPUSaver parameters are 16-bit literals that are part of a
+*  "move immediate value" instruction.  By changing the value of
+*  the literal in the instruction before the code is loaded, the
+*  driver can change the algorithm.
+*
+*  INTDELAY - This loads the dead-man timer with its inital value.
+*    When this timer expires the interrupt is asserted, and the 
+*    timer is reset each time a new packet is received.  (see
+*    BUNDLEMAX below to set the limit on number of chained packets)
+*    The current default is 0x600 or 1536.  Experiments show that
+*    the value should probably stay within the 0x200 - 0x1000.
+*
+*  BUNDLEMAX - 
+*    This sets the maximum number of frames that will be bundled.  In
+*    some situations, such as the TCP windowing algorithm, it may be
+*    better to limit the growth of the bundle size than let it go as
+*    high as it can, because that could cause too much added latency.
+*    The default is six, because this is the number of packets in the
+*    default TCP window size.  A value of 1 would make CPUSaver indicate
+*    an interrupt for every frame received.  If you do not want to put
+*    a limit on the bundle size, set this value to xFFFF.
+*
+*  BUNDLESMALL - 
+*    This contains a bit-mask describing the minimum size frame that
+*    will be bundled.  The default masks the lower 7 bits, which means
+*    that any frame less than 128 bytes in length will not be bundled,
+*    but will instead immediately generate an interrupt.  This does
+*    not affect the current bundle in any way.  Any frame that is 128
+*    bytes or large will be bundled normally.  This feature is meant
+*    to provide immediate indication of ACK frames in a TCP environment.
+*    Customers were seeing poor performance when a machine with CPUSaver
+*    enabled was sending but not receiving.  The delay introduced when
+*    the ACKs were received was enough to reduce total throughput, because
+*    the sender would sit idle until the ACK was finally seen.
+*
+*    The current default is 0xFF80, which masks out the lower 7 bits.
+*    This means that any frame which is x7F (127) bytes or smaller
+*    will cause an immediate interrupt.  Because this value must be a 
+*    bit mask, there are only a few valid values that can be used.  To
+*    turn this feature off, the driver can write the value xFFFF to the
+*    lower word of this instruction (in the same way that the other
+*    parameters are used).  Likewise, a value of 0xF800 (2047) would
+*    cause an interrupt to be generated for every frame, because all
+*    standard Ethernet frames are <= 2047 bytes in length.
+*************************************************************************/
+
+/* if you wish to disable the ucode functionality, while maintaining the 
+ * workarounds it provides, set the following defines to:
+ * BUNDLESMALL 0
+ * BUNDLEMAX 1
+ * INTDELAY 1
+ */
+#define BUNDLESMALL 1
+#define BUNDLEMAX (u16)6
+#define INTDELAY (u16)1536 /* 0x600 */
+
+       /* do not load u-code for ICH devices */
+       if (nic->flags & ich)
+               goto noloaducode;
+
+       /* Search for ucode match against h/w rev_id */
+       for (opts = ucode_opts; opts->mac; opts++) {
+               int i;
+               u32 *ucode = opts->ucode;
+               if (nic->mac != opts->mac)
+                       continue;
+
+               /* Insert user-tunable settings */
+               ucode[opts->timer_dword] &= 0xFFFF0000;
+               ucode[opts->timer_dword] |= INTDELAY;
+               ucode[opts->bundle_dword] &= 0xFFFF0000;
+               ucode[opts->bundle_dword] |= BUNDLEMAX;
+               ucode[opts->min_size_dword] &= 0xFFFF0000;
+               ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80;
+
+               for (i = 0; i < UCODE_SIZE; i++)
                        cb->u.ucode[i] = cpu_to_le32(ucode[i]);
                cb->command = cpu_to_le16(cb_ucode);
-       } else
-               cb->command = cpu_to_le16(cb_nop);
+               return;
+       }
+
+noloaducode:
+       cb->command = cpu_to_le16(cb_nop);
 }
 
 static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
index 94e7a9af87055f0642abccb1309a43a2ec95d8cc..a84c232395e3fdf72dc63c070341ad756d2aaa39 100644 (file)
@@ -1,6 +1,6 @@
 config FEC_8XX
        tristate "Motorola 8xx FEC driver"
-       depends on NET_ETHERNET && FEC
+       depends on NET_ETHERNET && 8xx
        select MII
 
 config FEC_8XX_GENERIC_PHY
index 22aec6ed80f56b7dcfd547cf5d5f149fc8310fb2..525624fc03b47016c2d1f1586d49d92e83c4dbba 100644 (file)
@@ -80,7 +80,7 @@
  *                        into nv_close, otherwise reenabling for wol can
  *                        cause DMA to kfree'd memory.
  *     0.31: 14 Nov 2004: ethtool support for getting/setting link
- *                        capabilities.
+ *                        capabilities.
  *     0.32: 16 Apr 2005: RX_ERROR4 handling added.
  *     0.33: 16 May 2005: Support for MCP51 added.
  *     0.34: 18 Jun 2005: Add DEV_NEED_LINKTIMER to all nForce nics.
  *     0.37: 10 Jul 2005: Additional ethtool support, cleanup of pci id list
  *     0.38: 16 Jul 2005: tx irq rewrite: Use global flags instead of
  *                        per-packet flags.
- *      0.39: 18 Jul 2005: Add 64bit descriptor support.
- *      0.40: 19 Jul 2005: Add support for mac address change.
- *      0.41: 30 Jul 2005: Write back original MAC in nv_close instead
+ *     0.39: 18 Jul 2005: Add 64bit descriptor support.
+ *     0.40: 19 Jul 2005: Add support for mac address change.
+ *     0.41: 30 Jul 2005: Write back original MAC in nv_close instead
  *                        of nv_remove
- *      0.42: 06 Aug 2005: Fix lack of link speed initialization
+ *     0.42: 06 Aug 2005: Fix lack of link speed initialization
  *                        in the second (and later) nv_open call
- *      0.43: 10 Aug 2005: Add support for tx checksum.
- *      0.44: 20 Aug 2005: Add support for scatter gather and segmentation.
+ *     0.43: 10 Aug 2005: Add support for tx checksum.
+ *     0.44: 20 Aug 2005: Add support for scatter gather and segmentation.
+ *     0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check
+ *     0.46: 20 Oct 2005: Add irq optimization modes.
+ *     0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
  *
  * Known bugs:
  * We suspect that on some hardware no TX done interrupts are generated.
  * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
  * superfluous timer interrupts from the nic.
  */
-#define FORCEDETH_VERSION              "0.44"
+#define FORCEDETH_VERSION              "0.47"
 #define DRV_NAME                       "forcedeth"
 
 #include <linux/module.h>
@@ -163,7 +166,8 @@ enum {
 #define NVREG_IRQ_LINK                 0x0040
 #define NVREG_IRQ_TX_ERROR             0x0080
 #define NVREG_IRQ_TX1                  0x0100
-#define NVREG_IRQMASK_WANTED           0x00df
+#define NVREG_IRQMASK_THROUGHPUT       0x00df
+#define NVREG_IRQMASK_CPU              0x0040
 
 #define NVREG_IRQ_UNKNOWN      (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \
                                        NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \
@@ -177,7 +181,8 @@ enum {
  * NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms
  */
        NvRegPollingInterval = 0x00c,
-#define NVREG_POLL_DEFAULT     970
+#define NVREG_POLL_DEFAULT_THROUGHPUT  970
+#define NVREG_POLL_DEFAULT_CPU 13
        NvRegMisc1 = 0x080,
 #define NVREG_MISC1_HD         0x02
 #define NVREG_MISC1_FORCE      0x3b0f3c
@@ -538,6 +543,25 @@ struct fe_priv {
  */
 static int max_interrupt_work = 5;
 
+/*
+ * Optimization can be either throuput mode or cpu mode
+ * 
+ * Throughput Mode: Every tx and rx packet will generate an interrupt.
+ * CPU Mode: Interrupts are controlled by a timer.
+ */
+#define NV_OPTIMIZATION_MODE_THROUGHPUT 0
+#define NV_OPTIMIZATION_MODE_CPU        1
+static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT;
+
+/*
+ * Poll interval for timer irq
+ *
+ * This interval determines how frequent an interrupt is generated.
+ * The is value is determined by [(time_in_micro_secs * 100) / (2^10)]
+ * Min = 0, and Max = 65535
+ */
+static int poll_interval = -1;
+
 static inline struct fe_priv *get_nvpriv(struct net_device *dev)
 {
        return netdev_priv(dev);
@@ -1328,67 +1352,71 @@ static void nv_rx_process(struct net_device *dev)
                        if (!(Flags & NV_RX_DESCRIPTORVALID))
                                goto next_pkt;
 
-                       if (Flags & NV_RX_MISSEDFRAME) {
-                               np->stats.rx_missed_errors++;
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) {
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX_CRCERR) {
-                               np->stats.rx_crc_errors++;
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX_OVERFLOW) {
-                               np->stats.rx_over_errors++;
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX_ERROR4) {
-                               len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
-                               if (len < 0) {
+                       if (Flags & NV_RX_ERROR) {
+                               if (Flags & NV_RX_MISSEDFRAME) {
+                                       np->stats.rx_missed_errors++;
                                        np->stats.rx_errors++;
                                        goto next_pkt;
                                }
-                       }
-                       /* framing errors are soft errors. */
-                       if (Flags & NV_RX_FRAMINGERR) {
-                               if (Flags & NV_RX_SUBSTRACT1) {
-                                       len--;
+                               if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) {
+                                       np->stats.rx_errors++;
+                                       goto next_pkt;
+                               }
+                               if (Flags & NV_RX_CRCERR) {
+                                       np->stats.rx_crc_errors++;
+                                       np->stats.rx_errors++;
+                                       goto next_pkt;
+                               }
+                               if (Flags & NV_RX_OVERFLOW) {
+                                       np->stats.rx_over_errors++;
+                                       np->stats.rx_errors++;
+                                       goto next_pkt;
+                               }
+                               if (Flags & NV_RX_ERROR4) {
+                                       len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
+                                       if (len < 0) {
+                                               np->stats.rx_errors++;
+                                               goto next_pkt;
+                                       }
+                               }
+                               /* framing errors are soft errors. */
+                               if (Flags & NV_RX_FRAMINGERR) {
+                                       if (Flags & NV_RX_SUBSTRACT1) {
+                                               len--;
+                                       }
                                }
                        }
                } else {
                        if (!(Flags & NV_RX2_DESCRIPTORVALID))
                                goto next_pkt;
 
-                       if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX2_CRCERR) {
-                               np->stats.rx_crc_errors++;
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX2_OVERFLOW) {
-                               np->stats.rx_over_errors++;
-                               np->stats.rx_errors++;
-                               goto next_pkt;
-                       }
-                       if (Flags & NV_RX2_ERROR4) {
-                               len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
-                               if (len < 0) {
+                       if (Flags & NV_RX2_ERROR) {
+                               if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
                                        np->stats.rx_errors++;
                                        goto next_pkt;
                                }
-                       }
-                       /* framing errors are soft errors */
-                       if (Flags & NV_RX2_FRAMINGERR) {
-                               if (Flags & NV_RX2_SUBSTRACT1) {
-                                       len--;
+                               if (Flags & NV_RX2_CRCERR) {
+                                       np->stats.rx_crc_errors++;
+                                       np->stats.rx_errors++;
+                                       goto next_pkt;
+                               }
+                               if (Flags & NV_RX2_OVERFLOW) {
+                                       np->stats.rx_over_errors++;
+                                       np->stats.rx_errors++;
+                                       goto next_pkt;
+                               }
+                               if (Flags & NV_RX2_ERROR4) {
+                                       len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
+                                       if (len < 0) {
+                                               np->stats.rx_errors++;
+                                               goto next_pkt;
+                                       }
+                               }
+                               /* framing errors are soft errors */
+                               if (Flags & NV_RX2_FRAMINGERR) {
+                                       if (Flags & NV_RX2_SUBSTRACT1) {
+                                               len--;
+                                       }
                                }
                        }
                        Flags &= NV_RX2_CHECKSUMMASK;
@@ -1612,6 +1640,17 @@ static void nv_set_multicast(struct net_device *dev)
        spin_unlock_irq(&np->lock);
 }
 
+/**
+ * nv_update_linkspeed: Setup the MAC according to the link partner
+ * @dev: Network device to be configured
+ *
+ * The function queries the PHY and checks if there is a link partner.
+ * If yes, then it sets up the MAC accordingly. Otherwise, the MAC is
+ * set to 10 MBit HD.
+ *
+ * The function returns 0 if there is no link partner and 1 if there is
+ * a good link partner.
+ */
 static int nv_update_linkspeed(struct net_device *dev)
 {
        struct fe_priv *np = netdev_priv(dev);
@@ -1751,13 +1790,11 @@ set_speed:
 static void nv_linkchange(struct net_device *dev)
 {
        if (nv_update_linkspeed(dev)) {
-               if (netif_carrier_ok(dev)) {
-                       nv_stop_rx(dev);
-               } else {
+               if (!netif_carrier_ok(dev)) {
                        netif_carrier_on(dev);
                        printk(KERN_INFO "%s: link up.\n", dev->name);
+                       nv_start_rx(dev);
                }
-               nv_start_rx(dev);
        } else {
                if (netif_carrier_ok(dev)) {
                        netif_carrier_off(dev);
@@ -1799,22 +1836,18 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
                if (!(events & np->irqmask))
                        break;
 
-               if (events & (NVREG_IRQ_TX1|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_ERROR|NVREG_IRQ_TX_ERR)) {
+               spin_lock(&np->lock);
+               nv_tx_done(dev);
+               spin_unlock(&np->lock);
+               
+               nv_rx_process(dev);
+               if (nv_alloc_rx(dev)) {
                        spin_lock(&np->lock);
-                       nv_tx_done(dev);
+                       if (!np->in_shutdown)
+                               mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
                        spin_unlock(&np->lock);
                }
-
-               if (events & (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF)) {
-                       nv_rx_process(dev);
-                       if (nv_alloc_rx(dev)) {
-                               spin_lock(&np->lock);
-                               if (!np->in_shutdown)
-                                       mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
-                               spin_unlock(&np->lock);
-                       }
-               }
-
+               
                if (events & NVREG_IRQ_LINK) {
                        spin_lock(&np->lock);
                        nv_link_irq(dev);
@@ -2216,7 +2249,14 @@ static int nv_open(struct net_device *dev)
        writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed);
        writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1);
        writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2);
-       writel(NVREG_POLL_DEFAULT, base + NvRegPollingInterval);
+       if (poll_interval == -1) {
+               if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT)
+                       writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval);
+               else
+                       writel(NVREG_POLL_DEFAULT_CPU, base + NvRegPollingInterval);
+       }
+       else
+               writel(poll_interval & 0xFFFF, base + NvRegPollingInterval);
        writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6);
        writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING,
                        base + NvRegAdapterControl);
@@ -2501,7 +2541,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
        } else {
                np->tx_flags = NV_TX2_VALID;
        }
-       np->irqmask = NVREG_IRQMASK_WANTED;
+       if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT)
+               np->irqmask = NVREG_IRQMASK_THROUGHPUT;
+       else
+               np->irqmask = NVREG_IRQMASK_CPU;
+
        if (id->driver_data & DEV_NEED_TIMERIRQ)
                np->irqmask |= NVREG_IRQ_TIMER;
        if (id->driver_data & DEV_NEED_LINKTIMER) {
@@ -2514,16 +2558,17 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
        }
 
        /* find a suitable phy */
-       for (i = 1; i < 32; i++) {
+       for (i = 1; i <= 32; i++) {
                int id1, id2;
+               int phyaddr = i & 0x1F;
 
                spin_lock_irq(&np->lock);
-               id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ);
+               id1 = mii_rw(dev, phyaddr, MII_PHYSID1, MII_READ);
                spin_unlock_irq(&np->lock);
                if (id1 < 0 || id1 == 0xffff)
                        continue;
                spin_lock_irq(&np->lock);
-               id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ);
+               id2 = mii_rw(dev, phyaddr, MII_PHYSID2, MII_READ);
                spin_unlock_irq(&np->lock);
                if (id2 < 0 || id2 == 0xffff)
                        continue;
@@ -2531,23 +2576,19 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT;
                id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT;
                dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n",
-                               pci_name(pci_dev), id1, id2, i);
-               np->phyaddr = i;
+                       pci_name(pci_dev), id1, id2, phyaddr);
+               np->phyaddr = phyaddr;
                np->phy_oui = id1 | id2;
                break;
        }
-       if (i == 32) {
-               /* PHY in isolate mode? No phy attached and user wants to
-                * test loopback? Very odd, but can be correct.
-                */
+       if (i == 33) {
                printk(KERN_INFO "%s: open: Could not find a valid PHY.\n",
-                               pci_name(pci_dev));
-       }
-
-       if (i != 32) {
-               /* reset it */
-               phy_init(dev);
+                      pci_name(pci_dev));
+               goto out_freering;
        }
+       
+       /* reset it */
+       phy_init(dev);
 
        /* set default link speed settings */
        np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
@@ -2689,6 +2730,10 @@ static void __exit exit_nic(void)
 
 module_param(max_interrupt_work, int, 0);
 MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt");
+module_param(optimization_mode, int, 0);
+MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer.");
+module_param(poll_interval, int, 0);
+MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535.");
 
 MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>");
 MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
index 54d294ad6df59f4f8d75b9a0a19958e0bf3493d2..0f030b73cbb328b246e170d85e9401182659d860 100644 (file)
@@ -6,7 +6,7 @@
  * Based on 8260_io/fcc_enet.c
  *
  * Author: Andy Fleming
- * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ * Maintainer: Kumar Gala
  *
  * Copyright (c) 2002-2004 Freescale Semiconductor, Inc.
  *
@@ -126,8 +126,8 @@ static irqreturn_t gfar_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 static void adjust_link(struct net_device *dev);
 static void init_registers(struct net_device *dev);
 static int init_phy(struct net_device *dev);
-static int gfar_probe(struct device *device);
-static int gfar_remove(struct device *device);
+static int gfar_probe(struct platform_device *pdev);
+static int gfar_remove(struct platform_device *pdev);
 static void free_skb_resources(struct gfar_private *priv);
 static void gfar_set_multi(struct net_device *dev);
 static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr);
@@ -156,12 +156,11 @@ int gfar_uses_fcb(struct gfar_private *priv)
 
 /* Set up the ethernet device structure, private data,
  * and anything else we need before we start */
-static int gfar_probe(struct device *device)
+static int gfar_probe(struct platform_device *pdev)
 {
        u32 tempval;
        struct net_device *dev = NULL;
        struct gfar_private *priv = NULL;
-       struct platform_device *pdev = to_platform_device(device);
        struct gianfar_platform_data *einfo;
        struct resource *r;
        int idx;
@@ -208,7 +207,7 @@ static int gfar_probe(struct device *device)
 
        spin_lock_init(&priv->lock);
 
-       dev_set_drvdata(device, dev);
+       platform_set_drvdata(pdev, dev);
 
        /* Stop the DMA engine now, in case it was running before */
        /* (The firmware could have used it, and left it running). */
@@ -245,7 +244,7 @@ static int gfar_probe(struct device *device)
        dev->base_addr = (unsigned long) (priv->regs);
 
        SET_MODULE_OWNER(dev);
-       SET_NETDEV_DEV(dev, device);
+       SET_NETDEV_DEV(dev, &pdev->dev);
 
        /* Fill in the dev structure */
        dev->open = gfar_enet_open;
@@ -377,12 +376,12 @@ regs_fail:
        return err;
 }
 
-static int gfar_remove(struct device *device)
+static int gfar_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(device);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct gfar_private *priv = netdev_priv(dev);
 
-       dev_set_drvdata(device, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        iounmap((void *) priv->regs);
        free_netdev(dev);
@@ -1861,11 +1860,12 @@ static irqreturn_t gfar_error(int irq, void *dev_id, struct pt_regs *regs)
 }
 
 /* Structure for a device driver */
-static struct device_driver gfar_driver = {
-       .name = "fsl-gianfar",
-       .bus = &platform_bus_type,
+static struct platform_driver gfar_driver = {
        .probe = gfar_probe,
        .remove = gfar_remove,
+       .driver = {
+               .name = "fsl-gianfar",
+       },
 };
 
 static int __init gfar_init(void)
@@ -1875,7 +1875,7 @@ static int __init gfar_init(void)
        if (err)
                return err;
 
-       err = driver_register(&gfar_driver);
+       err = platform_driver_register(&gfar_driver);
 
        if (err)
                gfar_mdio_exit();
@@ -1885,7 +1885,7 @@ static int __init gfar_init(void)
 
 static void __exit gfar_exit(void)
 {
-       driver_unregister(&gfar_driver);
+       platform_driver_unregister(&gfar_driver);
        gfar_mdio_exit();
 }
 
index 220084e53341ddce82122a82489328bd95013bbe..5065ba82cb7608324d7b8d6f1a2a37a2b5b3fff2 100644 (file)
@@ -6,7 +6,7 @@
  * Based on 8260_io/fcc_enet.c
  *
  * Author: Andy Fleming
- * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ * Maintainer: Kumar Gala
  *
  * Copyright (c) 2002-2004 Freescale Semiconductor, Inc.
  *
index 5a2d810ce57538534dba620dfdb9b547c7096cc4..cfa3cd7c91a0a9c777851379e1c63d9eeae217a9 100644 (file)
@@ -6,7 +6,7 @@
  *  Based on e1000 ethtool support
  *
  *  Author: Andy Fleming
- *  Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ *  Maintainer: Kumar Gala
  *
  *  Copyright (c) 2003,2004 Freescale Semiconductor, Inc.
  *
index 7263395d78bbb6e3ccbf1f128b083f2f7abd16f7..04a462c2a5b7e8bd47bdb0299841d63840816467 100644 (file)
@@ -5,7 +5,7 @@
  * Provides Bus interface for MIIM regs
  *
  * Author: Andy Fleming
- * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ * Maintainer: Kumar Gala
  *
  * Copyright (c) 2002-2004 Freescale Semiconductor, Inc.
  *
@@ -133,7 +133,7 @@ int gfar_mdio_probe(struct device *dev)
        if (NULL == dev)
                return -EINVAL;
 
-       new_bus = kmalloc(sizeof(struct mii_bus), GFP_KERNEL);
+       new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
 
        if (NULL == new_bus)
                return -ENOMEM;
index 56e5665d5c9b8e072fe2ad4320696ff40c2b7f67..e85eb216fb5be40464e1dfdf0402f77059bfeafb 100644 (file)
@@ -5,7 +5,7 @@
  * Driver for the MDIO bus controller in the Gianfar register space
  *
  * Author: Andy Fleming
- * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ * Maintainer: Kumar Gala
  *
  * Copyright (c) 2002-2004 Freescale Semiconductor, Inc.
  *
index 666cfbbcf6d9173cb47129c4d2f7b41d93898ea8..5958a63147230620d4ddf461c26455e2188d18b6 100644 (file)
@@ -72,8 +72,6 @@ static void dump_tx_desc(int dbg_lvl, struct net_device *dev, int i);
 static void dump_rx_desc(int dbg_lvl, struct net_device *dev, int i);
 static void dump_skb(int dbg_lvl, struct net_device *dev,
                     struct sk_buff *skb);
-static void dump_hw_addr(int dbg_lvl, struct net_device *dev,
-                        const char* pfx, unsigned char* addr_str);
 static void update_stats(struct gt96100_private *gp);
 static void abort(struct net_device *dev, u32 abort_bits);
 static void hard_stop(struct net_device *dev);
@@ -334,13 +332,13 @@ dump_MII(int dbg_lvl, struct net_device *dev)
 
 static void
 dump_hw_addr(int dbg_lvl, struct net_device *dev, const char* pfx,
-            unsigned char* addr_str)
+            const char* func, unsigned char* addr_str)
 {
        int i;
        char buf[100], octet[5];
     
        if (dbg_lvl <= GT96100_DEBUG) {
-               strcpy(buf, pfx);
+               sprintf(buf, pfx, func);
                for (i = 0; i < 6; i++) {
                        sprintf(octet, "%2.2x%s",
                                addr_str[i], i<5 ? ":" : "\n");
@@ -708,7 +706,7 @@ static int __init gt96100_probe1(struct pci_dev *pci, int port_num)
 
        info("%s found at 0x%x, irq %d\n",
             chip_name(gp->chip_rev), gtif->iobase, gtif->irq);
-       dump_hw_addr(0, dev, "HW Address ", dev->dev_addr);
+       dump_hw_addr(0, dev, "%s: HW Address ", __FUNCTION__, dev->dev_addr);
        info("%s chip revision=%d\n", chip_name(gp->chip_rev), gp->chip_rev);
        info("%s ethernet port %d\n", chip_name(gp->chip_rev), gp->port_num);
        info("external PHY ID1=0x%04x, ID2=0x%04x\n", phy_id1, phy_id2);
@@ -1488,7 +1486,7 @@ gt96100_set_rx_mode(struct net_device *dev)
                gt96100_add_hash_entry(dev, dev->dev_addr);
 
                for (mcptr = dev->mc_list; mcptr; mcptr = mcptr->next) {
-                       dump_hw_addr(2, dev, __FUNCTION__ ": addr=",
+                       dump_hw_addr(2, dev, "%s: addr=", __FUNCTION__,
                                     mcptr->dmi_addr);
                        gt96100_add_hash_entry(dev, mcptr->dmi_addr);
                }
index be191d80ef9c3984e6ce0473762bbc7fc364e5b2..ceb98fd398afa35c4cd8a997325e197001a82b92 100644 (file)
@@ -58,7 +58,7 @@
 
 #include "ibmveth.h"
 
-#define DEBUG 1
+#undef DEBUG
 
 #define ibmveth_printk(fmt, args...) \
   printk(KERN_INFO "%s: " fmt, __FILE__, ## args)
index 6a3129bc15a6d6327c5dec32f8e518049e6c5787..9b8295ee06ef1fb069f283a950f12a67b0ae113b 100644 (file)
@@ -1360,7 +1360,7 @@ static struct pci_driver ioc3_driver = {
 
 static int __init ioc3_init_module(void)
 {
-       return pci_module_init(&ioc3_driver);
+       return pci_register_driver(&ioc3_driver);
 }
 
 static void __exit ioc3_cleanup_module(void)
index 9bf34681d3dfecb0920973ff0565f16d29329109..2e7882eb7d6fb02a1d980c2467e638f317a1c915 100644 (file)
@@ -40,6 +40,7 @@
 #include <asm/byteorder.h>
 
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 
 #include <net/irda/wrapper.h>
 #include <net/irda/irda.h>
index 805714ec9a8a185db963f1285c2caf0929b14f28..ee717d0e939e5e016726b112b18c914363ce3223 100644 (file)
@@ -59,6 +59,7 @@
 #include <asm/byteorder.h>
 
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 
 #include <net/irda/wrapper.h>
 #include <net/irda/irda.h>
index 76e0b9fb5e96a906c9a5ba915d02407ef3b5414e..63d38fbbd04ecb59e6e42748d162af2c4968e4af 100644 (file)
@@ -291,9 +291,9 @@ static void sa1100_irda_shutdown(struct sa1100_irda *si)
 /*
  * Suspend the IrDA interface.
  */
-static int sa1100_irda_suspend(struct device *_dev, pm_message_t state)
+static int sa1100_irda_suspend(struct platform_device *pdev, pm_message_t state)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sa1100_irda *si;
 
        if (!dev)
@@ -316,9 +316,9 @@ static int sa1100_irda_suspend(struct device *_dev, pm_message_t state)
 /*
  * Resume the IrDA interface.
  */
-static int sa1100_irda_resume(struct device *_dev)
+static int sa1100_irda_resume(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sa1100_irda *si;
 
        if (!dev)
@@ -886,9 +886,8 @@ static int sa1100_irda_init_iobuf(iobuff_t *io, int size)
        return io->head ? 0 : -ENOMEM;
 }
 
-static int sa1100_irda_probe(struct device *_dev)
+static int sa1100_irda_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(_dev);
        struct net_device *dev;
        struct sa1100_irda *si;
        unsigned int baudrate_mask;
@@ -967,7 +966,7 @@ static int sa1100_irda_probe(struct device *_dev)
 
        err = register_netdev(dev);
        if (err == 0)
-               dev_set_drvdata(&pdev->dev, dev);
+               platform_set_drvdata(pdev, dev);
 
        if (err) {
  err_mem_5:
@@ -985,9 +984,9 @@ static int sa1100_irda_probe(struct device *_dev)
        return err;
 }
 
-static int sa1100_irda_remove(struct device *_dev)
+static int sa1100_irda_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(_dev);
+       struct net_device *dev = platform_get_drvdata(pdev);
 
        if (dev) {
                struct sa1100_irda *si = dev->priv;
@@ -1004,13 +1003,14 @@ static int sa1100_irda_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver sa1100ir_driver = {
-       .name           = "sa11x0-ir",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100ir_driver = {
        .probe          = sa1100_irda_probe,
        .remove         = sa1100_irda_remove,
        .suspend        = sa1100_irda_suspend,
        .resume         = sa1100_irda_resume,
+       .driver         = {
+               .name   = "sa11x0-ir",
+       },
 };
 
 static int __init sa1100_irda_init(void)
@@ -1023,12 +1023,12 @@ static int __init sa1100_irda_init(void)
        if (power_level > 3)
                power_level = 3;
 
-       return driver_register(&sa1100ir_driver);
+       return platform_driver_register(&sa1100ir_driver);
 }
 
 static void __exit sa1100_irda_exit(void)
 {
-       driver_unregister(&sa1100ir_driver);
+       platform_driver_unregister(&sa1100ir_driver);
 }
 
 module_init(sa1100_irda_init);
index a1d207f2fa68e0c26f54267539ab169dfd40bff0..ec94ecdb103dcfa508ce105a1b9e2bf805c76317 100644 (file)
@@ -214,14 +214,15 @@ static int  smsc_ircc_probe_transceiver_smsc_ircc_atc(int fir_base);
 
 /* Power Management */
 
-static int smsc_ircc_suspend(struct device *dev, pm_message_t state);
-static int smsc_ircc_resume(struct device *dev);
+static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state);
+static int smsc_ircc_resume(struct platform_device *dev);
 
-static struct device_driver smsc_ircc_driver = {
-       .name           = SMSC_IRCC2_DRIVER_NAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver smsc_ircc_driver = {
        .suspend        = smsc_ircc_suspend,
        .resume         = smsc_ircc_resume,
+       .driver         = {
+               .name   = SMSC_IRCC2_DRIVER_NAME,
+       },
 };
 
 /* Transceivers for SMSC-ircc */
@@ -346,7 +347,7 @@ static int __init smsc_ircc_init(void)
 
        IRDA_DEBUG(1, "%s\n", __FUNCTION__);
 
-       ret = driver_register(&smsc_ircc_driver);
+       ret = platform_driver_register(&smsc_ircc_driver);
        if (ret) {
                IRDA_ERROR("%s, Can't register driver!\n", driver_name);
                return ret;
@@ -378,7 +379,7 @@ static int __init smsc_ircc_init(void)
        }
 
        if (ret)
-               driver_unregister(&smsc_ircc_driver);
+               platform_driver_unregister(&smsc_ircc_driver);
 
        return ret;
 }
@@ -491,7 +492,7 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u
                err = PTR_ERR(self->pldev);
                goto err_out5;
        }
-       dev_set_drvdata(&self->pldev->dev, self);
+       platform_set_drvdata(self->pldev, self);
 
        IRDA_MESSAGE("IrDA: Registered device %s\n", dev->name);
        dev_count++;
@@ -1685,9 +1686,9 @@ static int smsc_ircc_net_close(struct net_device *dev)
        return 0;
 }
 
-static int smsc_ircc_suspend(struct device *dev, pm_message_t state)
+static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct smsc_ircc_cb *self = dev_get_drvdata(dev);
+       struct smsc_ircc_cb *self = platform_get_drvdata(dev);
 
        if (!self->io.suspended) {
                IRDA_DEBUG(1, "%s, Suspending\n", driver_name);
@@ -1706,9 +1707,9 @@ static int smsc_ircc_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int smsc_ircc_resume(struct device *dev)
+static int smsc_ircc_resume(struct platform_device *dev)
 {
-       struct smsc_ircc_cb *self = dev_get_drvdata(dev);
+       struct smsc_ircc_cb *self = platform_get_drvdata(dev);
 
        if (self->io.suspended) {
                IRDA_DEBUG(1, "%s, Waking up\n", driver_name);
@@ -1788,7 +1789,7 @@ static void __exit smsc_ircc_cleanup(void)
                        smsc_ircc_close(dev_self[i]);
        }
 
-       driver_unregister(&smsc_ircc_driver);
+       platform_driver_unregister(&smsc_ircc_driver);
 }
 
 /*
index 2fb3101cb33e65a0f633a43edfdcf1c160d54fd6..b039bd89ceb953ee88c5150ae1329b1913c12cd2 100644 (file)
@@ -194,7 +194,7 @@ out:
  * Probe for a SONIC ethernet controller on a Mips Jazz board.
  * Actually probing is superfluous but we're paranoid.
  */
-static int __init jazz_sonic_probe(struct device *device)
+static int __init jazz_sonic_probe(struct platform_device *pdev)
 {
        struct net_device *dev;
        struct sonic_local *lp;
@@ -212,8 +212,8 @@ static int __init jazz_sonic_probe(struct device *device)
                return -ENOMEM;
 
        lp = netdev_priv(dev);
-       lp->device = device;
-       SET_NETDEV_DEV(dev, device);
+       lp->device = &pdev->dev;
+       SET_NETDEV_DEV(dev, &pdev->dev);
        SET_MODULE_OWNER(dev);
 
        netdev_boot_setup_check(dev);
@@ -264,9 +264,9 @@ MODULE_PARM_DESC(sonic_debug, "jazzsonic debug level (1-4)");
 
 #include "sonic.c"
 
-static int __devexit jazz_sonic_device_remove (struct device *device)
+static int __devexit jazz_sonic_device_remove (struct platform_device *pdev)
 {
-       struct net_device *dev = device->driver_data;
+       struct net_device *dev = platform_get_drvdata(pdev);
        struct sonic_local* lp = netdev_priv(dev);
 
        unregister_netdev (dev);
@@ -278,18 +278,19 @@ static int __devexit jazz_sonic_device_remove (struct device *device)
        return 0;
 }
 
-static struct device_driver jazz_sonic_driver = {
-       .name   = jazz_sonic_string,
-       .bus    = &platform_bus_type,
+static struct platform_driver jazz_sonic_driver = {
        .probe  = jazz_sonic_probe,
        .remove = __devexit_p(jazz_sonic_device_remove),
+       .driver = {
+               .name   = jazz_sonic_string,
+       },
 };
 
 static int __init jazz_sonic_init_module(void)
 {
        int err;
 
-       if ((err = driver_register(&jazz_sonic_driver))) {
+       if ((err = platform_driver_register(&jazz_sonic_driver))) {
                printk(KERN_ERR "Driver registration failed\n");
                return err;
        }
@@ -313,7 +314,7 @@ out_unregister:
 
 static void __exit jazz_sonic_cleanup_module(void)
 {
-       driver_unregister(&jazz_sonic_driver);
+       platform_driver_unregister(&jazz_sonic_driver);
 
        if (jazz_sonic_device) {
                platform_device_unregister(jazz_sonic_device);
index 9ef4592aca036ded3fdc3118bc2dc88b1888ba87..02d5c6822733440f3c78b8e2b1b6c5f8787707a9 100644 (file)
@@ -525,7 +525,7 @@ int __init mac_nubus_sonic_probe(struct net_device* dev)
        return macsonic_init(dev);
 }
 
-static int __init mac_sonic_probe(struct device *device)
+static int __init mac_sonic_probe(struct platform_device *device)
 {
        struct net_device *dev;
        struct sonic_local *lp;
@@ -537,8 +537,8 @@ static int __init mac_sonic_probe(struct device *device)
                return -ENOMEM;
 
        lp = netdev_priv(dev);
-       lp->device = device;
-       SET_NETDEV_DEV(dev, device);
+       lp->device = &device->dev;
+       SET_NETDEV_DEV(dev, &device->dev);
        SET_MODULE_OWNER(dev);
 
        /* This will catch fatal stuff like -ENOMEM as well as success */
@@ -579,9 +579,9 @@ MODULE_PARM_DESC(sonic_debug, "macsonic debug level (1-4)");
 
 #include "sonic.c"
 
-static int __devexit mac_sonic_device_remove (struct device *device)
+static int __devexit mac_sonic_device_remove (struct platform_device *device)
 {
-       struct net_device *dev = device->driver_data;
+       struct net_device *dev = platform_get_drvdata(device);
        struct sonic_local* lp = netdev_priv(dev);
 
        unregister_netdev (dev);
@@ -592,18 +592,19 @@ static int __devexit mac_sonic_device_remove (struct device *device)
        return 0;
 }
 
-static struct device_driver mac_sonic_driver = {
-       .name   = mac_sonic_string,
-       .bus    = &platform_bus_type,
+static struct platform_driver mac_sonic_driver = {
        .probe  = mac_sonic_probe,
        .remove = __devexit_p(mac_sonic_device_remove),
+       .driver = {
+               .name = mac_sonic_string,
+       },
 };
 
 static int __init mac_sonic_init_module(void)
 {
        int err;
 
-       if ((err = driver_register(&mac_sonic_driver))) {
+       if ((err = platform_driver_register(&mac_sonic_driver))) {
                printk(KERN_ERR "Driver registration failed\n");
                return err;
        }
@@ -628,7 +629,7 @@ out_unregister:
 
 static void __exit mac_sonic_cleanup_module(void)
 {
-       driver_unregister(&mac_sonic_driver);
+       platform_driver_unregister(&mac_sonic_driver);
 
        if (mac_sonic_device) {
                platform_device_unregister(mac_sonic_device);
index 71f2c6705bc32ba018788e0283c76e71871af507..3cb9b3fe0cf144000aa69ae7f11a1778c7608e39 100644 (file)
@@ -1387,9 +1387,8 @@ static void mv643xx_netpoll(struct net_device *netdev)
  * Input :     struct device *
  * Output :    -ENOMEM if failed , 0 if success
  */
-static int mv643xx_eth_probe(struct device *ddev)
+static int mv643xx_eth_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct mv643xx_eth_platform_data *pd;
        int port_num = pdev->id;
        struct mv643xx_private *mp;
@@ -1402,7 +1401,7 @@ static int mv643xx_eth_probe(struct device *ddev)
        if (!dev)
                return -ENOMEM;
 
-       dev_set_drvdata(ddev, dev);
+       platform_set_drvdata(pdev, dev);
 
        mp = netdev_priv(dev);
 
@@ -1546,21 +1545,20 @@ out:
        return err;
 }
 
-static int mv643xx_eth_remove(struct device *ddev)
+static int mv643xx_eth_remove(struct platform_device *pdev)
 {
-       struct net_device *dev = dev_get_drvdata(ddev);
+       struct net_device *dev = platform_get_drvdata(pdev);
 
        unregister_netdev(dev);
        flush_scheduled_work();
 
        free_netdev(dev);
-       dev_set_drvdata(ddev, NULL);
+       platform_set_drvdata(pdev, NULL);
        return 0;
 }
 
-static int mv643xx_eth_shared_probe(struct device *ddev)
+static int mv643xx_eth_shared_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(ddev);
        struct resource *res;
 
        printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n");
@@ -1578,7 +1576,7 @@ static int mv643xx_eth_shared_probe(struct device *ddev)
 
 }
 
-static int mv643xx_eth_shared_remove(struct device *ddev)
+static int mv643xx_eth_shared_remove(struct platform_device *pdev)
 {
        iounmap(mv643xx_eth_shared_base);
        mv643xx_eth_shared_base = NULL;
@@ -1586,18 +1584,20 @@ static int mv643xx_eth_shared_remove(struct device *ddev)
        return 0;
 }
 
-static struct device_driver mv643xx_eth_driver = {
-       .name = MV643XX_ETH_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv643xx_eth_driver = {
        .probe = mv643xx_eth_probe,
        .remove = mv643xx_eth_remove,
+       .driver = {
+               .name = MV643XX_ETH_NAME,
+       },
 };
 
-static struct device_driver mv643xx_eth_shared_driver = {
-       .name = MV643XX_ETH_SHARED_NAME,
-       .bus = &platform_bus_type,
+static struct platform_driver mv643xx_eth_shared_driver = {
        .probe = mv643xx_eth_shared_probe,
        .remove = mv643xx_eth_shared_remove,
+       .driver = {
+               .name = MV643XX_ETH_SHARED_NAME,
+       },
 };
 
 /*
@@ -1613,11 +1613,11 @@ static int __init mv643xx_init_module(void)
 {
        int rc;
 
-       rc = driver_register(&mv643xx_eth_shared_driver);
+       rc = platform_driver_register(&mv643xx_eth_shared_driver);
        if (!rc) {
-               rc = driver_register(&mv643xx_eth_driver);
+               rc = platform_driver_register(&mv643xx_eth_driver);
                if (rc)
-                       driver_unregister(&mv643xx_eth_shared_driver);
+                       platform_driver_unregister(&mv643xx_eth_shared_driver);
        }
        return rc;
 }
@@ -1633,8 +1633,8 @@ static int __init mv643xx_init_module(void)
  */
 static void __exit mv643xx_cleanup_module(void)
 {
-       driver_unregister(&mv643xx_eth_driver);
-       driver_unregister(&mv643xx_eth_shared_driver);
+       platform_driver_unregister(&mv643xx_eth_driver);
+       platform_driver_unregister(&mv643xx_eth_shared_driver);
 }
 
 module_init(mv643xx_init_module);
index 159b56a56ef49112fc5e58083c76a3066eb76958..14a76f7cf900fa86493ba745bf9fe1bbabb23c6c 100644 (file)
@@ -1346,10 +1346,8 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
        } else {
                if (netif_msg_probe(tp)) {
                        printk(KERN_ERR PFX
-                              "Cannot find PowerManagement capability. "
-                              "Aborting.\n");
+                              "PowerManagement capability not found.\n");
                }
-               goto err_out_mwi;
        }
 
        /* make sure PCI base addr 1 is MMIO */
@@ -2516,7 +2514,7 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
        } while (boguscnt > 0);
 
        if (boguscnt <= 0) {
-               if (net_ratelimit() && netif_msg_intr(tp)) {
+               if (netif_msg_intr(tp) && net_ratelimit() ) {
                        printk(KERN_WARNING
                               "%s: Too much work at interrupt!\n", dev->name);
                }
index 110e777f206e6199eaa3334b07aaf80cb85ef3ba..b2acedbefa8ffb2b63413e1d097ce29c8ca085c2 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
- *
- * ########################################################################
+ * Copyright (C) 2000, 2005  MIPS Technologies, Inc.  All rights reserved.
+ *     Authors: Carsten Langgaard <carstenl@mips.com>
+ *              Maciej W. Rozycki <macro@mips.com>
+ * Copyright (C) 2004 Ralf Baechle <ralf@linux-mips.org>
  *
  *  This program is free software; you can distribute it and/or modify it
  *  under the terms of the GNU General Public License (Version 2) as
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  *
- * ########################################################################
- *
  * SAA9730 ethernet driver.
  *
  * Changes:
- * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API (pci_driver).
- *                                          Conversion to spinlocks.
- *                                          Error handling fixes.
- *                                           
+ * Angelo Dell'Aera <buffer@antifork.org> :    Conversion to the new PCI API
+ *                                             (pci_driver).
+ *                                             Conversion to spinlocks.
+ *                                             Error handling fixes.
  */
 
 #include <linux/init.h>
 #include <linux/skbuff.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
+#include <linux/types.h>
 
 #include <asm/addrspace.h>
+#include <asm/io.h>
+
 #include <asm/mips-boards/prom.h>
 
 #include "saa9730.h"
@@ -51,8 +52,8 @@ int lan_saa9730_debug;
 #define DRV_MODULE_NAME "saa9730"
 
 static struct pci_device_id saa9730_pci_tbl[] = {
-       { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9370,
-          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+       { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9730,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { 0, }
 };
 
@@ -61,50 +62,48 @@ MODULE_DEVICE_TABLE(pci, saa9730_pci_tbl);
 /* Non-zero only if the current card is a PCI with BIOS-set IRQ. */
 static unsigned int pci_irq_line;
 
-#define INL(a)     inl((unsigned long)a)
-#define OUTL(x,a)  outl(x,(unsigned long)a)
-
 static void evm_saa9730_enable_lan_int(struct lan_saa9730_private *lp)
 {
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptBlock1);
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptStatus1);
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT |
+       outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT |
             EVM_MASTER_EN, &lp->evm_saa9730_regs->InterruptEnable1);
 }
+
 static void evm_saa9730_disable_lan_int(struct lan_saa9730_private *lp)
 {
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptBlock1);
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptEnable1);
 }
 
 static void evm_saa9730_clear_lan_int(struct lan_saa9730_private *lp)
 {
-       OUTL(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1);
+       outl(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1);
 }
 
 static void evm_saa9730_block_lan_int(struct lan_saa9730_private *lp)
 {
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptBlock1);
 }
 
 static void evm_saa9730_unblock_lan_int(struct lan_saa9730_private *lp)
 {
-       OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
+       outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
             &lp->evm_saa9730_regs->InterruptBlock1);
 }
 
-static void show_saa9730_regs(struct lan_saa9730_private *lp)
+static void __attribute_used__ show_saa9730_regs(struct lan_saa9730_private *lp)
 {
        int i, j;
-       printk("TxmBufferA = %x\n", lp->TxmBuffer[0][0]);
-       printk("TxmBufferB = %x\n", lp->TxmBuffer[1][0]);
-       printk("RcvBufferA = %x\n", lp->RcvBuffer[0][0]);
-       printk("RcvBufferB = %x\n", lp->RcvBuffer[1][0]);
+       printk("TxmBufferA = %p\n", lp->TxmBuffer[0][0]);
+       printk("TxmBufferB = %p\n", lp->TxmBuffer[1][0]);
+       printk("RcvBufferA = %p\n", lp->RcvBuffer[0][0]);
+       printk("RcvBufferB = %p\n", lp->RcvBuffer[1][0]);
        for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
                for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) {
                        printk("TxmBuffer[%d][%d] = %x\n", i, j,
@@ -120,13 +119,13 @@ static void show_saa9730_regs(struct lan_saa9730_private *lp)
                }
        }
        printk("lp->evm_saa9730_regs->InterruptBlock1 = %x\n",
-              INL(&lp->evm_saa9730_regs->InterruptBlock1));
+              readl(&lp->evm_saa9730_regs->InterruptBlock1));
        printk("lp->evm_saa9730_regs->InterruptStatus1 = %x\n",
-              INL(&lp->evm_saa9730_regs->InterruptStatus1));
+              readl(&lp->evm_saa9730_regs->InterruptStatus1));
        printk("lp->evm_saa9730_regs->InterruptEnable1 = %x\n",
-              INL(&lp->evm_saa9730_regs->InterruptEnable1));
+              readl(&lp->evm_saa9730_regs->InterruptEnable1));
        printk("lp->lan_saa9730_regs->Ok2Use = %x\n",
-              INL(&lp->lan_saa9730_regs->Ok2Use));
+              readl(&lp->lan_saa9730_regs->Ok2Use));
        printk("lp->NextTxmBufferIndex = %x\n", lp->NextTxmBufferIndex);
        printk("lp->NextTxmPacketIndex = %x\n", lp->NextTxmPacketIndex);
        printk("lp->PendingTxmBufferIndex = %x\n",
@@ -134,23 +133,23 @@ static void show_saa9730_regs(struct lan_saa9730_private *lp)
        printk("lp->PendingTxmPacketIndex = %x\n",
               lp->PendingTxmPacketIndex);
        printk("lp->lan_saa9730_regs->LanDmaCtl = %x\n",
-              INL(&lp->lan_saa9730_regs->LanDmaCtl));
+              readl(&lp->lan_saa9730_regs->LanDmaCtl));
        printk("lp->lan_saa9730_regs->DmaStatus = %x\n",
-              INL(&lp->lan_saa9730_regs->DmaStatus));
+              readl(&lp->lan_saa9730_regs->DmaStatus));
        printk("lp->lan_saa9730_regs->CamCtl = %x\n",
-              INL(&lp->lan_saa9730_regs->CamCtl));
+              readl(&lp->lan_saa9730_regs->CamCtl));
        printk("lp->lan_saa9730_regs->TxCtl = %x\n",
-              INL(&lp->lan_saa9730_regs->TxCtl));
+              readl(&lp->lan_saa9730_regs->TxCtl));
        printk("lp->lan_saa9730_regs->TxStatus = %x\n",
-              INL(&lp->lan_saa9730_regs->TxStatus));
+              readl(&lp->lan_saa9730_regs->TxStatus));
        printk("lp->lan_saa9730_regs->RxCtl = %x\n",
-              INL(&lp->lan_saa9730_regs->RxCtl));
+              readl(&lp->lan_saa9730_regs->RxCtl));
        printk("lp->lan_saa9730_regs->RxStatus = %x\n",
-              INL(&lp->lan_saa9730_regs->RxStatus));
+              readl(&lp->lan_saa9730_regs->RxStatus));
        for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) {
-               OUTL(i, &lp->lan_saa9730_regs->CamAddress);
+               outl(i, &lp->lan_saa9730_regs->CamAddress);
                printk("lp->lan_saa9730_regs->CamData = %x\n",
-                      INL(&lp->lan_saa9730_regs->CamData));
+                      readl(&lp->lan_saa9730_regs->CamData));
        }
        printk("lp->stats.tx_packets = %lx\n", lp->stats.tx_packets);
        printk("lp->stats.tx_errors = %lx\n", lp->stats.tx_errors);
@@ -178,17 +177,17 @@ static void show_saa9730_regs(struct lan_saa9730_private *lp)
               lp->stats.rx_length_errors);
 
        printk("lp->lan_saa9730_regs->DebugPCIMasterAddr = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugPCIMasterAddr));
+              readl(&lp->lan_saa9730_regs->DebugPCIMasterAddr));
        printk("lp->lan_saa9730_regs->DebugLanTxStateMachine = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugLanTxStateMachine));
+              readl(&lp->lan_saa9730_regs->DebugLanTxStateMachine));
        printk("lp->lan_saa9730_regs->DebugLanRxStateMachine = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugLanRxStateMachine));
+              readl(&lp->lan_saa9730_regs->DebugLanRxStateMachine));
        printk("lp->lan_saa9730_regs->DebugLanTxFifoPointers = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugLanTxFifoPointers));
+              readl(&lp->lan_saa9730_regs->DebugLanTxFifoPointers));
        printk("lp->lan_saa9730_regs->DebugLanRxFifoPointers = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugLanRxFifoPointers));
+              readl(&lp->lan_saa9730_regs->DebugLanRxFifoPointers));
        printk("lp->lan_saa9730_regs->DebugLanCtlStateMachine = %x\n",
-              INL(&lp->lan_saa9730_regs->DebugLanCtlStateMachine));
+              readl(&lp->lan_saa9730_regs->DebugLanCtlStateMachine));
 }
 
 static void lan_saa9730_buffer_init(struct lan_saa9730_private *lp)
@@ -214,98 +213,108 @@ static void lan_saa9730_buffer_init(struct lan_saa9730_private *lp)
        }
 }
 
-static int lan_saa9730_allocate_buffers(struct lan_saa9730_private *lp)
+static void lan_saa9730_free_buffers(struct pci_dev *pdev,
+                                    struct lan_saa9730_private *lp)
 {
-       unsigned int mem_size;
-       void *Pa;
-       unsigned int i, j, RcvBufferSize, TxmBufferSize;
-       unsigned int buffer_start;
+       pci_free_consistent(pdev, lp->buffer_size, lp->buffer_start,
+                           lp->dma_addr);
+}
 
-       /* 
-        * Allocate all RX and TX packets in one chunk. 
-        * The Rx and Tx packets must be PACKET_SIZE aligned.
-        */
-       mem_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) *
-                   LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) +
-           LAN_SAA9730_PACKET_SIZE;
-       buffer_start =
-           (unsigned int) kmalloc(mem_size, GFP_DMA | GFP_KERNEL);
-
-       if (!buffer_start)
-               return -ENOMEM;
-
-       /* 
-        * Set DMA buffer to kseg1 (uncached).
-        * Make sure to flush before using it uncached.
-        */
-       Pa = (void *) KSEG1ADDR((buffer_start + LAN_SAA9730_PACKET_SIZE) &
-                               ~(LAN_SAA9730_PACKET_SIZE - 1));
-       dma_cache_wback_inv((unsigned long) Pa, mem_size);
+static int lan_saa9730_allocate_buffers(struct pci_dev *pdev,
+                                       struct lan_saa9730_private *lp)
+{
+       void *Pa;
+       unsigned int i, j, rxoffset, txoffset;
+       int ret;
 
        /* Initialize buffer space */
-       RcvBufferSize = LAN_SAA9730_PACKET_SIZE;
-       TxmBufferSize = LAN_SAA9730_PACKET_SIZE;
        lp->DmaRcvPackets = LAN_SAA9730_RCV_Q_SIZE;
        lp->DmaTxmPackets = LAN_SAA9730_TXM_Q_SIZE;
 
+       /* Initialize Rx Buffer Index */
+       lp->NextRcvPacketIndex = 0;
+       lp->NextRcvBufferIndex = 0;
+
+       /* Set current buffer index & next available packet index */
+       lp->NextTxmPacketIndex = 0;
+       lp->NextTxmBufferIndex = 0;
+       lp->PendingTxmPacketIndex = 0;
+       lp->PendingTxmBufferIndex = 0;
+
+       /*
+        * Allocate all RX and TX packets in one chunk.
+        * The Rx and Tx packets must be PACKET_SIZE aligned.
+        */
+       lp->buffer_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) *
+                          LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) +
+                         LAN_SAA9730_PACKET_SIZE;
+       lp->buffer_start = pci_alloc_consistent(pdev, lp->buffer_size,
+                                               &lp->dma_addr);
+       if (!lp->buffer_start) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       Pa = (void *)ALIGN((unsigned long)lp->buffer_start,
+                          LAN_SAA9730_PACKET_SIZE);
+
+       rxoffset = Pa - lp->buffer_start;
+
        /* Init RX buffers */
        for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
                for (j = 0; j < LAN_SAA9730_RCV_Q_SIZE; j++) {
                        *(unsigned int *) Pa =
                            cpu_to_le32(RXSF_READY <<
                                        RX_STAT_CTL_OWNER_SHF);
-                       lp->RcvBuffer[i][j] = (unsigned int) Pa;
-                       Pa += RcvBufferSize;
+                       lp->RcvBuffer[i][j] = Pa;
+                       Pa += LAN_SAA9730_PACKET_SIZE;
                }
        }
 
+       txoffset = Pa - lp->buffer_start;
+
        /* Init TX buffers */
        for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
                for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) {
                        *(unsigned int *) Pa =
                            cpu_to_le32(TXSF_EMPTY <<
                                        TX_STAT_CTL_OWNER_SHF);
-                       lp->TxmBuffer[i][j] = (unsigned int) Pa;
-                       Pa += TxmBufferSize;
+                       lp->TxmBuffer[i][j] = Pa;
+                       Pa += LAN_SAA9730_PACKET_SIZE;
                }
        }
 
-       /* 
-        * Set rx buffer A and rx buffer B to point to the first two buffer 
+       /*
+        * Set rx buffer A and rx buffer B to point to the first two buffer
         * spaces.
         */
-       OUTL(PHYSADDR(lp->RcvBuffer[0][0]),
+       outl(lp->dma_addr + rxoffset,
             &lp->lan_saa9730_regs->RxBuffA);
-       OUTL(PHYSADDR(lp->RcvBuffer[1][0]),
+       outl(lp->dma_addr + rxoffset +
+            LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_RCV_Q_SIZE,
             &lp->lan_saa9730_regs->RxBuffB);
 
-       /* Initialize Buffer Index */
-       lp->NextRcvPacketIndex = 0;
-       lp->NextRcvToUseIsA = 1;
-
-       /* Set current buffer index & next availble packet index */
-       lp->NextTxmPacketIndex = 0;
-       lp->NextTxmBufferIndex = 0;
-       lp->PendingTxmPacketIndex = 0;
-       lp->PendingTxmBufferIndex = 0;
-
-       /* 
+       /*
         * Set txm_buf_a and txm_buf_b to point to the first two buffer
-        * space 
+        * space
         */
-       OUTL(PHYSADDR(lp->TxmBuffer[0][0]),
+       outl(lp->dma_addr + txoffset,
             &lp->lan_saa9730_regs->TxBuffA);
-       OUTL(PHYSADDR(lp->TxmBuffer[1][0]),
+       outl(lp->dma_addr + txoffset +
+            LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_TXM_Q_SIZE,
             &lp->lan_saa9730_regs->TxBuffB);
 
        /* Set packet number */
-       OUTL((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) |
+       outl((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) |
             (lp->DmaRcvPackets << PK_COUNT_RX_B_SHF) |
             (lp->DmaTxmPackets << PK_COUNT_TX_A_SHF) |
             (lp->DmaTxmPackets << PK_COUNT_TX_B_SHF),
             &lp->lan_saa9730_regs->PacketCount);
 
        return 0;
+
+out:
+       return ret;
 }
 
 static int lan_saa9730_cam_load(struct lan_saa9730_private *lp)
@@ -317,8 +326,8 @@ static int lan_saa9730_cam_load(struct lan_saa9730_private *lp)
 
        for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) {
                /* First set address to where data is written */
-               OUTL(i, &lp->lan_saa9730_regs->CamAddress);
-               OUTL((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16)
+               outl(i, &lp->lan_saa9730_regs->CamAddress);
+               outl((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16)
                     | (NetworkAddress[2] << 8) | NetworkAddress[3],
                     &lp->lan_saa9730_regs->CamData);
                NetworkAddress += 4;
@@ -328,8 +337,7 @@ static int lan_saa9730_cam_load(struct lan_saa9730_private *lp)
 
 static int lan_saa9730_cam_init(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
        unsigned int i;
 
        /* Copy MAC-address into all entries. */
@@ -347,7 +355,7 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
 
        /* Check link status, spin here till station is not busy. */
        i = 0;
-       while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
+       while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
                i++;
                if (i > 100) {
                        printk("Error: lan_saa9730_mii_init: timeout\n");
@@ -357,12 +365,12 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
        }
 
        /* Now set the control and address register. */
-       OUTL(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF,
+       outl(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF,
             &lp->lan_saa9730_regs->StationMgmtCtl);
 
        /* check link status, spin here till station is not busy */
        i = 0;
-       while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
+       while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
                i++;
                if (i > 100) {
                        printk("Error: lan_saa9730_mii_init: timeout\n");
@@ -375,7 +383,7 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
        mdelay(1);
 
        /* Check the link status. */
-       if (INL(&lp->lan_saa9730_regs->StationMgmtData) &
+       if (readl(&lp->lan_saa9730_regs->StationMgmtData) &
            PHY_STATUS_LINK_UP) {
                /* Link is up. */
                return 0;
@@ -383,14 +391,14 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
                /* Link is down, reset the PHY first. */
 
                /* set PHY address = 'CONTROL' */
-               OUTL(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL,
+               outl(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL,
                     &lp->lan_saa9730_regs->StationMgmtCtl);
 
                /* Wait for 1 ms. */
                mdelay(1);
 
                /* set 'CONTROL' = force reset and renegotiate */
-               OUTL(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG |
+               outl(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG |
                     PHY_CONTROL_RESTART_AUTO_NEG,
                     &lp->lan_saa9730_regs->StationMgmtData);
 
@@ -398,12 +406,12 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
                mdelay(50);
 
                /* set 'BUSY' to start operation */
-               OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR |
+               outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR |
                     PHY_CONTROL, &lp->lan_saa9730_regs->StationMgmtCtl);
 
                /* await completion */
                i = 0;
-               while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) &
+               while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) &
                       MD_CA_BUSY) {
                        i++;
                        if (i > 100) {
@@ -419,13 +427,13 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
 
                for (l = 0; l < 2; l++) {
                        /* set PHY address = 'STATUS' */
-                       OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF |
+                       outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF |
                             PHY_STATUS,
                             &lp->lan_saa9730_regs->StationMgmtCtl);
 
                        /* await completion */
                        i = 0;
-                       while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) &
+                       while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) &
                               MD_CA_BUSY) {
                                i++;
                                if (i > 100) {
@@ -440,7 +448,7 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
                        mdelay(3000);
 
                        /* check the link status */
-                       if (INL(&lp->lan_saa9730_regs->StationMgmtData) &
+                       if (readl(&lp->lan_saa9730_regs->StationMgmtData) &
                            PHY_STATUS_LINK_UP) {
                                /* link is up */
                                break;
@@ -454,7 +462,7 @@ static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
 static int lan_saa9730_control_init(struct lan_saa9730_private *lp)
 {
        /* Initialize DMA control register. */
-       OUTL((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) |
+       outl((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) |
             (LANEND_LITTLE << DMA_CTL_ENDIAN_SHF) |
             (LAN_SAA9730_RCV_Q_INT_THRESHOLD << DMA_CTL_RX_INT_COUNT_SHF)
             | DMA_CTL_RX_INT_TO_EN | DMA_CTL_RX_INT_EN |
@@ -462,27 +470,27 @@ static int lan_saa9730_control_init(struct lan_saa9730_private *lp)
             &lp->lan_saa9730_regs->LanDmaCtl);
 
        /* Initial MAC control register. */
-       OUTL((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP,
+       outl((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP,
             &lp->lan_saa9730_regs->MacCtl);
 
        /* Initialize CAM control register. */
-       OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC,
+       outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC,
             &lp->lan_saa9730_regs->CamCtl);
 
-       /* 
+       /*
         * Initialize CAM enable register, only turn on first entry, should
-        * contain own addr. 
+        * contain own addr.
         */
-       OUTL(0x0001, &lp->lan_saa9730_regs->CamEnable);
+       outl(0x0001, &lp->lan_saa9730_regs->CamEnable);
 
        /* Initialize Tx control register */
-       OUTL(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl);
+       outl(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl);
 
        /* Initialize Rcv control register */
-       OUTL(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl);
+       outl(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl);
 
        /* Reset DMA engine */
-       OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
+       outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
 
        return 0;
 }
@@ -492,21 +500,21 @@ static int lan_saa9730_stop(struct lan_saa9730_private *lp)
        int i;
 
        /* Stop DMA first */
-       OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) &
+       outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) &
             ~(DMA_CTL_EN_TX_DMA | DMA_CTL_EN_RX_DMA),
             &lp->lan_saa9730_regs->LanDmaCtl);
 
        /* Set the SW Reset bits in DMA and MAC control registers */
-       OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
-       OUTL(INL(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET,
+       outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
+       outl(readl(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET,
             &lp->lan_saa9730_regs->MacCtl);
 
-       /* 
+       /*
         * Wait for MAC reset to have finished. The reset bit is auto cleared
         * when the reset is done.
         */
        i = 0;
-       while (INL(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) {
+       while (readl(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) {
                i++;
                if (i > 100) {
                        printk
@@ -524,7 +532,7 @@ static int lan_saa9730_dma_init(struct lan_saa9730_private *lp)
        /* Stop lan controller. */
        lan_saa9730_stop(lp);
 
-       OUTL(LAN_SAA9730_DEFAULT_TIME_OUT_CNT,
+       outl(LAN_SAA9730_DEFAULT_TIME_OUT_CNT,
             &lp->lan_saa9730_regs->Timeout);
 
        return 0;
@@ -536,28 +544,27 @@ static int lan_saa9730_start(struct lan_saa9730_private *lp)
 
        /* Initialize Rx Buffer Index */
        lp->NextRcvPacketIndex = 0;
-       lp->NextRcvToUseIsA = 1;
+       lp->NextRcvBufferIndex = 0;
 
-       /* Set current buffer index & next availble packet index */
+       /* Set current buffer index & next available packet index */
        lp->NextTxmPacketIndex = 0;
        lp->NextTxmBufferIndex = 0;
        lp->PendingTxmPacketIndex = 0;
        lp->PendingTxmBufferIndex = 0;
 
-       OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA |
+       outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA |
             DMA_CTL_EN_RX_DMA, &lp->lan_saa9730_regs->LanDmaCtl);
 
        /* For Tx, turn on MAC then DMA */
-       OUTL(INL(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN,
+       outl(readl(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN,
             &lp->lan_saa9730_regs->TxCtl);
 
        /* For Rx, turn on DMA then MAC */
-       OUTL(INL(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN,
+       outl(readl(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN,
             &lp->lan_saa9730_regs->RxCtl);
 
-       /* Set Ok2Use to let hardware owns the buffers */
-       OUTL(OK2USE_RX_A | OK2USE_RX_B | OK2USE_TX_A | OK2USE_TX_B,
-            &lp->lan_saa9730_regs->Ok2Use);
+       /* Set Ok2Use to let hardware own the buffers.  */
+       outl(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use);
 
        return 0;
 }
@@ -572,8 +579,7 @@ static int lan_saa9730_restart(struct lan_saa9730_private *lp)
 
 static int lan_saa9730_tx(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
        unsigned int *pPacket;
        unsigned int tx_status;
 
@@ -581,13 +587,11 @@ static int lan_saa9730_tx(struct net_device *dev)
                printk("lan_saa9730_tx interrupt\n");
 
        /* Clear interrupt. */
-       OUTL(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus);
+       outl(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus);
 
        while (1) {
-               pPacket =
-                   (unsigned int *) lp->TxmBuffer[lp->
-                                                  PendingTxmBufferIndex]
-                   [lp->PendingTxmPacketIndex];
+               pPacket = lp->TxmBuffer[lp->PendingTxmBufferIndex]
+                                      [lp->PendingTxmPacketIndex];
 
                /* Get status of first packet transmitted. */
                tx_status = le32_to_cpu(*pPacket);
@@ -605,23 +609,22 @@ static int lan_saa9730_tx(struct net_device *dev)
                        lp->stats.tx_errors++;
                        if (tx_status &
                            (TX_STATUS_EX_COLL << TX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.tx_aborted_errors++;
+                               lp->stats.tx_aborted_errors++;
                        if (tx_status &
-                           (TX_STATUS_LATE_COLL <<
-                            TX_STAT_CTL_STATUS_SHF)) lp->stats.
-            tx_window_errors++;
+                           (TX_STATUS_LATE_COLL << TX_STAT_CTL_STATUS_SHF))
+                               lp->stats.tx_window_errors++;
                        if (tx_status &
                            (TX_STATUS_L_CARR << TX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.tx_carrier_errors++;
+                               lp->stats.tx_carrier_errors++;
                        if (tx_status &
                            (TX_STATUS_UNDER << TX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.tx_fifo_errors++;
+                               lp->stats.tx_fifo_errors++;
                        if (tx_status &
                            (TX_STATUS_SQ_ERR << TX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.tx_heartbeat_errors++;
+                               lp->stats.tx_heartbeat_errors++;
 
                        lp->stats.collisions +=
-                           tx_status & TX_STATUS_TX_COLL_MSK;
+                               tx_status & TX_STATUS_TX_COLL_MSK;
                }
 
                /* Free buffer. */
@@ -636,21 +639,15 @@ static int lan_saa9730_tx(struct net_device *dev)
                }
        }
 
-       /* Make sure A and B are available to hardware. */
-       OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use);
-
-       if (netif_queue_stopped(dev)) {
-               /* The tx buffer is no longer full. */
-               netif_wake_queue(dev);
-       }
+       /* The tx buffer is no longer full. */
+       netif_wake_queue(dev);
 
        return 0;
 }
 
 static int lan_saa9730_rx(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
        int len = 0;
        struct sk_buff *skb = 0;
        unsigned int rx_status;
@@ -663,16 +660,13 @@ static int lan_saa9730_rx(struct net_device *dev)
                printk("lan_saa9730_rx interrupt\n");
 
        /* Clear receive interrupts. */
-       OUTL(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT |
+       outl(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT |
             DMA_STATUS_RX_TO_INT, &lp->lan_saa9730_regs->DmaStatus);
 
        /* Address next packet */
-       if (lp->NextRcvToUseIsA)
-               BufferIndex = 0;
-       else
-               BufferIndex = 1;
+       BufferIndex = lp->NextRcvBufferIndex;
        PacketIndex = lp->NextRcvPacketIndex;
-       pPacket = (unsigned int *) lp->RcvBuffer[BufferIndex][PacketIndex];
+       pPacket = lp->RcvBuffer[BufferIndex][PacketIndex];
        rx_status = le32_to_cpu(*pPacket);
 
        /* Process each packet. */
@@ -715,51 +709,39 @@ static int lan_saa9730_rx(struct net_device *dev)
                        lp->stats.rx_errors++;
                        if (rx_status &
                            (RX_STATUS_CRC_ERR << RX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.rx_crc_errors++;
+                               lp->stats.rx_crc_errors++;
                        if (rx_status &
-                           (RX_STATUS_ALIGN_ERR <<
-                            RX_STAT_CTL_STATUS_SHF)) lp->stats.
-            rx_frame_errors++;
+                           (RX_STATUS_ALIGN_ERR << RX_STAT_CTL_STATUS_SHF))
+                               lp->stats.rx_frame_errors++;
                        if (rx_status &
                            (RX_STATUS_OVERFLOW << RX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.rx_fifo_errors++;
+                               lp->stats.rx_fifo_errors++;
                        if (rx_status &
                            (RX_STATUS_LONG_ERR << RX_STAT_CTL_STATUS_SHF))
-                                   lp->stats.rx_length_errors++;
+                               lp->stats.rx_length_errors++;
                }
 
                /* Indicate we have processed the buffer. */
-               *pPacket =
-                   cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF);
+               *pPacket = cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF);
+
+               /* Make sure A or B is available to hardware as appropriate. */
+               outl(BufferIndex ? OK2USE_RX_B : OK2USE_RX_A,
+                    &lp->lan_saa9730_regs->Ok2Use);
 
                /* Go to next packet in sequence. */
                lp->NextRcvPacketIndex++;
                if (lp->NextRcvPacketIndex >= LAN_SAA9730_RCV_Q_SIZE) {
                        lp->NextRcvPacketIndex = 0;
-                       if (BufferIndex) {
-                               lp->NextRcvToUseIsA = 1;
-                       } else {
-                               lp->NextRcvToUseIsA = 0;
-                       }
+                       lp->NextRcvBufferIndex ^= 1;
                }
-               OUTL(OK2USE_RX_A | OK2USE_RX_B,
-                    &lp->lan_saa9730_regs->Ok2Use);
 
                /* Address next packet */
-               if (lp->NextRcvToUseIsA)
-                       BufferIndex = 0;
-               else
-                       BufferIndex = 1;
+               BufferIndex = lp->NextRcvBufferIndex;
                PacketIndex = lp->NextRcvPacketIndex;
-               pPacket =
-                   (unsigned int *) lp->
-                   RcvBuffer[BufferIndex][PacketIndex];
+               pPacket = lp->RcvBuffer[BufferIndex][PacketIndex];
                rx_status = le32_to_cpu(*pPacket);
        }
 
-       /* Make sure A and B are available to hardware. */
-       OUTL(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use);
-
        return 0;
 }
 
@@ -767,8 +749,7 @@ static irqreturn_t lan_saa9730_interrupt(const int irq, void *dev_id,
                                  struct pt_regs *regs)
 {
        struct net_device *dev = (struct net_device *) dev_id;
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        if (lan_saa9730_debug > 5)
                printk("lan_saa9730_interrupt\n");
@@ -780,11 +761,11 @@ static irqreturn_t lan_saa9730_interrupt(const int irq, void *dev_id,
        evm_saa9730_clear_lan_int(lp);
 
        /* Service pending transmit interrupts. */
-       if (INL(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT)
+       if (readl(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT)
                lan_saa9730_tx(dev);
 
        /* Service pending receive interrupts. */
-       if (INL(&lp->lan_saa9730_regs->DmaStatus) &
+       if (readl(&lp->lan_saa9730_regs->DmaStatus) &
            (DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT |
             DMA_STATUS_RX_TO_INT)) lan_saa9730_rx(dev);
 
@@ -794,15 +775,9 @@ static irqreturn_t lan_saa9730_interrupt(const int irq, void *dev_id,
        return IRQ_HANDLED;
 }
 
-static int lan_saa9730_open_fail(struct net_device *dev)
-{
-       return -ENODEV;
-}
-
 static int lan_saa9730_open(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        /* Associate IRQ with lan_saa9730_interrupt */
        if (request_irq(dev->irq, &lan_saa9730_interrupt, 0, "SAA9730 Eth",
@@ -834,15 +809,13 @@ static int lan_saa9730_write(struct lan_saa9730_private *lp,
        int PacketIndex;
 
        if (lan_saa9730_debug > 5)
-               printk("lan_saa9730_write: skb=%08x\n",
-                      (unsigned int) skb);
+               printk("lan_saa9730_write: skb=%p\n", skb);
 
        BufferIndex = lp->NextTxmBufferIndex;
        PacketIndex = lp->NextTxmPacketIndex;
 
-       tx_status =
-           le32_to_cpu(*(unsigned int *) lp->
-                       TxmBuffer[BufferIndex][PacketIndex]);
+       tx_status = le32_to_cpu(*(unsigned int *)lp->TxmBuffer[BufferIndex]
+                                                             [PacketIndex]);
        if ((tx_status & TX_STAT_CTL_OWNER_MSK) !=
            (TXSF_EMPTY << TX_STAT_CTL_OWNER_SHF)) {
                if (lan_saa9730_debug > 4)
@@ -858,29 +831,29 @@ static int lan_saa9730_write(struct lan_saa9730_private *lp,
                lp->NextTxmBufferIndex ^= 1;
        }
 
-       pbPacketData =
-           (unsigned char *) lp->TxmBuffer[BufferIndex][PacketIndex];
+       pbPacketData = lp->TxmBuffer[BufferIndex][PacketIndex];
        pbPacketData += 4;
 
        /* copy the bits */
        memcpy(pbPacketData, pbData, len);
 
        /* Set transmit status for hardware */
-       *(unsigned int *) lp->TxmBuffer[BufferIndex][PacketIndex] =
-           cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) |
-                       (TX_STAT_CTL_INT_AFTER_TX << TX_STAT_CTL_FRAME_SHF)
-                       | (len << TX_STAT_CTL_LENGTH_SHF));
-
-       /* Set hardware tx buffer. */
-       OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use);
+       *(unsigned int *)lp->TxmBuffer[BufferIndex][PacketIndex] =
+               cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) |
+                           (TX_STAT_CTL_INT_AFTER_TX <<
+                            TX_STAT_CTL_FRAME_SHF) |
+                           (len << TX_STAT_CTL_LENGTH_SHF));
+
+       /* Make sure A or B is available to hardware as appropriate. */
+       outl(BufferIndex ? OK2USE_TX_B : OK2USE_TX_A,
+            &lp->lan_saa9730_regs->Ok2Use);
 
        return 0;
 }
 
 static void lan_saa9730_tx_timeout(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        /* Transmitter timeout, serious problems */
        lp->stats.tx_errors++;
@@ -889,20 +862,19 @@ static void lan_saa9730_tx_timeout(struct net_device *dev)
        lan_saa9730_restart(lp);
 
        dev->trans_start = jiffies;
-       netif_start_queue(dev);
+       netif_wake_queue(dev);
 }
 
 static int lan_saa9730_start_xmit(struct sk_buff *skb,
                                  struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
        unsigned long flags;
        int skblen;
        int len;
 
        if (lan_saa9730_debug > 4)
-               printk("Send packet: skb=%08x\n", (unsigned int) skb);
+               printk("Send packet: skb=%p\n", skb);
 
        skblen = skb->len;
 
@@ -912,8 +884,7 @@ static int lan_saa9730_start_xmit(struct sk_buff *skb,
 
        if (lan_saa9730_write(lp, skb, skblen)) {
                spin_unlock_irqrestore(&lp->lock, flags);
-               printk("Error when writing packet to controller: skb=%08x\n",
-                    (unsigned int) skb);
+               printk("Error when writing packet to controller: skb=%p\n", skb);
                netif_stop_queue(dev);
                return -1;
        }
@@ -922,7 +893,7 @@ static int lan_saa9730_start_xmit(struct sk_buff *skb,
        lp->stats.tx_packets++;
 
        dev->trans_start = jiffies;
-       netif_start_queue(dev);
+       netif_wake_queue(dev);
        dev_kfree_skb(skb);
 
        spin_unlock_irqrestore(&lp->lock, flags);
@@ -932,8 +903,7 @@ static int lan_saa9730_start_xmit(struct sk_buff *skb,
 
 static int lan_saa9730_close(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        if (lan_saa9730_debug > 1)
                printk("lan_saa9730_close:\n");
@@ -955,33 +925,31 @@ static int lan_saa9730_close(struct net_device *dev)
 static struct net_device_stats *lan_saa9730_get_stats(struct net_device
                                                      *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        return &lp->stats;
 }
 
 static void lan_saa9730_set_multicast(struct net_device *dev)
 {
-       struct lan_saa9730_private *lp =
-           (struct lan_saa9730_private *) dev->priv;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
 
        /* Stop the controller */
        lan_saa9730_stop(lp);
 
        if (dev->flags & IFF_PROMISC) {
                /* accept all packets */
-               OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC |
+               outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC |
                     CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC,
                     &lp->lan_saa9730_regs->CamCtl);
        } else {
                if (dev->flags & IFF_ALLMULTI) {
                        /* accept all multicast packets */
-                       OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC |
+                       outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC |
                             CAM_CONTROL_BROAD_ACC,
                             &lp->lan_saa9730_regs->CamCtl);
                } else {
-                       /* 
+                       /*
                         * Will handle the multicast stuff later. -carstenl
                         */
                }
@@ -993,91 +961,86 @@ static void lan_saa9730_set_multicast(struct net_device *dev)
 
 static void __devexit saa9730_remove_one(struct pci_dev *pdev)
 {
-        struct net_device *dev = pci_get_drvdata(pdev);
-
-        if (dev) {
-                unregister_netdev(dev);
-               kfree(dev->priv);
-                free_netdev(dev);
-                pci_release_regions(pdev);
-                pci_disable_device(pdev);
-                pci_set_drvdata(pdev, NULL);
-        }
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct lan_saa9730_private *lp = netdev_priv(dev);
+
+       if (dev) {
+               unregister_netdev(dev);
+               lan_saa9730_free_buffers(pdev, lp);
+               iounmap(lp->lan_saa9730_regs);
+               iounmap(lp->evm_saa9730_regs);
+               free_netdev(dev);
+               pci_release_regions(pdev);
+               pci_disable_device(pdev);
+               pci_set_drvdata(pdev, NULL);
+       }
 }
 
 
-static int lan_saa9730_init(struct net_device *dev, int ioaddr, int irq)
+static int lan_saa9730_init(struct net_device *dev, struct pci_dev *pdev,
+       unsigned long ioaddr, int irq)
 {
-       struct lan_saa9730_private *lp;
+       struct lan_saa9730_private *lp = netdev_priv(dev);
        unsigned char ethernet_addr[6];
-       int ret = 0;
+       int ret;
 
-       dev->open = lan_saa9730_open_fail;
+       if (get_ethernet_addr(ethernet_addr)) {
+               ret = -ENODEV;
+               goto out;
+       }
 
-       if (get_ethernet_addr(ethernet_addr))
-               return -ENODEV;
-       
        memcpy(dev->dev_addr, ethernet_addr, 6);
        dev->base_addr = ioaddr;
        dev->irq = irq;
-       
-       /* 
-        * Make certain the data structures used by the controller are aligned 
-        * and DMAble. 
-        */
-       /*
-        *  XXX: that is obviously broken - kfree() won't be happy with us.
-        */
-       lp = (struct lan_saa9730_private *) (((unsigned long)
-                                             kmalloc(sizeof(*lp) + 7,
-                                                     GFP_DMA | GFP_KERNEL)
-                                             + 7) & ~7);
 
-       if (!lp)
-               return -ENOMEM;
-
-       dev->priv = lp;
-       memset(lp, 0, sizeof(*lp));
+       lp->pci_dev = pdev;
 
        /* Set SAA9730 LAN base address. */
-       lp->lan_saa9730_regs = (t_lan_saa9730_regmap *) (ioaddr +
-                                                        SAA9730_LAN_REGS_ADDR);
+       lp->lan_saa9730_regs = ioremap(ioaddr + SAA9730_LAN_REGS_ADDR,
+                                      SAA9730_LAN_REGS_SIZE);
+       if (!lp->lan_saa9730_regs) {
+               ret = -ENOMEM;
+               goto out;
+       }
 
        /* Set SAA9730 EVM base address. */
-       lp->evm_saa9730_regs = (t_evm_saa9730_regmap *) (ioaddr +
-                                                        SAA9730_EVM_REGS_ADDR);
+       lp->evm_saa9730_regs = ioremap(ioaddr + SAA9730_EVM_REGS_ADDR,
+                                      SAA9730_EVM_REGS_SIZE);
+       if (!lp->evm_saa9730_regs) {
+               ret = -ENOMEM;
+               goto out_iounmap_lan;
+       }
 
        /* Allocate LAN RX/TX frame buffer space. */
-       /* FIXME: a leak */
-       if ((ret = lan_saa9730_allocate_buffers(lp)))
-               goto out;
+       if ((ret = lan_saa9730_allocate_buffers(pdev, lp)))
+               goto out_iounmap;
 
        /* Stop LAN controller. */
-       if ((ret = lan_saa9730_stop(lp))) 
-               goto out;
-       
+       if ((ret = lan_saa9730_stop(lp)))
+               goto out_free_consistent;
+
        /* Initialize CAM registers. */
        if ((ret = lan_saa9730_cam_init(dev)))
-               goto out;
+               goto out_free_consistent;
 
        /* Initialize MII registers. */
        if ((ret = lan_saa9730_mii_init(lp)))
-               goto out;
+               goto out_free_consistent;
 
        /* Initialize control registers. */
-       if ((ret = lan_saa9730_control_init(lp))) 
-               goto out;
-        
+       if ((ret = lan_saa9730_control_init(lp)))
+               goto out_free_consistent;
+
        /* Load CAM registers. */
-       if ((ret = lan_saa9730_cam_load(lp))) 
-               goto out;
-       
+       if ((ret = lan_saa9730_cam_load(lp)))
+               goto out_free_consistent;
+
        /* Initialize DMA context registers. */
        if ((ret = lan_saa9730_dma_init(lp)))
-               goto out;
-       
+               goto out_free_consistent;
+
        spin_lock_init(&lp->lock);
-               
+
        dev->open = lan_saa9730_open;
        dev->hard_start_xmit = lan_saa9730_start_xmit;
        dev->stop = lan_saa9730_close;
@@ -1086,44 +1049,43 @@ static int lan_saa9730_init(struct net_device *dev, int ioaddr, int irq)
        dev->tx_timeout = lan_saa9730_tx_timeout;
        dev->watchdog_timeo = (HZ >> 1);
        dev->dma = 0;
-       
-       ret = register_netdev(dev);
+
+       ret = register_netdev (dev);
        if (ret)
-               goto out;
+               goto out_free_consistent;
+
        return 0;
 
- out:
-       kfree(dev->priv);
+out_free_consistent:
+       lan_saa9730_free_buffers(pdev, lp);
+out_iounmap:
+       iounmap(lp->evm_saa9730_regs);
+out_iounmap_lan:
+       iounmap(lp->lan_saa9730_regs);
+out:
        return ret;
 }
 
 
 static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
-       struct net_device *dev;
-       unsigned int pci_ioaddr;
+       struct net_device *dev = NULL;
+       unsigned long pci_ioaddr;
        int err;
 
        if (lan_saa9730_debug > 1)
                printk("saa9730.c: PCI bios is present, checking for devices...\n");
 
-       err = -ENOMEM;
-       dev = alloc_etherdev(0);
-       if (!dev)
-               goto out;
-
-       SET_MODULE_OWNER(dev);
-
        err = pci_enable_device(pdev);
-        if (err) {
-                printk(KERN_ERR "Cannot enable PCI device, aborting.\n");
-                goto out1;
-        }
+       if (err) {
+               printk(KERN_ERR "Cannot enable PCI device, aborting.\n");
+               goto out;
+       }
 
        err = pci_request_regions(pdev, DRV_MODULE_NAME);
        if (err) {
                printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n");
-               goto out2;
+               goto out_disable_pdev;
        }
 
        pci_irq_line = pdev->irq;
@@ -1132,49 +1094,54 @@ static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_dev
        pci_ioaddr = pci_resource_start(pdev, 1);
        pci_set_master(pdev);
 
-       printk("Found SAA9730 (PCI) at %#x, irq %d.\n",
+       printk("Found SAA9730 (PCI) at %lx, irq %d.\n",
               pci_ioaddr, pci_irq_line);
 
-       err = lan_saa9730_init(dev, pci_ioaddr, pci_irq_line);
+       dev = alloc_etherdev(sizeof(struct lan_saa9730_private));
+       if (!dev)
+               goto out_disable_pdev;
+
+       err = lan_saa9730_init(dev, pdev, pci_ioaddr, pci_irq_line);
        if (err) {
-               printk("Lan init failed");
-               goto out2;
+               printk("LAN init failed");
+               goto out_free_netdev;
        }
 
        pci_set_drvdata(pdev, dev);
        SET_NETDEV_DEV(dev, &pdev->dev);
        return 0;
-       
-out2:
-       pci_disable_device(pdev);
-out1:
+
+out_free_netdev:
        free_netdev(dev);
+out_disable_pdev:
+       pci_disable_device(pdev);
 out:
+       pci_set_drvdata(pdev, NULL);
        return err;
 }
 
 
 static struct pci_driver saa9730_driver = {
-       .name           = DRV_MODULE_NAME,
-       .id_table       = saa9730_pci_tbl,
-       .probe          = saa9730_init_one,
-       .remove         = __devexit_p(saa9730_remove_one),
+       .name           = DRV_MODULE_NAME,
+       .id_table       = saa9730_pci_tbl,
+       .probe          = saa9730_init_one,
+       .remove         = __devexit_p(saa9730_remove_one),
 };
 
 
 static int __init saa9730_init(void)
 {
-        return pci_module_init(&saa9730_driver);
+       return pci_module_init(&saa9730_driver);
 }
 
 static void __exit saa9730_cleanup(void)
 {
-        pci_unregister_driver(&saa9730_driver);
+       pci_unregister_driver(&saa9730_driver);
 }
 
 module_init(saa9730_init);
 module_exit(saa9730_cleanup);
 
-
-
+MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
+MODULE_DESCRIPTION("Philips SAA9730 ethernet driver");
 MODULE_LICENSE("GPL");
index 9e9da6b4080fa2ab27b5961d4af9ae1e9761e0da..a7e9d29a86a725ae67fdde869b1b9df2c6511e8e 100644 (file)
@@ -1,6 +1,7 @@
 /*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+ * Copyright (C) 2000, 2005  MIPS Technologies, Inc.  All rights reserved.
+ *     Authors: Carsten Langgaard <carstenl@mips.com>
+ *              Maciej W. Rozycki <macro@mips.com>
  *
  * ########################################################################
  *
 
 /* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */
 #define SAA9730_LAN_REGS_ADDR   0x20400
+#define SAA9730_LAN_REGS_SIZE   0x00400
 
 struct lan_saa9730_regmap {
        volatile unsigned int TxBuffA;                  /* 0x20400 */
@@ -309,6 +311,7 @@ typedef volatile struct lan_saa9730_regmap t_lan_saa9730_regmap;
 
 /* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */
 #define SAA9730_EVM_REGS_ADDR   0x02000
+#define SAA9730_EVM_REGS_SIZE   0x00400
 
 struct evm_saa9730_regmap {
        volatile unsigned int InterruptStatus1;         /* 0x2000 */
@@ -329,16 +332,32 @@ typedef volatile struct evm_saa9730_regmap t_evm_saa9730_regmap;
 
 
 struct lan_saa9730_private {
+       /*
+        * Rx/Tx packet buffers.
+        * The Rx and Tx packets must be PACKET_SIZE aligned.
+        */
+       void            *buffer_start;
+       unsigned int    buffer_size;
+
+       /*
+        * DMA address of beginning of this object, returned
+        * by pci_alloc_consistent().
+        */
+       dma_addr_t      dma_addr;
+
+       /* Pointer to the associated pci device structure */
+       struct pci_dev  *pci_dev;
+
        /* Pointer for the SAA9730 LAN controller register set. */
        t_lan_saa9730_regmap *lan_saa9730_regs;
 
        /* Pointer to the SAA9730 EVM register. */
        t_evm_saa9730_regmap *evm_saa9730_regs;
 
-       /* TRUE if the next buffer to write is RxBuffA,  FALSE if RxBuffB. */
-       unsigned char NextRcvToUseIsA;
        /* Rcv buffer Index. */
        unsigned char NextRcvPacketIndex;
+       /* Next buffer index. */
+       unsigned char NextRcvBufferIndex;
 
        /* Index of next packet to use in that buffer. */
        unsigned char NextTxmPacketIndex;
@@ -353,13 +372,8 @@ struct lan_saa9730_private {
        unsigned char DmaRcvPackets;
        unsigned char DmaTxmPackets;
 
-       unsigned char RcvAIndex;        /* index into RcvBufferSpace[] for Blk A */
-       unsigned char RcvBIndex;        /* index into RcvBufferSpace[] for Blk B */
-
-       unsigned int
-           TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE];
-       unsigned int
-           RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE];
+       void          *TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE];
+       void          *RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE];
        unsigned int TxBufferFree[LAN_SAA9730_BUFFERS];
 
        unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES][6];
index 74d5f1a6fdea262919736ebd9c86f45cd05d0a6e..28bf2e69eb5e1a1c9f181d2810447f8dd30ac10a 100644 (file)
@@ -154,6 +154,12 @@ MODULE_LICENSE("GPL");
  */
 #define MEMORY_WAIT_TIME       16
 
+/*
+ * The maximum number of processing loops allowed for each call to the
+ * IRQ handler.  
+ */
+#define MAX_IRQ_LOOPS          8
+
 /*
  * This selects whether TX packets are sent one by one to the SMC91x internal
  * memory and throttled until transmission completes.  This may prevent
@@ -684,7 +690,6 @@ static void smc_hardware_send_pkt(unsigned long data)
 
        /* queue the packet for TX */
        SMC_SET_MMU_CMD(MC_ENQUEUE);
-       SMC_ACK_INT(IM_TX_EMPTY_INT);
        smc_special_unlock(&lp->lock);
 
        dev->trans_start = jiffies;
@@ -1207,6 +1212,7 @@ static void smc_phy_configure(void *data)
        smc_phy_check_media(dev, 1);
 
 smc_phy_configure_exit:
+       SMC_SELECT_BANK(2);
        spin_unlock_irq(&lp->lock);
        lp->work_pending = 0;
 }
@@ -1305,7 +1311,7 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        SMC_SET_INT_MASK(0);
 
        /* set a timeout value, so I don't stay here forever */
-       timeout = 8;
+       timeout = MAX_IRQ_LOOPS;
 
        do {
                status = SMC_GET_INT();
@@ -1372,10 +1378,13 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        /* restore register states */
        SMC_SET_PTR(saved_pointer);
        SMC_SET_INT_MASK(mask);
-
        spin_unlock(&lp->lock);
 
-       DBG(3, "%s: Interrupt done (%d loops)\n", dev->name, 8-timeout);
+       if (timeout == MAX_IRQ_LOOPS)
+               PRINTK("%s: spurious interrupt (mask = 0x%02x)\n",
+                      dev->name, mask);
+       DBG(3, "%s: Interrupt done (%d loops)\n",
+              dev->name, MAX_IRQ_LOOPS - timeout);
 
        /*
         * We return IRQ_HANDLED unconditionally here even if there was
@@ -2183,9 +2192,8 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device *
  *     0 --> there is a device
  *     anything else, error
  */
-static int smc_drv_probe(struct device *dev)
+static int smc_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct net_device *ndev;
        struct resource *res;
        unsigned int __iomem *addr;
@@ -2212,7 +2220,7 @@ static int smc_drv_probe(struct device *dev)
                goto out_release_io;
        }
        SET_MODULE_OWNER(ndev);
-       SET_NETDEV_DEV(ndev, dev);
+       SET_NETDEV_DEV(ndev, &pdev->dev);
 
        ndev->dma = (unsigned char)-1;
        ndev->irq = platform_get_irq(pdev, 0);
@@ -2233,7 +2241,7 @@ static int smc_drv_probe(struct device *dev)
                goto out_release_attrib;
        }
 
-       dev_set_drvdata(dev, ndev);
+       platform_set_drvdata(pdev, ndev);
        ret = smc_probe(ndev, addr);
        if (ret != 0)
                goto out_iounmap;
@@ -2249,7 +2257,7 @@ static int smc_drv_probe(struct device *dev)
        return 0;
 
  out_iounmap:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        iounmap(addr);
  out_release_attrib:
        smc_release_attrib(pdev);
@@ -2263,14 +2271,13 @@ static int smc_drv_probe(struct device *dev)
        return ret;
 }
 
-static int smc_drv_remove(struct device *dev)
+static int smc_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(pdev);
        struct smc_local *lp = netdev_priv(ndev);
        struct resource *res;
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        unregister_netdev(ndev);
 
@@ -2295,9 +2302,9 @@ static int smc_drv_remove(struct device *dev)
        return 0;
 }
 
-static int smc_drv_suspend(struct device *dev, pm_message_t state)
+static int smc_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                if (netif_running(ndev)) {
@@ -2309,14 +2316,13 @@ static int smc_drv_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int smc_drv_resume(struct device *dev)
+static int smc_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct net_device *ndev = dev_get_drvdata(dev);
+       struct net_device *ndev = platform_get_drvdata(dev);
 
        if (ndev) {
                struct smc_local *lp = netdev_priv(ndev);
-               smc_enable_device(pdev);
+               smc_enable_device(dev);
                if (netif_running(ndev)) {
                        smc_reset(ndev);
                        smc_enable(ndev);
@@ -2328,13 +2334,14 @@ static int smc_drv_resume(struct device *dev)
        return 0;
 }
 
-static struct device_driver smc_driver = {
-       .name           = CARDNAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver smc_driver = {
        .probe          = smc_drv_probe,
        .remove         = smc_drv_remove,
        .suspend        = smc_drv_suspend,
        .resume         = smc_drv_resume,
+       .driver         = {
+               .name   = CARDNAME,
+       },
 };
 
 static int __init smc_init(void)
@@ -2348,12 +2355,12 @@ static int __init smc_init(void)
 #endif
 #endif
 
-       return driver_register(&smc_driver);
+       return platform_driver_register(&smc_driver);
 }
 
 static void __exit smc_cleanup(void)
 {
-       driver_unregister(&smc_driver);
+       platform_driver_unregister(&smc_driver);
 }
 
 module_init(smc_init);
index 817f200742c37132b4982bb0a333ebe76096fcb8..5c2824be4ee6399a73a49cad2fc986e8e704bba1 100644 (file)
 #define SMC_IO_SHIFT           0
 #define SMC_NOWAIT             1
 
-#define SMC_inb(a, r)          inb((a) + (r))
-#define SMC_insb(a, r, p, l)   insb((a) + (r), p, (l))
-#define SMC_inw(a, r)          inw((a) + (r))
-#define SMC_insw(a, r, p, l)   insw((a) + (r), p, l)
-#define SMC_outb(v, a, r)      outb(v, (a) + (r))
-#define SMC_outsb(a, r, p, l)  outsb((a) + (r), p, (l))
-#define SMC_outw(v, a, r)      outw(v, (a) + (r))
-#define SMC_outsw(a, r, p, l)  outsw((a) + (r), p, l)
+#define SMC_inb(a, r)          readb((a) + (r))
+#define SMC_insb(a, r, p, l)   readsb((a) + (r), p, (l))
+#define SMC_inw(a, r)          readw((a) + (r))
+#define SMC_insw(a, r, p, l)   readsw((a) + (r), p, l)
+#define SMC_outb(v, a, r)      writeb(v, (a) + (r))
+#define SMC_outsb(a, r, p, l)  writesb((a) + (r), p, (l))
+#define SMC_outw(v, a, r)      writew(v, (a) + (r))
+#define SMC_outsw(a, r, p, l)  writesw((a) + (r), p, l)
 
 #define set_irq_type(irq, type) do {} while (0)
 
@@ -289,6 +289,38 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l)
 #define RPC_LSA_DEFAULT                RPC_LED_TX_RX
 #define RPC_LSB_DEFAULT                RPC_LED_100_10
 
+#elif defined(CONFIG_SOC_AU1X00)
+
+#include <au1xxx.h>
+
+/* We can only do 16-bit reads and writes in the static memory space. */
+#define SMC_CAN_USE_8BIT       0
+#define SMC_CAN_USE_16BIT      1
+#define SMC_CAN_USE_32BIT      0
+#define SMC_IO_SHIFT           0
+#define SMC_NOWAIT             1
+
+#define SMC_inw(a, r)          au_readw((unsigned long)((a) + (r)))
+#define SMC_insw(a, r, p, l)   \
+       do {    \
+               unsigned long _a = (unsigned long)((a) + (r)); \
+               int _l = (l); \
+               u16 *_p = (u16 *)(p); \
+               while (_l-- > 0) \
+                       *_p++ = au_readw(_a); \
+       } while(0)
+#define SMC_outw(v, a, r)      au_writew(v, (unsigned long)((a) + (r)))
+#define SMC_outsw(a, r, p, l)  \
+       do {    \
+               unsigned long _a = (unsigned long)((a) + (r)); \
+               int _l = (l); \
+               const u16 *_p = (const u16 *)(p); \
+               while (_l-- > 0) \
+                       au_writew(*_p++ , _a); \
+       } while(0)
+
+#define set_irq_type(irq, type) do {} while (0)
+
 #else
 
 #define SMC_CAN_USE_8BIT       1
index c796f41b4a52f3f8c0d91de463bc2dd6cda0cff2..0d765f1733b5cd637e720f2c16369573b4762caf 100644 (file)
@@ -2290,7 +2290,6 @@ spider_net_remove(struct pci_dev *pdev)
 }
 
 static struct pci_driver spider_net_driver = {
-       .owner          = THIS_MODULE,
        .name           = spider_net_driver_name,
        .id_table       = spider_net_pci_tbl,
        .probe          = spider_net_probe,
index de399563a9db2e02ef20d412820a90bc6e6c00e3..081717d01374349ce68386496f0eb079c064be18 100644 (file)
@@ -128,6 +128,8 @@ static struct pci_device_id gem_pci_tbl[] = {
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_SH_SUNGEM,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+       { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID2_GMAC,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        {0, }
 };
 
index d04c918ebef811ad60af0bdede6d5d1047ccb446..4f756960db2ae94281b4eedd9c1b2eec1c4ec4cc 100644 (file)
@@ -344,9 +344,10 @@ module_param_array(dma, int, NULL, 0);
 
 static struct platform_device *proteon_dev[ISATR_MAX_ADAPTERS];
 
-static struct device_driver proteon_driver = {
-       .name           = "proteon",
-       .bus            = &platform_bus_type,
+static struct platform_driver proteon_driver = {
+       .driver         = {
+               .name   = "proteon",
+       },
 };
 
 static int __init proteon_init(void)
@@ -355,7 +356,7 @@ static int __init proteon_init(void)
        struct platform_device *pdev;
        int i, num = 0, err = 0;
 
-       err = driver_register(&proteon_driver);
+       err = platform_driver_register(&proteon_driver);
        if (err)
                return err;
 
@@ -372,7 +373,7 @@ static int __init proteon_init(void)
                err = setup_card(dev, &pdev->dev);
                if (!err) {
                        proteon_dev[i] = pdev;
-                       dev_set_drvdata(&pdev->dev, dev);
+                       platform_set_drvdata(pdev, dev);
                        ++num;
                } else {
                        platform_device_unregister(pdev);
@@ -399,17 +400,17 @@ static void __exit proteon_cleanup(void)
                
                if (!pdev)
                        continue;
-               dev = dev_get_drvdata(&pdev->dev);
+               dev = platform_get_drvdata(pdev);
                unregister_netdev(dev);
                release_region(dev->base_addr, PROTEON_IO_EXTENT);
                free_irq(dev->irq, dev);
                free_dma(dev->dma);
                tmsdev_term(dev);
                free_netdev(dev);
-               dev_set_drvdata(&pdev->dev, NULL);
+               platform_set_drvdata(pdev, NULL);
                platform_device_unregister(pdev);
        }
-       driver_unregister(&proteon_driver);
+       platform_driver_unregister(&proteon_driver);
 }
 
 module_init(proteon_init);
index 72cf708396be3f87e9badd604ee3b5b3ab41c6a2..d6ba41cf3110665ceb3b4a8332921a6baaf28efd 100644 (file)
@@ -354,9 +354,10 @@ module_param_array(dma, int, NULL, 0);
 
 static struct platform_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
 
-static struct device_driver sk_isa_driver = {
-       .name           = "skisa",
-       .bus            = &platform_bus_type,
+static struct platform_driver sk_isa_driver = {
+       .driver         = {
+               .name   = "skisa",
+       },
 };
 
 static int __init sk_isa_init(void)
@@ -365,7 +366,7 @@ static int __init sk_isa_init(void)
        struct platform_device *pdev;
        int i, num = 0, err = 0;
 
-       err = driver_register(&sk_isa_driver);
+       err = platform_driver_register(&sk_isa_driver);
        if (err)
                return err;
 
@@ -382,7 +383,7 @@ static int __init sk_isa_init(void)
                err = setup_card(dev, &pdev->dev);
                if (!err) {
                        sk_isa_dev[i] = pdev;
-                       dev_set_drvdata(&sk_isa_dev[i]->dev, dev);
+                       platform_set_drvdata(sk_isa_dev[i], dev);
                        ++num;
                } else {
                        platform_device_unregister(pdev);
@@ -409,17 +410,17 @@ static void __exit sk_isa_cleanup(void)
 
                if (!pdev)
                        continue;
-               dev = dev_get_drvdata(&pdev->dev);
+               dev = platform_get_drvdata(pdev);
                unregister_netdev(dev);
                release_region(dev->base_addr, SK_ISA_IO_EXTENT);
                free_irq(dev->irq, dev);
                free_dma(dev->dma);
                tmsdev_term(dev);
                free_netdev(dev);
-               dev_set_drvdata(&pdev->dev, NULL);
+               platform_set_drvdata(pdev, NULL);
                platform_device_unregister(pdev);
        }
-       driver_unregister(&sk_isa_driver);
+       platform_driver_unregister(&sk_isa_driver);
 }
 
 module_init(sk_isa_init);
index a01efa6d5c629bd81457a64769f015f75ebea4c7..1fd04662c4fce290534991bee6c8476dc8a7efcd 100644 (file)
@@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb)
                                               "uptime %ud%uh%um%us)\n",
                                               dev->name, days, hrs,
                                               min, sec);
+#if 0
                                        netif_carrier_on(dev);
+#endif
                                        hdlc->state.cisco.up = 1;
                                }
                        }
@@ -225,7 +227,9 @@ static void cisco_timer(unsigned long arg)
                       hdlc->state.cisco.settings.timeout * HZ)) {
                hdlc->state.cisco.up = 0;
                printk(KERN_INFO "%s: Link down\n", dev->name);
+#if 0
                netif_carrier_off(dev);
+#endif
        }
 
        cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ,
@@ -261,8 +265,10 @@ static void cisco_stop(struct net_device *dev)
 {
        hdlc_device *hdlc = dev_to_hdlc(dev);
        del_timer_sync(&hdlc->state.cisco.timer);
+#if 0
        if (netif_carrier_ok(dev))
                netif_carrier_off(dev);
+#endif
        hdlc->state.cisco.up = 0;
        hdlc->state.cisco.request_sent = 0;
 }
index e1601d35dceddf133379a57155ca9472294b2eac..523afe17564e20f1c728b98a9d148ec9d309aced 100644 (file)
@@ -545,8 +545,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev)
 
        hdlc->state.fr.reliable = reliable;
        if (reliable) {
+#if 0
                if (!netif_carrier_ok(dev))
                        netif_carrier_on(dev);
+#endif
 
                hdlc->state.fr.n391cnt = 0; /* Request full status */
                hdlc->state.fr.dce_changed = 1;
@@ -560,8 +562,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev)
                        }
                }
        } else {
+#if 0
                if (netif_carrier_ok(dev))
                        netif_carrier_off(dev);
+#endif
 
                while (pvc) {           /* Deactivate all PVCs */
                        pvc_carrier(0, pvc);
index cdd4c09c2d90355adee28e09d42f560ab42d040f..46cef8f921333ac245f31a4beb13584def82fb25 100644 (file)
@@ -79,11 +79,13 @@ static void __hdlc_set_carrier_on(struct net_device *dev)
        hdlc_device *hdlc = dev_to_hdlc(dev);
        if (hdlc->proto.start)
                return hdlc->proto.start(dev);
+#if 0
 #ifdef DEBUG_LINK
        if (netif_carrier_ok(dev))
                printk(KERN_ERR "hdlc_set_carrier_on(): already on\n");
 #endif
        netif_carrier_on(dev);
+#endif
 }
 
 
@@ -94,11 +96,13 @@ static void __hdlc_set_carrier_off(struct net_device *dev)
        if (hdlc->proto.stop)
                return hdlc->proto.stop(dev);
 
+#if 0
 #ifdef DEBUG_LINK
        if (!netif_carrier_ok(dev))
                printk(KERN_ERR "hdlc_set_carrier_off(): already off\n");
 #endif
        netif_carrier_off(dev);
+#endif
 }
 
 
@@ -294,8 +298,10 @@ int register_hdlc_device(struct net_device *dev)
        if (result != 0)
                return -EIO;
 
+#if 0
        if (netif_carrier_ok(dev))
                netif_carrier_off(dev); /* no carrier until DCD goes up */
+#endif
 
        return 0;
 }
index 7c2cf2e76300c4f7fce69777653da0742bfdb8d7..032c0f81928e110f0b152c11e2b8085f465dfd9a 100644 (file)
@@ -1994,7 +1994,7 @@ static int detect_s514 (sdlahw_t* hw)
                modname, hw->irq);
 
        /* map the physical PCI memory to virtual memory */
-       (void *)hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr,
+       hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr,
                (unsigned long)MAX_SIZEOF_S514_MEMORY);
        /* map the physical control register memory to virtual memory */
        hw->vector = (unsigned long)ioremap(
index 7187958e40caac43da202b11ea7c1d2ff50daeaf..00e55165b760506fe7e1f21c3aaf4197e3e3a3b8 100644 (file)
@@ -330,7 +330,7 @@ config PCI_HERMES
 
 config ATMEL
       tristate "Atmel at76c50x chipset  802.11b support"
-      depends on NET_RADIO && EXPERIMENTAL
+      depends on NET_RADIO
       select FW_LOADER
       select CRC32
        ---help---
index a3e23527fe7ffd19391df73ae8b95537f2115684..5e53c5258a33e82933f92e2fe8e04a6698eb2465 100644 (file)
@@ -72,7 +72,7 @@
 #include "atmel.h"
 
 #define DRIVER_MAJOR 0
-#define DRIVER_MINOR 96
+#define DRIVER_MINOR 98
 
 MODULE_AUTHOR("Simon Kelley");
 MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.");
@@ -1504,7 +1504,7 @@ static int atmel_read_proc(char *page, char **start, off_t off,
         return len;
 }
 
-struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWType fw_type,  
+struct net_device *init_atmel_card( unsigned short irq, unsigned long port, const AtmelFWType fw_type,  
                                    struct device *sys_dev, int (*card_present)(void *), void *card)
 {
        struct net_device *dev;
@@ -1605,8 +1605,8 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
                goto err_out_free;
        }
 
-       if (priv->bus_type == BUS_TYPE_PCI &&
-           !request_region( dev->base_addr, 64, dev->name )) {
+       if (!request_region(dev->base_addr, 32, 
+                           priv->bus_type == BUS_TYPE_PCCARD ?  "atmel_cs" : "atmel_pci")) {
                goto err_out_irq;
        }
        
@@ -1622,15 +1622,16 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
        
        create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv);        
        
-       printk(KERN_INFO "%s: Atmel at76c50x wireless. Version %d.%d simon@thekelleys.org.uk\n",
-              dev->name, DRIVER_MAJOR, DRIVER_MINOR);
+       printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+              dev->name, DRIVER_MAJOR, DRIVER_MINOR,
+              dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+              dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );
        
        SET_MODULE_OWNER(dev);
        return dev;
        
  err_out_res:
-       if (priv->bus_type == BUS_TYPE_PCI)
-               release_region( dev->base_addr, 64 );
+       release_region( dev->base_addr, 32);
  err_out_irq:
        free_irq(dev->irq, dev);
  err_out_free:
@@ -1640,7 +1641,7 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
 
 EXPORT_SYMBOL(init_atmel_card);
 
-void stop_atmel_card(struct net_device *dev, int freeres)
+void stop_atmel_card(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
                
@@ -1654,10 +1655,7 @@ void stop_atmel_card(struct net_device *dev, int freeres)
        remove_proc_entry("driver/atmel", NULL);
        free_irq(dev->irq, dev);
        kfree(priv->firmware);
-       if (freeres) {
-               /* PCMCIA frees this stuff, so only for PCI */
-               release_region(dev->base_addr, 64);
-        }
+       release_region(dev->base_addr, 32);
        free_netdev(dev);
 }
 
@@ -1810,9 +1808,9 @@ static int atmel_set_encode(struct net_device *dev,
        }
        if(dwrq->flags & IW_ENCODE_RESTRICTED)
                priv->exclude_unencrypted = 1;
-       if(dwrq->flags & IW_ENCODE_OPEN)
+               if(dwrq->flags & IW_ENCODE_OPEN) 
                priv->exclude_unencrypted = 0;
-       
+       
        return -EINPROGRESS;            /* Call commit handler */
 }
 
@@ -1827,11 +1825,12 @@ static int atmel_get_encode(struct net_device *dev,
        
        if (!priv->wep_is_on)
                dwrq->flags = IW_ENCODE_DISABLED;
-       else if (priv->exclude_unencrypted)
-               dwrq->flags = IW_ENCODE_RESTRICTED;
-       else
-               dwrq->flags = IW_ENCODE_OPEN;
-               
+       else {
+               if (priv->exclude_unencrypted)
+                       dwrq->flags = IW_ENCODE_RESTRICTED;
+               else
+                       dwrq->flags = IW_ENCODE_OPEN;
+       }
                /* Which key do we want ? -1 -> tx index */
        if (index < 0 || index >= 4)
                index = priv->default_key;
@@ -2645,8 +2644,8 @@ static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 c
        } 
 }
 
-static void send_authentication_request(struct atmel_private *priv, u8 *challenge, int challenge_len)
+
+static void send_authentication_request(struct atmel_private *priv, u16 system, u8 *challenge, int challenge_len)
 {
        struct ieee80211_hdr_4addr header;
        struct auth_body auth;
@@ -2658,14 +2657,11 @@ static void send_authentication_request(struct atmel_private *priv, u8 *challeng
        memcpy(header.addr2, priv->dev->dev_addr, 6);
        memcpy(header.addr3, priv->CurrentBSSID, 6);
        
-       if (priv->wep_is_on) {
-               auth.alg = cpu_to_le16(C80211_MGMT_AAN_SHAREDKEY); 
+       if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1) 
                /* no WEP for authentication frames with TrSeqNo 1 */
-               if (priv->CurrentAuthentTransactionSeqNum != 1)
-                       header.frame_ctl |=  cpu_to_le16(IEEE80211_FCTL_PROTECTED);
-       } else {
-               auth.alg = cpu_to_le16(C80211_MGMT_AAN_OPENSYSTEM);
-       }
+                header.frame_ctl |=  cpu_to_le16(IEEE80211_FCTL_PROTECTED);
+       
+       auth.alg = cpu_to_le16(system); 
 
        auth.status = 0;
        auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum);
@@ -2834,6 +2830,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
        struct auth_body *auth = (struct auth_body *)priv->rx_buf;
        u16 status = le16_to_cpu(auth->status);
        u16 trans_seq_no = le16_to_cpu(auth->trans_seq);
+       u16 system = le16_to_cpu(auth->alg);
        
        if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) { 
                /* no WEP */
@@ -2855,7 +2852,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
                                
                if (trans_seq_no == 0x0002 &&
                    auth->el_id == C80211_MGMT_ElementID_ChallengeText) {
-                       send_authentication_request(priv, auth->chall_text, auth->chall_text_len);
+                       send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len);
                        return;
                }
                
@@ -2872,14 +2869,20 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
                }
        }                       
        
-       if (status == C80211_MGMT_SC_AuthAlgNotSupported && priv->connect_to_any_BSS) {
-               int bss_index;
-               
-               priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
-               
-               if ((bss_index  = retrieve_bss(priv)) != -1) {
-                       atmel_join_bss(priv, bss_index);
-                       return;
+       if (status == C80211_MGMT_SC_AuthAlgNotSupported) {
+               /* Do opensystem first, then try sharedkey */
+               if (system ==  C80211_MGMT_AAN_OPENSYSTEM) {
+                       priv->CurrentAuthentTransactionSeqNum = 0x001;
+                       send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
+               } else if (priv->connect_to_any_BSS) {
+                       int bss_index;
+                       
+                       priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
+                       
+                       if ((bss_index  = retrieve_bss(priv)) != -1) {
+                               atmel_join_bss(priv, bss_index);
+                               return;
+                       }
                }
        }
        
@@ -3205,7 +3208,7 @@ static void atmel_management_timer(u_long a)
                  priv->AuthenticationRequestRetryCnt++;
                  priv->CurrentAuthentTransactionSeqNum = 0x0001;
                  mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
-                 send_authentication_request(priv, NULL, 0);
+                 send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0);
          }
          
          break;
@@ -3312,7 +3315,7 @@ static void atmel_command_irq(struct atmel_private *priv)
                                
                                mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
                                priv->CurrentAuthentTransactionSeqNum = 0x0001;
-                               send_authentication_request(priv, NULL, 0);
+                               send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
                        }
                        return;
                }
@@ -3482,11 +3485,6 @@ static int probe_atmel_card(struct net_device *dev)
                        printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name);
                        memcpy(dev->dev_addr, default_mac, 6);
                }
-               printk(KERN_INFO "%s: MAC address %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
-                      dev->name,
-                      dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-                      dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );
-               
        }
        
        return rc;
index 825000edfc2c9c60d86c9c69f776c2aff34e4f57..b9b3e5b765446126d7f7a03e63f0b669f42cb87b 100644 (file)
@@ -35,9 +35,9 @@ typedef enum {
        ATMEL_FW_TYPE_506
 } AtmelFWType;
 
-struct net_device *init_atmel_card(unsigned short, int, const AtmelFWType, struct device *, 
+struct net_device *init_atmel_card(unsigned short, unsigned long, const AtmelFWType, struct device *, 
                                    int (*present_func)(void *), void * );
-void stop_atmel_card( struct net_device *, int );
+void stop_atmel_card( struct net_device *);
 int atmel_open( struct net_device * );
 
 #endif
index 1bd13146c644c1673b00546706deac2090cfbe31..17d1fd90f832972c5ea374ca4084bf1405ccc391 100644 (file)
@@ -63,6 +63,7 @@
    be present but disabled -- but it can then be enabled for specific
    modules at load time with a 'pc_debug=#' option to insmod.
 */
+
 #ifdef PCMCIA_DEBUG
 static int pc_debug = PCMCIA_DEBUG;
 module_param(pc_debug, int, 0);
@@ -285,41 +286,6 @@ static int card_present(void *arg)
        return 0;
 }
 
-/* list of cards we know about and their firmware requirements.
-   Go either by Manfid or version strings.
-   Cards not in this list will need a firmware parameter to the module
-   in all probability. Note that the SMC 2632 V2 and V3 have the same
-   manfids, so we ignore those and use the version1 strings. */
-
-static struct { 
-       int manf, card;
-       char *ver1;
-       AtmelFWType firmware;
-       char *name;
-} card_table[] = {
-       { 0, 0, "WLAN/802.11b PC CARD", ATMEL_FW_TYPE_502D, "Actiontec 802CAT1" },  
-       { 0, 0, "ATMEL/AT76C502AR", ATMEL_FW_TYPE_502, "NoName-RFMD" }, 
-       { 0, 0, "ATMEL/AT76C502AR_D", ATMEL_FW_TYPE_502D, "NoName-revD" }, 
-       { 0, 0, "ATMEL/AT76C502AR_E", ATMEL_FW_TYPE_502E, "NoName-revE" },
-       { 0, 0, "ATMEL/AT76C504", ATMEL_FW_TYPE_504, "NoName-504" },
-       { 0, 0, "ATMEL/AT76C504A", ATMEL_FW_TYPE_504A_2958, "NoName-504a-2958" },
-       { 0, 0, "ATMEL/AT76C504_R", ATMEL_FW_TYPE_504_2958, "NoName-504-2958" },
-       { MANFID_3COM, 0x0620, NULL, ATMEL_FW_TYPE_502_3COM, "3com 3CRWE62092B" }, 
-       { MANFID_3COM, 0x0696, NULL, ATMEL_FW_TYPE_502_3COM, "3com 3CRSHPW196" }, 
-       { 0, 0, "SMC/2632W-V2", ATMEL_FW_TYPE_502, "SMC 2632W-V2" },
-       { 0, 0, "SMC/2632W", ATMEL_FW_TYPE_502D, "SMC 2632W-V3" },
-       { 0xd601, 0x0007, NULL, ATMEL_FW_TYPE_502, "Sitecom WLAN-011" }, 
-       { 0x01bf, 0x3302, NULL, ATMEL_FW_TYPE_502E, "Belkin F5D6020-V2" }, 
-       { 0, 0, "BT/Voyager 1020 Laptop Adapter", ATMEL_FW_TYPE_502, "BT Voyager 1020" },
-       { 0, 0, "IEEE 802.11b/Wireless LAN PC Card", ATMEL_FW_TYPE_502, "Siemens Gigaset PC Card II" },
-       { 0, 0, "IEEE 802.11b/Wireless LAN Card S", ATMEL_FW_TYPE_504_2958, "Siemens Gigaset PC Card II" },
-       { 0, 0, "CNet/CNWLC 11Mbps Wireless PC Card V-5", ATMEL_FW_TYPE_502E, "CNet CNWLC-811ARL" },
-       { 0, 0, "Wireless/PC_CARD", ATMEL_FW_TYPE_502D, "Planet WL-3552" },
-       { 0, 0, "OEM/11Mbps Wireless LAN PC Card V-3", ATMEL_FW_TYPE_502, "OEM 11Mbps WLAN PCMCIA Card" },
-       { 0, 0, "11WAVE/11WP611AL-E", ATMEL_FW_TYPE_502E, "11WAVE WaveBuddy" },
-       { 0, 0, "LG/LW2100N", ATMEL_FW_TYPE_502E, "LG LW2100N 11Mbps WLAN PCMCIA Card" },
-};
-
 static void atmel_config(dev_link_t *link)
 {
        client_handle_t handle;
@@ -328,10 +294,11 @@ static void atmel_config(dev_link_t *link)
        local_info_t *dev;
        int last_fn, last_ret;
        u_char buf[64];
-       int card_index = -1, done = 0;
-       
+       struct pcmcia_device_id *did;
+
        handle = link->handle;
        dev = link->priv;
+       did = handle_to_dev(handle).driver_data;
 
        DEBUG(0, "atmel_config(0x%p)\n", link);
        
@@ -340,59 +307,6 @@ static void atmel_config(dev_link_t *link)
        tuple.TupleDataMax = sizeof(buf);
        tuple.TupleOffset = 0;
        
-       tuple.DesiredTuple = CISTPL_MANFID;
-       if (pcmcia_get_first_tuple(handle, &tuple) == 0) {
-               int i;
-               cistpl_manfid_t *manfid;
-               CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-               CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
-               manfid = &(parse.manfid);
-               for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) {
-                       if (!card_table[i].ver1 &&
-                           manfid->manf == card_table[i].manf &&
-                           manfid->card == card_table[i].card) {
-                               card_index = i;
-                               done = 1;
-                       }
-               }
-       }
-
-       tuple.DesiredTuple = CISTPL_VERS_1;
-       if (!done && (pcmcia_get_first_tuple(handle, &tuple) == 0)) {
-               int i, j, k;
-               cistpl_vers_1_t *ver1;
-               CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-               CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
-               ver1 = &(parse.version_1);
-               
-               for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) {
-                       for (j = 0; j < ver1->ns; j++) {
-                               char *p = card_table[i].ver1;
-                               char *q = &ver1->str[ver1->ofs[j]];
-                               if (!p)
-                                       goto mismatch;
-                               for (k = 0; k < j; k++) {
-                                       while ((*p != '\0') && (*p != '/')) p++;
-                                       if (*p == '\0') {
-                                               if (*q != '\0')
-                                                       goto mismatch;
-                                       } else {
-                                               p++;
-                                       }
-                               }
-                               while((*q != '\0') && (*p != '\0') && 
-                                     (*p != '/') && (*p == *q)) p++, q++;
-                               if (((*p != '\0') && *p != '/') || *q != '\0')
-                                       goto mismatch;
-                       }
-                       card_index = i;
-                       break;  /* done */
-                       
-               mismatch:
-                       j = 0; /* dummy stmt to shut up compiler */
-               }
-       }               
-
        /*
          This reads the card's CONFIG tuple to find its configuration
          registers.
@@ -509,12 +423,13 @@ static void atmel_config(dev_link_t *link)
        ((local_info_t*)link->priv)->eth_dev = 
                init_atmel_card(link->irq.AssignedIRQ,
                                link->io.BasePort1,
-                               card_index == -1 ? ATMEL_FW_TYPE_NONE :  card_table[card_index].firmware,
+                               did ? did->driver_info : ATMEL_FW_TYPE_NONE,
                                &handle_to_dev(handle),
                                card_present, 
                                link);
        if (!((local_info_t*)link->priv)->eth_dev) 
-               goto cs_failed;
+                       goto cs_failed;
+       
        
        /*
          At this point, the dev_node_t structure(s) need to be
@@ -523,26 +438,7 @@ static void atmel_config(dev_link_t *link)
        strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name );
        dev->node.major = dev->node.minor = 0;
        link->dev = &dev->node;
-       
-       /* Finally, report what we've done */
-       printk(KERN_INFO "%s: %s%sindex 0x%02x: Vcc %d.%d",
-              dev->node.dev_name,
-              card_index == -1 ? "" :  card_table[card_index].name,
-              card_index == -1 ? "" : " ",
-              link->conf.ConfigIndex,
-              link->conf.Vcc/10, link->conf.Vcc%10);
-       if (link->conf.Vpp1)
-               printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10);
-       if (link->conf.Attributes & CONF_ENABLE_IRQ)
-               printk(", irq %d", link->irq.AssignedIRQ);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1+link->io.NumPorts1-1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2+link->io.NumPorts2-1);
-       printk("\n");
-       
+                       
        link->state &= ~DEV_CONFIG_PENDING;
        return;
        
@@ -569,7 +465,7 @@ static void atmel_release(dev_link_t *link)
        link->dev = NULL;
        
        if (dev) 
-               stop_atmel_card(dev, 0);
+               stop_atmel_card(dev);
        ((local_info_t*)link->priv)->eth_dev = NULL; 
        
        /* Don't bother checking to see if these succeed or not */
@@ -637,25 +533,47 @@ static int atmel_event(event_t event, int priority,
 } /* atmel_event */
 
 /*====================================================================*/
+/* We use the driver_info field to store the correct firmware type for a card. */
+
+#define PCMCIA_DEVICE_MANF_CARD_INFO(manf, card, info) { \
+       .match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
+                       PCMCIA_DEV_ID_MATCH_CARD_ID, \
+       .manf_id = (manf), \
+       .card_id = (card), \
+        .driver_info = (kernel_ulong_t)(info), }
+
+#define PCMCIA_DEVICE_PROD_ID12_INFO(v1, v2, vh1, vh2, info) { \
+       .match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
+                       PCMCIA_DEV_ID_MATCH_PROD_ID2, \
+       .prod_id = { (v1), (v2), NULL, NULL }, \
+       .prod_id_hash = { (vh1), (vh2), 0, 0 }, \
+        .driver_info = (kernel_ulong_t)(info), }
+
 static struct pcmcia_device_id atmel_ids[] = {
-       PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0620),
-       PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0696),
-       PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x3302),
-       PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0007),
-       PCMCIA_DEVICE_PROD_ID12("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9),
-       PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f),
-       PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C504", 0xabda4164, 0x5040670a),
-       PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f),
-       PCMCIA_DEVICE_PROD_ID12("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5),
-       PCMCIA_DEVICE_PROD_ID12("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b),
-       PCMCIA_DEVICE_PROD_ID12("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6),
-       PCMCIA_DEVICE_PROD_ID12("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68),
-       PCMCIA_DEVICE_PROD_ID12("SMC", "2632W", 0xc4f8b18b, 0x30f38774),
-       PCMCIA_DEVICE_PROD_ID12("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377),
-       PCMCIA_DEVICE_PROD_ID12("Wireless", "PC", 0xa407ecdd, 0x556e4d7e),
-       PCMCIA_DEVICE_PROD_ID12("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4),
+       PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM),
+       PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM),
+       PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E),
+       PCMCIA_DEVICE_MANF_CARD_INFO(0xd601, 0x0007, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9, ATMEL_FW_TYPE_502E),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_D", 0xabda4164, 0x3675d704, ATMEL_FW_TYPE_502D),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_E", 0xabda4164, 0x4172e792, ATMEL_FW_TYPE_502E),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504_R", 0xabda4164, 0x917f3d72, ATMEL_FW_TYPE_504_2958),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504", 0xabda4164, 0x5040670a, ATMEL_FW_TYPE_504),
+       PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f, ATMEL_FW_TYPE_504A_2958),
+       PCMCIA_DEVICE_PROD_ID12_INFO("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b, ATMEL_FW_TYPE_502E),
+       PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN Card S", 0x5b878724, 0x5fba533a, ATMEL_FW_TYPE_504_2958),
+       PCMCIA_DEVICE_PROD_ID12_INFO("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W", 0xc4f8b18b, 0x30f38774, ATMEL_FW_TYPE_502D),
+       PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377, ATMEL_FW_TYPE_502),
+       PCMCIA_DEVICE_PROD_ID12_INFO("Wireless", "PC_CARD", 0xa407ecdd, 0x119f6314, ATMEL_FW_TYPE_502D),
+       PCMCIA_DEVICE_PROD_ID12_INFO("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4, ATMEL_FW_TYPE_502D),
+       PCMCIA_DEVICE_PROD_ID12_INFO("LG", "LW2100N", 0xb474d43a, 0x6b1fec94, ATMEL_FW_TYPE_502E),
        PCMCIA_DEVICE_NULL
 };
+
 MODULE_DEVICE_TABLE(pcmcia, atmel_ids);
 
 static struct pcmcia_driver atmel_driver = {
index 2eb00a957bbe5bfee0d6222b3f9bfd2e4f354b65..a61b3bc6cccf4c94aac6bf57216d4389d055f61e 100644 (file)
@@ -72,7 +72,7 @@ static int __devinit atmel_pci_probe(struct pci_dev *pdev,
 
 static void __devexit atmel_pci_remove(struct pci_dev *pdev)
 {
-       stop_atmel_card(pci_get_drvdata(pdev), 1);
+       stop_atmel_card(pci_get_drvdata(pdev));
 }
 
 static int __init atmel_init_module(void)
index 579480dad3746cba6f956792c0c09ae445dd50ae..346c6febb033b89e217591819727e21ae62ecc43 100644 (file)
@@ -398,7 +398,7 @@ static int hermes_bap_seek(hermes_t *hw, int bap, u16 id, u16 offset)
  *
  * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
  */
-int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len,
+int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
                     u16 id, u16 offset)
 {
        int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
@@ -424,7 +424,7 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len,
  *
  * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
  */
-int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len,
+int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len,
                      u16 id, u16 offset)
 {
        int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
@@ -450,7 +450,7 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len,
  *
  * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
  */
-int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, unsigned len,
+int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, int len,
                      u16 id, u16 offset)
 {
        int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
index a6bd472d75d4c83924131a6b4d19a9cfb8540fe8..7644f72a9f4efd3269c40cd46b09cefbda196e85 100644 (file)
@@ -372,12 +372,12 @@ int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0,
                      struct hermes_response *resp);
 int hermes_allocate(hermes_t *hw, u16 size, u16 *fid);
 
-int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len,
+int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
                       u16 id, u16 offset);
-int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len,
+int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len,
                        u16 id, u16 offset);
 int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf,
-                       unsigned data_len, unsigned len, u16 id, u16 offset);
+                       unsigned data_len, int len, u16 id, u16 offset);
 int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen,
                    u16 *length, void *buf);
 int hermes_write_ltv(hermes_t *hw, int bap, u16 rid,
index 33acb8add4d6242a0d39ff8fdfeb1aa7fd84ca2d..afac5c7a323d35c77f2f6aa9d31d24184b1500df 100644 (file)
@@ -7,11 +7,16 @@
  *
  * Copyright 1994, Anders Klemets <klemets@it.kth.se>
  *
- * This software may be freely distributed for noncommercial purposes
- * as long as this notice is retained.
- * 
  * HISTORY
  * i82593.h,v
+ * Revision 1.4  2005/11/4  09:15:00  baroniunas
+ * Modified copyright with permission of author as follows:
+ *
+ *   "If I82539.H is the only file with my copyright statement
+ *    that is included in the Source Forge project, then you have
+ *    my approval to change the copyright statement to be a GPL
+ *    license, in the way you proposed on October 10."
+ *
  * Revision 1.1  1996/07/17 15:23:12  root
  * Initial revision
  *
index a2e6214169e914ba6e79b4d8bfe631a730449633..77d2a21d4cd00f879abe206480f80ea75441aca7 100644 (file)
@@ -6344,7 +6344,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
        dev->ethtool_ops = &ipw2100_ethtool_ops;
        dev->tx_timeout = ipw2100_tx_timeout;
        dev->wireless_handlers = &ipw2100_wx_handler_def;
-       dev->get_wireless_stats = ipw2100_wx_wireless_stats;
+       priv->wireless_data.ieee80211 = priv->ieee;
+       dev->wireless_data = &priv->wireless_data;
        dev->set_mac_address = ipw2100_set_address;
        dev->watchdog_timeo = 3 * HZ;
        dev->irq = 0;
@@ -7178,6 +7179,11 @@ static int ipw2100_wx_get_range(struct net_device *dev,
        }
        range->num_frequency = val;
 
+       /* Event capability (kernel + driver) */
+       range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
+                               IW_EVENT_CAPA_MASK(SIOCGIWAP));
+       range->event_capa[1] = IW_EVENT_CAPA_K_1;
+
        IPW_DEBUG_WX("GET Range\n");
 
        return 0;
@@ -8446,16 +8452,6 @@ static iw_handler ipw2100_private_handler[] = {
 #endif                         /* CONFIG_IPW2100_MONITOR */
 };
 
-static struct iw_handler_def ipw2100_wx_handler_def = {
-       .standard = ipw2100_wx_handlers,
-       .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
-       .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
-       .num_private_args = sizeof(ipw2100_private_args) /
-           sizeof(struct iw_priv_args),
-       .private = (iw_handler *) ipw2100_private_handler,
-       .private_args = (struct iw_priv_args *)ipw2100_private_args,
-};
-
 /*
  * Get wireless statistics.
  * Called by /proc/net/wireless
@@ -8597,6 +8593,17 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
        return (struct iw_statistics *)NULL;
 }
 
+static struct iw_handler_def ipw2100_wx_handler_def = {
+       .standard = ipw2100_wx_handlers,
+       .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
+       .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
+       .num_private_args = sizeof(ipw2100_private_args) /
+           sizeof(struct iw_priv_args),
+       .private = (iw_handler *) ipw2100_private_handler,
+       .private_args = (struct iw_priv_args *)ipw2100_private_args,
+       .get_wireless_stats = ipw2100_wx_wireless_stats,
+};
+
 static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
 {
        union iwreq_data wrqu;
index 140fdf2a0a09a58afdcbe36658a07476c16474c4..7c65b10bb164d00b0d2a0fb393b4ec1e97cdd85b 100644 (file)
@@ -571,6 +571,8 @@ struct ipw2100_priv {
        struct net_device *net_dev;
        struct iw_statistics wstats;
 
+       struct iw_public_data wireless_data;
+
        struct tasklet_struct irq_tasklet;
 
        struct workqueue_struct *workqueue;
index b0d195d1721a6b490107c864043596d0a0768d10..5e7c7e944c9deb8190d271486737041275f85dcf 100644 (file)
@@ -1110,8 +1110,7 @@ static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv)
        error->elem_len = elem_len;
        error->log_len = log_len;
        error->elem = (struct ipw_error_elem *)error->payload;
-       error->log = (struct ipw_event *)(error->elem +
-                                         (sizeof(*error->elem) * elem_len));
+       error->log = (struct ipw_event *)(error->elem + elem_len);
 
        ipw_capture_event_log(priv, log_len, error->log);
 
@@ -8926,6 +8925,10 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid,
        struct ipw_scan_request_ext scan;
        int err = 0, scan_type;
 
+       if (!(priv->status & STATUS_INIT) ||
+           (priv->status & STATUS_EXIT_PENDING))
+               return 0;
+
        down(&priv->sem);
 
        if (priv->status & STATUS_RF_KILL_MASK) {
index 109a96d90007ba53ad39a15cec8be73ed56945f4..23deee69974b3eeed03af5a59a7286208f276ad4 100644 (file)
@@ -164,12 +164,12 @@ isl38xx_trigger_device(int asleep, void __iomem *device_base)
                /* assert the Wakeup interrupt in the Device Interrupt Register */
                isl38xx_w32_flush(device_base, ISL38XX_DEV_INT_WAKEUP,
                                  ISL38XX_DEV_INT_REG);
+
+#if VERBOSE > SHOW_ERROR_MESSAGES
                udelay(ISL38XX_WRITEIO_DELAY);
 
                /* perform another read on the Device Status Register */
                reg = readl(device_base + ISL38XX_CTRL_STAT_REG);
-
-#if VERBOSE > SHOW_ERROR_MESSAGES
                do_gettimeofday(&current_time);
                DEBUG(SHOW_TRACING, "%08li.%08li Device register read %08x\n",
                      current_time.tv_sec, (long)current_time.tv_usec, reg);
index a39fbfef789a9ad6783d4da67f47eef6b4eb2d68..19657efa8dc3989741d1df2ddd38ea8ff2b5db86 100644 (file)
@@ -700,6 +700,28 @@ static unsigned int iosapic_startup_irq(unsigned int irq)
        return 0;
 }
 
+#ifdef CONFIG_SMP
+static void iosapic_set_affinity_irq(unsigned int irq, cpumask_t dest)
+{
+       struct vector_info *vi = iosapic_get_vector(irq);
+       u32 d0, d1, dummy_d0;
+       unsigned long flags;
+
+       if (cpu_check_affinity(irq, &dest))
+               return;
+
+       vi->txn_addr = txn_affinity_addr(irq, first_cpu(dest));
+
+       spin_lock_irqsave(&iosapic_lock, flags);
+       /* d1 contains the destination CPU, so only want to set that
+        * entry */
+       iosapic_rd_irt_entry(vi, &d0, &d1);
+       iosapic_set_irt_data(vi, &dummy_d0, &d1);
+       iosapic_wr_irt_entry(vi, d0, d1);
+       spin_unlock_irqrestore(&iosapic_lock, flags);
+}
+#endif
+
 static struct hw_interrupt_type iosapic_interrupt_type = {
        .typename =     "IO-SAPIC-level",
        .startup =      iosapic_startup_irq,
@@ -708,7 +730,9 @@ static struct hw_interrupt_type iosapic_interrupt_type = {
        .disable =      iosapic_disable_irq,
        .ack =          no_ack_irq,
        .end =          iosapic_end_irq,
-//     .set_affinity = iosapic_set_affinity_irq,
+#ifdef CONFIG_SMP
+       .set_affinity = iosapic_set_affinity_irq,
+#endif
 };
 
 int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
index bab3bcabcb6ee6bf83a223a34bfc0ec9b4361121..d14888e149bbeeb6f3c7bf517739e0be6e37b096 100644 (file)
@@ -24,6 +24,9 @@
  *      Major changes to get basic interrupt infrastructure working to
  *      hopefully be able to support all SuperIO devices. Currently
  *      works with serial. -- John Marvin <jsm@fc.hp.com>
+ *
+ *     Converted superio_init() to be a PCI_FIXUP_FINAL callee.
+ *         -- Kyle McMartin <kyle@parisc-linux.org>
  */
 
 
@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
 }
 
 /* Initialize Super I/O device */
-
-static void __devinit
-superio_init(struct superio_device *sio)
+static void
+superio_init(struct pci_dev *pcidev)
 {
+       struct superio_device *sio = &sio_dev;
        struct pci_dev *pdev = sio->lio_pdev;
        u16 word;
 
@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio)
        /* ...then properly fixup the USB to point at suckyio PIC */
        sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev);
 
-       printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n",
-               pci_name(pdev),pdev->irq);
+       printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n",
+              pci_name(pdev), pdev->irq);
 
        pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);
        sio->sp1_base &= ~1;
@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio)
 
        sio->suckyio_irq_enabled = 1;
 }
-
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init);
 
 static void superio_disable_irq(unsigned int irq)
 {
@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev)
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci);
 
 
-static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int __devinit
+superio_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
+       struct superio_device *sio = &sio_dev;
 
        /*
        ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a
@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
                dev->subsystem_vendor, dev->subsystem_device,
                dev->class);
 
-       superio_init(&sio_dev);
+       if (!sio->suckyio_irq_enabled)
+               BUG(); /* Enabled by PCI_FIXUP_FINAL */
 
        if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) {        /* Function 1 */
                superio_parport_init();
@@ -481,19 +487,21 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
                DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n");
        }
 
-       /* Let appropriate other driver claim this device. */ 
+       /* Let appropriate other driver claim this device. */
        return -ENODEV;
 }
 
 static struct pci_device_id superio_tbl[] = {
-       { PCI_VENDOR_ID_NS, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+       { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO) },
+       { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_USB) },
+       { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415) },
        { 0, }
 };
 
 static struct pci_driver superio_driver = {
-       .name =         "SuperIO",
-       .id_table =     superio_tbl,
-       .probe =        superio_probe,
+       .name =         "SuperIO",
+       .id_table =     superio_tbl,
+       .probe =        superio_probe,
 };
 
 static int __init superio_modinit(void)
@@ -506,6 +514,5 @@ static void __exit superio_exit(void)
        pci_unregister_driver(&superio_driver);
 }
 
-
 module_init(superio_modinit);
 module_exit(superio_exit);
index 2a42add7f56356d87f0ca4d74f1f8521975603b4..ea16805a153cdbfeb72b150d0d900df388edacff 100644 (file)
@@ -2,6 +2,8 @@
 #include <linux/module.h>
 #include <linux/ioport.h>
 
+#include "pci.h"
+
 /*
  * This interrupt-safe spinlock protects all accesses to PCI
  * configuration space.
index 061ead21ef1467bab23c390ec1604b2d3a78ccf5..c42b68d3aa2410d27741e51c01585603c58c10b8 100644 (file)
@@ -32,8 +32,6 @@
 #include <linux/types.h>
 #include <linux/pci.h>
 #include <linux/delay.h>
-#include <asm/semaphore.h>
-#include <asm/io.h>            
 #include <linux/pcieport_if.h>
 #include "pci_hotplug.h"
 
@@ -42,6 +40,7 @@
 extern int pciehp_poll_mode;
 extern int pciehp_poll_time;
 extern int pciehp_debug;
+extern int pciehp_force;
 
 /*#define dbg(format, arg...) do { if (pciehp_debug) printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); } while (0)*/
 #define dbg(format, arg...) do { if (pciehp_debug) printk("%s: " format, MY_NAME , ## arg); } while (0)
@@ -49,39 +48,20 @@ extern int pciehp_debug;
 #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)
 
-struct pci_func {
-       struct pci_func *next;
-       u8 bus;
-       u8 device;
-       u8 function;
-       u8 is_a_board;
-       u16 status;
-       u8 configured;
-       u8 switch_save;
-       u8 presence_save;
-       u32 base_length[0x06];
-       u8 base_type[0x06];
-       u16 reserved2;
-       u32 config_space[0x20];
-       struct pci_resource *mem_head;
-       struct pci_resource *p_mem_head;
-       struct pci_resource *io_head;
-       struct pci_resource *bus_head;
-       struct pci_dev* pci_dev;
+struct hotplug_params {
+       u8 cache_line_size;
+       u8 latency_timer;
+       u8 enable_serr;
+       u8 enable_perr;
 };
 
 struct slot {
        struct slot *next;
        u8 bus;
        u8 device;
+       u16 status;
        u32 number;
-       u8 is_a_board;
-       u8 configured;
        u8 state;
-       u8 switch_save;
-       u8 presence_save;
-       u32 capabilities;
-       u16 reserved2;
        struct timer_list task_event;
        u8 hp_slot;
        struct controller *ctrl;
@@ -90,42 +70,47 @@ struct slot {
        struct list_head        slot_list;
 };
 
-struct pci_resource {
-       struct pci_resource * next;
-       u32 base;
-       u32 length;
-};
-
 struct event_info {
        u32 event_type;
        u8 hp_slot;
 };
 
+typedef u8(*php_intr_callback_t) (u8 hp_slot, void *instance_id);
+
+struct php_ctlr_state_s {
+       struct php_ctlr_state_s *pnext;
+       struct pci_dev *pci_dev;
+       unsigned int irq;
+       unsigned long flags;                            /* spinlock's */
+       u32 slot_device_offset;
+       u32 num_slots;
+       struct timer_list       int_poll_timer;         /* Added for poll event */
+       php_intr_callback_t     attention_button_callback;
+       php_intr_callback_t     switch_change_callback;
+       php_intr_callback_t     presence_change_callback;
+       php_intr_callback_t     power_fault_callback;
+       void                    *callback_instance_id;
+       struct ctrl_reg         *creg;                          /* Ptr to controller register space */
+};
+
+#define MAX_EVENTS             10
 struct controller {
        struct controller *next;
        struct semaphore crit_sect;     /* critical section semaphore */
-       void *hpc_ctlr_handle;          /* HPC controller handle */
+       struct php_ctlr_state_s *hpc_ctlr_handle; /* HPC controller handle */
        int num_slots;                  /* Number of slots on ctlr */
        int slot_num_inc;               /* 1 or -1 */
-       struct pci_resource *mem_head;
-       struct pci_resource *p_mem_head;
-       struct pci_resource *io_head;
-       struct pci_resource *bus_head;
        struct pci_dev *pci_dev;
        struct pci_bus *pci_bus;
-       struct event_info event_queue[10];
+       struct event_info event_queue[MAX_EVENTS];
        struct slot *slot;
        struct hpc_ops *hpc_ops;
        wait_queue_head_t queue;        /* sleep & wake process */
        u8 next_event;
-       u8 seg;
        u8 bus;
        u8 device;
        u8 function;
-       u8 rev;
        u8 slot_device_offset;
-       u8 add_support;
-       enum pci_bus_speed speed;
        u32 first_slot;         /* First physical slot number */  /* PCIE only has 1 slot */
        u8 slot_bus;            /* Bus where the slots handled by this controller sit */
        u8 ctrlcap;
@@ -133,20 +118,6 @@ struct controller {
        u8 cap_base;
 };
 
-struct irq_mapping {
-       u8 barber_pole;
-       u8 valid_INT;
-       u8 interrupt[4];
-};
-
-struct resource_lists {
-       struct pci_resource *mem_head;
-       struct pci_resource *p_mem_head;
-       struct pci_resource *io_head;
-       struct pci_resource *bus_head;
-       struct irq_mapping *irqs;
-};
-
 #define INT_BUTTON_IGNORE              0
 #define INT_PRESENCE_ON                        1
 #define INT_PRESENCE_OFF               2
@@ -200,21 +171,14 @@ struct resource_lists {
  * error Messages
  */
 #define msg_initialization_err "Initialization failure, error=%d\n"
-#define msg_HPC_rev_error      "Unsupported revision of the PCI hot plug controller found.\n"
-#define msg_HPC_non_pcie       "The PCI hot plug controller is not supported by this driver.\n"
-#define msg_HPC_not_supported  "This system is not supported by this version of pciephd module. Upgrade to a newer version of pciehpd\n"
-#define msg_unable_to_save     "Unable to store PCI hot plug add resource information. This system must be rebooted before adding any PCI devices.\n"
 #define msg_button_on          "PCI slot #%d - powering on due to button press.\n"
 #define msg_button_off         "PCI slot #%d - powering off due to button press.\n"
 #define msg_button_cancel      "PCI slot #%d - action canceled due to button press.\n"
 #define msg_button_ignore      "PCI slot #%d - button press ignored.  (action in progress...)\n"
 
 /* controller functions */
-extern int     pciehprm_find_available_resources       (struct controller *ctrl);
 extern int     pciehp_event_start_thread       (void);
 extern void    pciehp_event_stop_thread        (void);
-extern struct  pci_func *pciehp_slot_create    (unsigned char busnumber);
-extern struct  pci_func *pciehp_slot_find      (unsigned char bus, unsigned char device, unsigned char index);
 extern int     pciehp_enable_slot              (struct slot *slot);
 extern int     pciehp_disable_slot             (struct slot *slot);
 
@@ -224,25 +188,17 @@ extern u8 pciehp_handle_presence_change   (u8 hp_slot, void *inst_id);
 extern u8      pciehp_handle_power_fault       (u8 hp_slot, void *inst_id);
 /* extern void long_delay (int delay); */
 
-/* resource functions */
-extern int     pciehp_resource_sort_and_combine        (struct pci_resource **head);
-
 /* pci functions */
-extern int     pciehp_set_irq                  (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num);
-/*extern int   pciehp_get_bus_dev              (struct controller *ctrl, u8 *bus_num, u8 *dev_num, struct slot *slot);*/
-extern int     pciehp_save_config              (struct controller *ctrl, int busnumber, int num_ctlr_slots, int first_device_num);
-extern int     pciehp_save_used_resources      (struct controller *ctrl, struct pci_func * func, int flag);
-extern int     pciehp_save_slot_config         (struct controller *ctrl, struct pci_func * new_slot);
-extern void    pciehp_destroy_board_resources  (struct pci_func * func);
-extern int     pciehp_return_board_resources   (struct pci_func * func, struct resource_lists * resources);
-extern void    pciehp_destroy_resource_list    (struct resource_lists * resources);
-extern int     pciehp_configure_device         (struct controller* ctrl, struct pci_func* func);
-extern int     pciehp_unconfigure_device       (struct pci_func* func);
+extern int     pciehp_configure_device         (struct slot *p_slot);
+extern int     pciehp_unconfigure_device       (struct slot *p_slot);
+extern int     pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev);
+extern void    pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
+               struct hotplug_params *hpp);
+
 
 
 /* Global variables */
 extern struct controller *pciehp_ctrl_list;
-extern struct pci_func *pciehp_slot_list[256];
 
 /* Inline functions */
 
@@ -252,12 +208,9 @@ static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device)
 
        p_slot = ctrl->slot;
 
-       dbg("p_slot = %p\n", p_slot);
-
        while (p_slot && (p_slot->device != device)) {
                tmp_slot = p_slot;
                p_slot = p_slot->next;
-               dbg("In while loop, p_slot = %p\n", p_slot);
        }
        if (p_slot == NULL) {
                err("ERROR: pciehp_find_slot device=0x%x\n", device);
@@ -273,7 +226,6 @@ static inline int wait_for_ctrl_irq(struct controller *ctrl)
 
        DECLARE_WAITQUEUE(wait, current);
 
-       dbg("%s : start\n", __FUNCTION__);
        add_wait_queue(&ctrl->queue, &wait);
        if (!pciehp_poll_mode)
                /* Sleep for up to 1 second */
@@ -285,19 +237,9 @@ static inline int wait_for_ctrl_irq(struct controller *ctrl)
        if (signal_pending(current))
                retval =  -EINTR;
 
-       dbg("%s : end\n", __FUNCTION__);
        return retval;
 }
 
-/* Puts node back in the resource list pointed to by head */
-static inline void return_resource(struct pci_resource **head, struct pci_resource *node)
-{
-       if (!node || !head)
-               return;
-       node->next = *head;
-       *head = node;
-}
-
 #define SLOT_NAME_SIZE 10
 
 static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot)
@@ -311,14 +253,7 @@ enum php_ctlr_type {
        ACPI
 };
 
-typedef u8(*php_intr_callback_t) (unsigned int change_id, void *instance_id);
-
-int pcie_init(struct controller *ctrl, struct pcie_device *dev,
-               php_intr_callback_t attention_button_callback,
-               php_intr_callback_t switch_change_callback,
-               php_intr_callback_t presence_change_callback,
-               php_intr_callback_t power_fault_callback);
-
+int pcie_init(struct controller *ctrl, struct pcie_device *dev);
 
 /* This has no meaning for PCI Express, as there is only 1 slot per port */
 int pcie_get_ctlr_slot_config(struct controller *ctrl,
index cafc7eadcf8056e36bcbc7dd6e7d7a1da580df52..8df7048603480427e8cff83517d76647cc715627 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/proc_fs.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
 #include <linux/pci.h>
-#include <linux/init.h>
-#include <asm/uaccess.h>
 #include "pciehp.h"
-#include "pciehprm.h"
 #include <linux/interrupt.h>
 
 /* Global variables */
 int pciehp_debug;
 int pciehp_poll_mode;
 int pciehp_poll_time;
+int pciehp_force;
 struct controller *pciehp_ctrl_list;
-struct pci_func *pciehp_slot_list[256];
 
 #define DRIVER_VERSION "0.4"
 #define DRIVER_AUTHOR  "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>"
@@ -60,9 +53,11 @@ MODULE_LICENSE("GPL");
 module_param(pciehp_debug, bool, 0644);
 module_param(pciehp_poll_mode, bool, 0644);
 module_param(pciehp_poll_time, int, 0644);
+module_param(pciehp_force, bool, 0644);
 MODULE_PARM_DESC(pciehp_debug, "Debugging mode enabled or not");
 MODULE_PARM_DESC(pciehp_poll_mode, "Using polling mechanism for hot-plug events or not");
 MODULE_PARM_DESC(pciehp_poll_time, "Polling mechanism frequency, in seconds");
+MODULE_PARM_DESC(pciehp_force, "Force pciehp, even if _OSC and OSHP are missing");
 
 #define PCIE_MODULE_NAME "pciehp"
 
@@ -114,8 +109,6 @@ static int init_slots(struct controller *ctrl)
        u32 slot_number;
        int result = -ENOMEM;
 
-       dbg("%s\n",__FUNCTION__);
-
        number_of_slots = ctrl->num_slots;
        slot_device = ctrl->slot_device_offset;
        slot_number = ctrl->first_slot;
@@ -370,7 +363,6 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
        u8 value;
        struct pci_dev *pdev;
        
-       dbg("%s: Called by hp_drv\n", __FUNCTION__);
        ctrl = kmalloc(sizeof(*ctrl), GFP_KERNEL);
        if (!ctrl) {
                err("%s : out of memory\n", __FUNCTION__);
@@ -378,22 +370,15 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
        }
        memset(ctrl, 0, sizeof(struct controller));
 
-       dbg("%s: DRV_thread pid = %d\n", __FUNCTION__, current->pid);
-       
        pdev = dev->port;
+       ctrl->pci_dev = pdev;
 
-       rc = pcie_init(ctrl, dev,
-               (php_intr_callback_t) pciehp_handle_attention_button,
-               (php_intr_callback_t) pciehp_handle_switch_change,
-               (php_intr_callback_t) pciehp_handle_presence_change,
-               (php_intr_callback_t) pciehp_handle_power_fault);
+       rc = pcie_init(ctrl, dev);
        if (rc) {
                dbg("%s: controller initialization failed\n", PCIE_MODULE_NAME);
                goto err_out_free_ctrl;
        }
 
-       ctrl->pci_dev = pdev;
-
        pci_set_drvdata(pdev, ctrl);
 
        ctrl->pci_bus = kmalloc(sizeof(*ctrl->pci_bus), GFP_KERNEL);
@@ -402,7 +387,6 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
                rc = -ENOMEM;
                goto err_out_unmap_mmio_region;
        }
-       dbg("%s: ctrl->pci_bus %p\n", __FUNCTION__, ctrl->pci_bus);
        memcpy (ctrl->pci_bus, pdev->bus, sizeof (*ctrl->pci_bus));
        ctrl->bus = pdev->bus->number;  /* ctrl bus */
        ctrl->slot_bus = pdev->subordinate->number;  /* bus controlled by this HPC */
@@ -424,25 +408,6 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
        first_device_num = ctrl->slot_device_offset;
        num_ctlr_slots = ctrl->num_slots; 
 
-       /* Store PCI Config Space for all devices on this bus */
-       dbg("%s: Before calling pciehp_save_config, ctrl->bus %x,ctrl->slot_bus %x\n", 
-               __FUNCTION__,ctrl->bus, ctrl->slot_bus);
-       rc = pciehp_save_config(ctrl, ctrl->slot_bus, num_ctlr_slots, first_device_num);
-       if (rc) {
-               err("%s: unable to save PCI configuration data, error %d\n", __FUNCTION__, rc);
-               goto err_out_free_ctrl_bus;
-       }
-
-       /* Get IO, memory, and IRQ resources for new devices */
-       rc = pciehprm_find_available_resources(ctrl);
-       ctrl->add_support = !rc;
-       
-       if (rc) {
-               dbg("pciehprm_find_available_resources = %#x\n", rc);
-               err("unable to locate PCI configuration resources for hot plug add.\n");
-               goto err_out_free_ctrl_bus;
-       }
-
        /* Setup the slot information structures */
        rc = init_slots(ctrl);
        if (rc) {
@@ -451,7 +416,6 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
        }
 
        t_slot = pciehp_find_slot(ctrl, first_device_num);
-       dbg("%s: t_slot %p\n", __FUNCTION__, t_slot);
 
        /*      Finish setting up the hot plug ctrl device */
        ctrl->next_event = 0;
@@ -468,7 +432,6 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
        down(&ctrl->crit_sect);
 
        t_slot->hpc_ops->get_adapter_status(t_slot, &value); /* Check if slot is occupied */
-       dbg("%s: adpater value %x\n", __FUNCTION__, value);
        
        if ((POWER_CTRL(ctrl->ctrlcap)) && !value) {
                rc = t_slot->hpc_ops->power_off_slot(t_slot); /* Power off slot if not occupied*/
@@ -501,7 +464,6 @@ err_out_none:
 
 static int pcie_start_thread(void)
 {
-       int loop;
        int retval = 0;
        
        dbg("Initialize + Start the notification/polling mechanism \n");
@@ -512,32 +474,11 @@ static int pcie_start_thread(void)
                return retval;
        }
 
-       dbg("Initialize slot lists\n");
-       /* One slot list for each bus in the system */
-       for (loop = 0; loop < 256; loop++) {
-               pciehp_slot_list[loop] = NULL;
-       }
-
        return retval;
 }
 
-static inline void __exit
-free_pciehp_res(struct pci_resource *res)
-{
-       struct pci_resource *tres;
-
-       while (res) {
-               tres = res;
-               res = res->next;
-               kfree(tres);
-       }
-}
-
 static void __exit unload_pciehpd(void)
 {
-       struct pci_func *next;
-       struct pci_func *TempSlot;
-       int loop;
        struct controller *ctrl;
        struct controller *tctrl;
 
@@ -546,11 +487,6 @@ static void __exit unload_pciehpd(void)
        while (ctrl) {
                cleanup_slots(ctrl);
 
-               free_pciehp_res(ctrl->io_head);
-               free_pciehp_res(ctrl->mem_head);
-               free_pciehp_res(ctrl->p_mem_head);
-               free_pciehp_res(ctrl->bus_head);
-
                kfree (ctrl->pci_bus);
 
                ctrl->hpc_ops->release_ctlr(ctrl);
@@ -561,20 +497,6 @@ static void __exit unload_pciehpd(void)
                kfree(tctrl);
        }
 
-       for (loop = 0; loop < 256; loop++) {
-               next = pciehp_slot_list[loop];
-               while (next != NULL) {
-                       free_pciehp_res(next->io_head);
-                       free_pciehp_res(next->mem_head);
-                       free_pciehp_res(next->p_mem_head);
-                       free_pciehp_res(next->bus_head);
-
-                       TempSlot = next;
-                       next = next->next;
-                       kfree(TempSlot);
-               }
-       }
-
        /* Stop the notification mechanism */
        pciehp_event_stop_thread();
 
@@ -639,21 +561,16 @@ static int __init pcied_init(void)
        if (retval)
                goto error_hpc_init;
 
-       retval = pciehprm_init(PCI);
-       if (!retval) {
-               retval = pcie_port_service_register(&hpdriver_portdrv);
-               dbg("pcie_port_service_register = %d\n", retval);
-               info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
-               if (retval)
-                  dbg("%s: Failure to register service\n", __FUNCTION__);
-       }
+       retval = pcie_port_service_register(&hpdriver_portdrv);
+       dbg("pcie_port_service_register = %d\n", retval);
+       info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
+       if (retval)
+               dbg("%s: Failure to register service\n", __FUNCTION__);
 
 error_hpc_init:
        if (retval) {
-               pciehprm_cleanup();
                pciehp_event_stop_thread();
-       } else
-               pciehprm_print_pirt();
+       };
 
        return retval;
 }
@@ -663,9 +580,6 @@ static void __exit pcied_cleanup(void)
        dbg("unload_pciehpd()\n");
        unload_pciehpd();
 
-       pciehprm_cleanup();
-
-       dbg("pcie_port_service_unregister\n");
        pcie_port_service_unregister(&hpdriver_portdrv);
 
        info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n");
index 898f6da6f0dec65fae4500f44e4872ce1614cd2b..5e582eca21d8df27f2a1bf83314781e22047c3ab 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/wait.h>
 #include <linux/smp_lock.h>
 #include <linux/pci.h>
 #include "../pci.h"
 #include "pciehp.h"
-#include "pciehprm.h"
 
-static u32 configure_new_device(struct controller *ctrl, struct pci_func *func,
-       u8 behind_bridge, struct resource_lists *resources, u8 bridge_bus, u8 bridge_dev);
-static int configure_new_function( struct controller *ctrl, struct pci_func *func,
-       u8 behind_bridge, struct resource_lists *resources, u8 bridge_bus, u8 bridge_dev);
 static void interrupt_event_handler(struct controller *ctrl);
 
 static struct semaphore event_semaphore;       /* mutex for process loop (up if something to process) */
@@ -60,22 +49,18 @@ u8 pciehp_handle_attention_button(u8 hp_slot, void *inst_id)
        struct slot *p_slot;
        u8 rc = 0;
        u8 getstatus;
-       struct pci_func *func;
        struct event_info *taskInfo;
 
        /* Attention Button Change */
        dbg("pciehp:  Attention button interrupt received.\n");
        
-       func = pciehp_slot_find(ctrl->slot_bus, (hp_slot + ctrl->slot_device_offset), 0);
-
        /* This is the structure that tells the worker thread what to do */
        taskInfo = &(ctrl->event_queue[ctrl->next_event]);
        p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
 
-       p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
        p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
        
-       ctrl->next_event = (ctrl->next_event + 1) % 10;
+       ctrl->next_event = (ctrl->next_event + 1) % MAX_EVENTS;
        taskInfo->hp_slot = hp_slot;
 
        rc++;
@@ -117,24 +102,20 @@ u8 pciehp_handle_switch_change(u8 hp_slot, void *inst_id)
        struct slot *p_slot;
        u8 rc = 0;
        u8 getstatus;
-       struct pci_func *func;
        struct event_info *taskInfo;
 
        /* Switch Change */
        dbg("pciehp:  Switch interrupt received.\n");
 
-       func = pciehp_slot_find(ctrl->slot_bus, (hp_slot + ctrl->slot_device_offset), 0);
-
        /* This is the structure that tells the worker thread
         * what to do
         */
        taskInfo = &(ctrl->event_queue[ctrl->next_event]);
-       ctrl->next_event = (ctrl->next_event + 1) % 10;
+       ctrl->next_event = (ctrl->next_event + 1) % MAX_EVENTS;
        taskInfo->hp_slot = hp_slot;
 
        rc++;
        p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
-       p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
        p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
 
        if (getstatus) {
@@ -142,14 +123,12 @@ u8 pciehp_handle_switch_change(u8 hp_slot, void *inst_id)
                 * Switch opened
                 */
                info("Latch open on Slot(%d)\n", ctrl->first_slot + hp_slot);
-               func->switch_save = 0;
                taskInfo->event_type = INT_SWITCH_OPEN;
        } else {
                /*
                 *  Switch closed
                 */
                info("Latch close on Slot(%d)\n", ctrl->first_slot + hp_slot);
-               func->switch_save = 0x10;
                taskInfo->event_type = INT_SWITCH_CLOSE;
        }
 
@@ -163,20 +142,17 @@ u8 pciehp_handle_presence_change(u8 hp_slot, void *inst_id)
 {
        struct controller *ctrl = (struct controller *) inst_id;
        struct slot *p_slot;
-       u8 rc = 0;
-       struct pci_func *func;
+       u8 presence_save, rc = 0;
        struct event_info *taskInfo;
 
        /* Presence Change */
        dbg("pciehp:  Presence/Notify input change.\n");
 
-       func = pciehp_slot_find(ctrl->slot_bus, (hp_slot + ctrl->slot_device_offset), 0);
-
        /* This is the structure that tells the worker thread
         * what to do
         */
        taskInfo = &(ctrl->event_queue[ctrl->next_event]);
-       ctrl->next_event = (ctrl->next_event + 1) % 10;
+       ctrl->next_event = (ctrl->next_event + 1) % MAX_EVENTS;
        taskInfo->hp_slot = hp_slot;
 
        rc++;
@@ -185,8 +161,8 @@ u8 pciehp_handle_presence_change(u8 hp_slot, void *inst_id)
        /* Switch is open, assume a presence change
         * Save the presence state
         */
-       p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
-       if (func->presence_save) {
+       p_slot->hpc_ops->get_adapter_status(p_slot, &presence_save);
+       if (presence_save) {
                /*
                 * Card Present
                 */
@@ -211,19 +187,16 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
        struct controller *ctrl = (struct controller *) inst_id;
        struct slot *p_slot;
        u8 rc = 0;
-       struct pci_func *func;
        struct event_info *taskInfo;
 
        /* power fault */
        dbg("pciehp:  Power fault interrupt received.\n");
 
-       func = pciehp_slot_find(ctrl->slot_bus, (hp_slot + ctrl->slot_device_offset), 0);
-
        /* this is the structure that tells the worker thread
         * what to do
         */
        taskInfo = &(ctrl->event_queue[ctrl->next_event]);
-       ctrl->next_event = (ctrl->next_event + 1) % 10;
+       ctrl->next_event = (ctrl->next_event + 1) % MAX_EVENTS;
        taskInfo->hp_slot = hp_slot;
 
        rc++;
@@ -234,7 +207,7 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
                 * power fault Cleared
                 */
                info("Power fault cleared on Slot(%d)\n", ctrl->first_slot + hp_slot);
-               func->status = 0x00;
+               p_slot->status = 0x00;
                taskInfo->event_type = INT_POWER_FAULT_CLEAR;
        } else {
                /*
@@ -243,7 +216,7 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
                info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot);
                taskInfo->event_type = INT_POWER_FAULT;
                /* set power fault status for this board */
-               func->status = 0xFF;
+               p_slot->status = 0xFF;
                info("power fault bit %x set\n", hp_slot);
        }
        if (rc)
@@ -252,810 +225,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
        return rc;
 }
 
-
-/**
- * sort_by_size: sort nodes by their length, smallest first.
- *
- * @head: list to sort
- */
-static int sort_by_size(struct pci_resource **head)
-{
-       struct pci_resource *current_res;
-       struct pci_resource *next_res;
-       int out_of_order = 1;
-
-       if (!(*head))
-               return 1;
-
-       if (!((*head)->next))
-               return 0;
-
-       while (out_of_order) {
-               out_of_order = 0;
-
-               /* Special case for swapping list head */
-               if (((*head)->next) &&
-                   ((*head)->length > (*head)->next->length)) {
-                       out_of_order++;
-                       current_res = *head;
-                       *head = (*head)->next;
-                       current_res->next = (*head)->next;
-                       (*head)->next = current_res;
-               }
-
-               current_res = *head;
-
-               while (current_res->next && current_res->next->next) {
-                       if (current_res->next->length > current_res->next->next->length) {
-                               out_of_order++;
-                               next_res = current_res->next;
-                               current_res->next = current_res->next->next;
-                               current_res = current_res->next;
-                               next_res->next = current_res->next;
-                               current_res->next = next_res;
-                       } else
-                               current_res = current_res->next;
-               }
-       }  /* End of out_of_order loop */
-
-       return 0;
-}
-
-
-/*
- * sort_by_max_size
- *
- * Sorts nodes on the list by their length.
- * Largest first.
- *
- */
-static int sort_by_max_size(struct pci_resource **head)
-{
-       struct pci_resource *current_res;
-       struct pci_resource *next_res;
-       int out_of_order = 1;
-
-       if (!(*head))
-               return 1;
-
-       if (!((*head)->next))
-               return 0;
-
-       while (out_of_order) {
-               out_of_order = 0;
-
-               /* Special case for swapping list head */
-               if (((*head)->next) &&
-                   ((*head)->length < (*head)->next->length)) {
-                       out_of_order++;
-                       current_res = *head;
-                       *head = (*head)->next;
-                       current_res->next = (*head)->next;
-                       (*head)->next = current_res;
-               }
-
-               current_res = *head;
-
-               while (current_res->next && current_res->next->next) {
-                       if (current_res->next->length < current_res->next->next->length) {
-                               out_of_order++;
-                               next_res = current_res->next;
-                               current_res->next = current_res->next->next;
-                               current_res = current_res->next;
-                               next_res->next = current_res->next;
-                               current_res->next = next_res;
-                       } else
-                               current_res = current_res->next;
-               }
-       }  /* End of out_of_order loop */
-
-       return 0;
-}
-
-
-/**
- * do_pre_bridge_resource_split: return one unused resource node
- * @head: list to scan
- *
- */
-static struct pci_resource *
-do_pre_bridge_resource_split(struct pci_resource **head,
-                               struct pci_resource **orig_head, u32 alignment)
-{
-       struct pci_resource *prevnode = NULL;
-       struct pci_resource *node;
-       struct pci_resource *split_node;
-       u32 rc;
-       u32 temp_dword;
-       dbg("do_pre_bridge_resource_split\n");
-
-       if (!(*head) || !(*orig_head))
-               return NULL;
-
-       rc = pciehp_resource_sort_and_combine(head);
-
-       if (rc)
-               return NULL;
-
-       if ((*head)->base != (*orig_head)->base)
-               return NULL;
-
-       if ((*head)->length == (*orig_head)->length)
-               return NULL;
-
-
-       /* If we got here, there the bridge requires some of the resource, but
-        *  we may be able to split some off of the front
-        */     
-       node = *head;
-
-       if (node->length & (alignment -1)) {
-               /* this one isn't an aligned length, so we'll make a new entry
-                * and split it up.
-                */
-               split_node = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-
-               if (!split_node)
-                       return NULL;
-
-               temp_dword = (node->length | (alignment-1)) + 1 - alignment;
-
-               split_node->base = node->base;
-               split_node->length = temp_dword;
-
-               node->length -= temp_dword;
-               node->base += split_node->length;
-
-               /* Put it in the list */
-               *head = split_node;
-               split_node->next = node;
-       }
-
-       if (node->length < alignment)
-               return NULL;
-
-       /* Now unlink it */
-       if (*head == node) {
-               *head = node->next;
-       } else {
-               prevnode = *head;
-               while (prevnode->next != node)
-                       prevnode = prevnode->next;
-
-               prevnode->next = node->next;
-       }
-       node->next = NULL;
-
-       return node;
-}
-
-
-/**
- * do_bridge_resource_split: return one unused resource node
- * @head: list to scan
- *
- */
-static struct pci_resource *
-do_bridge_resource_split(struct pci_resource **head, u32 alignment)
-{
-       struct pci_resource *prevnode = NULL;
-       struct pci_resource *node;
-       u32 rc;
-       u32 temp_dword;
-
-       if (!(*head))
-               return NULL;
-
-       rc = pciehp_resource_sort_and_combine(head);
-
-       if (rc)
-               return NULL;
-
-       node = *head;
-
-       while (node->next) {
-               prevnode = node;
-               node = node->next;
-               kfree(prevnode);
-       }
-
-       if (node->length < alignment) {
-               kfree(node);
-               return NULL;
-       }
-
-       if (node->base & (alignment - 1)) {
-               /* Short circuit if adjusted size is too small */
-               temp_dword = (node->base | (alignment-1)) + 1;
-               if ((node->length - (temp_dword - node->base)) < alignment) {
-                       kfree(node);
-                       return NULL;
-               }
-
-               node->length -= (temp_dword - node->base);
-               node->base = temp_dword;
-       }
-
-       if (node->length & (alignment - 1)) {
-               /* There's stuff in use after this node */
-               kfree(node);
-               return NULL;
-       }
-
-       return node;
-}
-
-
-/*
- * get_io_resource
- *
- * this function sorts the resource list by size and then
- * returns the first node of "size" length that is not in the
- * ISA aliasing window.  If it finds a node larger than "size"
- * it will split it up.
- *
- * size must be a power of two.
- */
-static struct pci_resource *get_io_resource(struct pci_resource **head, u32 size)
-{
-       struct pci_resource *prevnode;
-       struct pci_resource *node;
-       struct pci_resource *split_node = NULL;
-       u32 temp_dword;
-
-       if (!(*head))
-               return NULL;
-
-       if ( pciehp_resource_sort_and_combine(head) )
-               return NULL;
-
-       if ( sort_by_size(head) )
-               return NULL;
-
-       for (node = *head; node; node = node->next) {
-               if (node->length < size)
-                       continue;
-
-               if (node->base & (size - 1)) {
-                       /* this one isn't base aligned properly
-                          so we'll make a new entry and split it up */
-                       temp_dword = (node->base | (size-1)) + 1;
-
-                       /*/ Short circuit if adjusted size is too small */
-                       if ((node->length - (temp_dword - node->base)) < size)
-                               continue;
-
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-
-                       split_node->base = node->base;
-                       split_node->length = temp_dword - node->base;
-                       node->base = temp_dword;
-                       node->length -= split_node->length;
-
-                       /* Put it in the list */
-                       split_node->next = node->next;
-                       node->next = split_node;
-               } /* End of non-aligned base */
-
-               /* Don't need to check if too small since we already did */
-               if (node->length > size) {
-                       /* this one is longer than we need
-                          so we'll make a new entry and split it up */
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-
-                       split_node->base = node->base + size;
-                       split_node->length = node->length - size;
-                       node->length = size;
-
-                       /* Put it in the list */
-                       split_node->next = node->next;
-                       node->next = split_node;
-               }  /* End of too big on top end */
-
-               /* For IO make sure it's not in the ISA aliasing space */
-               if (node->base & 0x300L)
-                       continue;
-
-               /* If we got here, then it is the right size 
-                  Now take it out of the list */
-               if (*head == node) {
-                       *head = node->next;
-               } else {
-                       prevnode = *head;
-                       while (prevnode->next != node)
-                               prevnode = prevnode->next;
-
-                       prevnode->next = node->next;
-               }
-               node->next = NULL;
-               /* Stop looping */
-               break;
-       }
-
-       return node;
-}
-
-
-/*
- * get_max_resource
- *
- * Gets the largest node that is at least "size" big from the
- * list pointed to by head.  It aligns the node on top and bottom
- * to "size" alignment before returning it.
- * J.I. modified to put max size limits of; 64M->32M->16M->8M->4M->1M
- *  This is needed to avoid allocating entire ACPI _CRS res to one child bridge/slot.
- */
-static struct pci_resource *get_max_resource(struct pci_resource **head, u32 size)
-{
-       struct pci_resource *max;
-       struct pci_resource *temp;
-       struct pci_resource *split_node;
-       u32 temp_dword;
-       u32 max_size[] = { 0x4000000, 0x2000000, 0x1000000, 0x0800000, 0x0400000, 0x0200000, 0x0100000, 0x00 };
-       int i;
-
-       if (!(*head))
-               return NULL;
-
-       if (pciehp_resource_sort_and_combine(head))
-               return NULL;
-
-       if (sort_by_max_size(head))
-               return NULL;
-
-       for (max = *head;max; max = max->next) {
-
-               /* If not big enough we could probably just bail, 
-                  instead we'll continue to the next. */
-               if (max->length < size)
-                       continue;
-
-               if (max->base & (size - 1)) {
-                       /* this one isn't base aligned properly
-                          so we'll make a new entry and split it up */
-                       temp_dword = (max->base | (size-1)) + 1;
-
-                       /* Short circuit if adjusted size is too small */
-                       if ((max->length - (temp_dword - max->base)) < size)
-                               continue;
-
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-
-                       split_node->base = max->base;
-                       split_node->length = temp_dword - max->base;
-                       max->base = temp_dword;
-                       max->length -= split_node->length;
-
-                       /* Put it next in the list */
-                       split_node->next = max->next;
-                       max->next = split_node;
-               }
-
-               if ((max->base + max->length) & (size - 1)) {
-                       /* this one isn't end aligned properly at the top
-                          so we'll make a new entry and split it up */
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-                       temp_dword = ((max->base + max->length) & ~(size - 1));
-                       split_node->base = temp_dword;
-                       split_node->length = max->length + max->base
-                                            - split_node->base;
-                       max->length -= split_node->length;
-
-                       /* Put it in the list */
-                       split_node->next = max->next;
-                       max->next = split_node;
-               }
-
-               /* Make sure it didn't shrink too much when we aligned it */
-               if (max->length < size)
-                       continue;
-
-               for ( i = 0; max_size[i] > size; i++) {
-                       if (max->length > max_size[i]) {
-                               split_node = kmalloc(sizeof(struct pci_resource),
-                                                       GFP_KERNEL);
-                               if (!split_node)
-                                       break;  /* return NULL; */
-                               split_node->base = max->base + max_size[i];
-                               split_node->length = max->length - max_size[i];
-                               max->length = max_size[i];
-                               /* Put it next in the list */
-                               split_node->next = max->next;
-                               max->next = split_node;
-                               break;
-                       }
-               }
-
-               /* Now take it out of the list */
-               temp = (struct pci_resource*) *head;
-               if (temp == max) {
-                       *head = max->next;
-               } else {
-                       while (temp && temp->next != max) {
-                               temp = temp->next;
-                       }
-
-                       temp->next = max->next;
-               }
-
-               max->next = NULL;
-               return max;
-       }
-
-       /* If we get here, we couldn't find one */
-       return NULL;
-}
-
-
-/*
- * get_resource
- *
- * this function sorts the resource list by size and then
- * returns the first node of "size" length.  If it finds a node
- * larger than "size" it will split it up.
- *
- * size must be a power of two.
- */
-static struct pci_resource *get_resource(struct pci_resource **head, u32 size)
-{
-       struct pci_resource *prevnode;
-       struct pci_resource *node;
-       struct pci_resource *split_node;
-       u32 temp_dword;
-
-       if (!(*head))
-               return NULL;
-
-       if ( pciehp_resource_sort_and_combine(head) )
-               return NULL;
-
-       if ( sort_by_size(head) )
-               return NULL;
-
-       for (node = *head; node; node = node->next) {
-               dbg("%s: req_size =0x%x node=%p, base=0x%x, length=0x%x\n",
-                   __FUNCTION__, size, node, node->base, node->length);
-               if (node->length < size)
-                       continue;
-
-               if (node->base & (size - 1)) {
-                       dbg("%s: not aligned\n", __FUNCTION__);
-                       /* this one isn't base aligned properly
-                          so we'll make a new entry and split it up */
-                       temp_dword = (node->base | (size-1)) + 1;
-
-                       /* Short circuit if adjusted size is too small */
-                       if ((node->length - (temp_dword - node->base)) < size)
-                               continue;
-
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-
-                       split_node->base = node->base;
-                       split_node->length = temp_dword - node->base;
-                       node->base = temp_dword;
-                       node->length -= split_node->length;
-
-                       /* Put it in the list */
-                       split_node->next = node->next;
-                       node->next = split_node;
-               } /* End of non-aligned base */
-
-               /* Don't need to check if too small since we already did */
-               if (node->length > size) {
-                       dbg("%s: too big\n", __FUNCTION__);
-                       /* this one is longer than we need
-                          so we'll make a new entry and split it up */
-                       split_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-
-                       if (!split_node)
-                               return NULL;
-
-                       split_node->base = node->base + size;
-                       split_node->length = node->length - size;
-                       node->length = size;
-
-                       /* Put it in the list */
-                       split_node->next = node->next;
-                       node->next = split_node;
-               }  /* End of too big on top end */
-
-               dbg("%s: got one!!!\n", __FUNCTION__);
-               /* If we got here, then it is the right size
-                  Now take it out of the list */
-               if (*head == node) {
-                       *head = node->next;
-               } else {
-                       prevnode = *head;
-                       while (prevnode->next != node)
-                               prevnode = prevnode->next;
-
-                       prevnode->next = node->next;
-               }
-               node->next = NULL;
-               /* Stop looping */
-               break;
-       }
-       return node;
-}
-
-
-/*
- * pciehp_resource_sort_and_combine
- *
- * Sorts all of the nodes in the list in ascending order by
- * their base addresses.  Also does garbage collection by
- * combining adjacent nodes.
- *
- * returns 0 if success
- */
-int pciehp_resource_sort_and_combine(struct pci_resource **head)
-{
-       struct pci_resource *node1;
-       struct pci_resource *node2;
-       int out_of_order = 1;
-
-       dbg("%s: head = %p, *head = %p\n", __FUNCTION__, head, *head);
-
-       if (!(*head))
-               return 1;
-
-       dbg("*head->next = %p\n",(*head)->next);
-
-       if (!(*head)->next)
-               return 0;       /* only one item on the list, already sorted! */
-
-       dbg("*head->base = 0x%x\n",(*head)->base);
-       dbg("*head->next->base = 0x%x\n",(*head)->next->base);
-       while (out_of_order) {
-               out_of_order = 0;
-
-               /* Special case for swapping list head */
-               if (((*head)->next) &&
-                   ((*head)->base > (*head)->next->base)) {
-                       node1 = *head;
-                       (*head) = (*head)->next;
-                       node1->next = (*head)->next;
-                       (*head)->next = node1;
-                       out_of_order++;
-               }
-
-               node1 = (*head);
-
-               while (node1->next && node1->next->next) {
-                       if (node1->next->base > node1->next->next->base) {
-                               out_of_order++;
-                               node2 = node1->next;
-                               node1->next = node1->next->next;
-                               node1 = node1->next;
-                               node2->next = node1->next;
-                               node1->next = node2;
-                       } else
-                               node1 = node1->next;
-               }
-       }  /* End of out_of_order loop */
-
-       node1 = *head;
-
-       while (node1 && node1->next) {
-               if ((node1->base + node1->length) == node1->next->base) {
-                       /* Combine */
-                       dbg("8..\n");
-                       node1->length += node1->next->length;
-                       node2 = node1->next;
-                       node1->next = node1->next->next;
-                       kfree(node2);
-               } else
-                       node1 = node1->next;
-       }
-
-       return 0;
-}
-
-
-/**
- * pciehp_slot_create - Creates a node and adds it to the proper bus.
- * @busnumber - bus where new node is to be located
- *
- * Returns pointer to the new node or NULL if unsuccessful
- */
-struct pci_func *pciehp_slot_create(u8 busnumber)
-{
-       struct pci_func *new_slot;
-       struct pci_func *next;
-       dbg("%s: busnumber %x\n", __FUNCTION__, busnumber);
-       new_slot = kmalloc(sizeof(struct pci_func), GFP_KERNEL);
-
-       if (new_slot == NULL)
-               return new_slot;
-
-       memset(new_slot, 0, sizeof(struct pci_func));
-
-       new_slot->next = NULL;
-       new_slot->configured = 1;
-
-       if (pciehp_slot_list[busnumber] == NULL) {
-               pciehp_slot_list[busnumber] = new_slot;
-       } else {
-               next = pciehp_slot_list[busnumber];
-               while (next->next != NULL)
-                       next = next->next;
-               next->next = new_slot;
-       }
-       return new_slot;
-}
-
-
-/**
- * slot_remove - Removes a node from the linked list of slots.
- * @old_slot: slot to remove
- *
- * Returns 0 if successful, !0 otherwise.
- */
-static int slot_remove(struct pci_func * old_slot)
-{
-       struct pci_func *next;
-
-       if (old_slot == NULL)
-               return 1;
-
-       next = pciehp_slot_list[old_slot->bus];
-
-       if (next == NULL)
-               return 1;
-
-       if (next == old_slot) {
-               pciehp_slot_list[old_slot->bus] = old_slot->next;
-               pciehp_destroy_board_resources(old_slot);
-               kfree(old_slot);
-               return 0;
-       }
-
-       while ((next->next != old_slot) && (next->next != NULL)) {
-               next = next->next;
-       }
-
-       if (next->next == old_slot) {
-               next->next = old_slot->next;
-               pciehp_destroy_board_resources(old_slot);
-               kfree(old_slot);
-               return 0;
-       } else
-               return 2;
-}
-
-
-/**
- * bridge_slot_remove - Removes a node from the linked list of slots.
- * @bridge: bridge to remove
- *
- * Returns 0 if successful, !0 otherwise.
- */
-static int bridge_slot_remove(struct pci_func *bridge)
-{
-       u8 subordinateBus, secondaryBus;
-       u8 tempBus;
-       struct pci_func *next;
-
-       if (bridge == NULL)
-               return 1;
-
-       secondaryBus = (bridge->config_space[0x06] >> 8) & 0xFF;
-       subordinateBus = (bridge->config_space[0x06] >> 16) & 0xFF;
-
-       for (tempBus = secondaryBus; tempBus <= subordinateBus; tempBus++) {
-               next = pciehp_slot_list[tempBus];
-
-               while (!slot_remove(next)) {
-                       next = pciehp_slot_list[tempBus];
-               }
-       }
-
-       next = pciehp_slot_list[bridge->bus];
-
-       if (next == NULL) {
-               return 1;
-       }
-
-       if (next == bridge) {
-               pciehp_slot_list[bridge->bus] = bridge->next;
-               kfree(bridge);
-               return 0;
-       }
-
-       while ((next->next != bridge) && (next->next != NULL)) {
-               next = next->next;
-       }
-
-       if (next->next == bridge) {
-               next->next = bridge->next;
-               kfree(bridge);
-               return 0;
-       } else
-               return 2;
-}
-
-
-/**
- * pciehp_slot_find - Looks for a node by bus, and device, multiple functions accessed
- * @bus: bus to find
- * @device: device to find
- * @index: is 0 for first function found, 1 for the second...
- *
- * Returns pointer to the node if successful, %NULL otherwise.
- */
-struct pci_func *pciehp_slot_find(u8 bus, u8 device, u8 index)
-{
-       int found = -1;
-       struct pci_func *func;
-
-       func = pciehp_slot_list[bus];
-       dbg("%s: bus %x device %x index %x\n",
-               __FUNCTION__, bus, device, index);
-       if (func != NULL) {
-               dbg("%s: func-> bus %x device %x function %x pci_dev %p\n",
-                       __FUNCTION__, func->bus, func->device, func->function,
-                       func->pci_dev);
-       } else
-               dbg("%s: func == NULL\n", __FUNCTION__);
-
-       if ((func == NULL) || ((func->device == device) && (index == 0)))
-               return func;
-
-       if (func->device == device)
-               found++;
-
-       while (func->next != NULL) {
-               func = func->next;
-
-               dbg("%s: In while loop, func-> bus %x device %x function %x pci_dev %p\n",
-                       __FUNCTION__, func->bus, func->device, func->function,
-                       func->pci_dev);
-               if (func->device == device)
-                       found++;
-               dbg("%s: while loop, found %d, index %d\n", __FUNCTION__,
-                       found, index);
-
-               if ((found == index) || (func->function == index)) {
-                       dbg("%s: Found bus %x dev %x func %x\n", __FUNCTION__,
-                                       func->bus, func->device, func->function);
-                       return func;
-               }
-       }
-
-       return NULL;
-}
-
-static int is_bridge(struct pci_func * func)
-{
-       /* Check the header type */
-       if (((func->config_space[0x03] >> 16) & 0xFF) == 0x01)
-               return 1;
-       else
-               return 0;
-}
-
-
 /* The following routines constitute the bulk of the 
    hotplug controller logic
  */
@@ -1100,20 +269,17 @@ static void set_slot_off(struct controller *ctrl, struct slot * pslot)
  * Configures board
  *
  */
-static u32 board_added(struct pci_func * func, struct controller * ctrl)
+static int board_added(struct slot *p_slot)
 {
        u8 hp_slot;
-       int index;
-       u32 temp_register = 0xFFFFFFFF;
-       u32 rc = 0;
-       struct pci_func *new_func = NULL;
-       struct slot *p_slot;
-       struct resource_lists res_lists;
+       int rc = 0;
+       struct controller *ctrl = p_slot->ctrl;
 
-       p_slot = pciehp_find_slot(ctrl, func->device);
-       hp_slot = func->device - ctrl->slot_device_offset;
+       hp_slot = p_slot->device - ctrl->slot_device_offset;
 
-       dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n", __FUNCTION__, func->device, ctrl->slot_device_offset, hp_slot);
+       dbg("%s: slot device, slot offset, hp slot = %d, %d ,%d\n",
+                       __FUNCTION__, p_slot->device,
+                       ctrl->slot_device_offset, hp_slot);
 
        /* Wait for exclusive access to hardware */
        down(&ctrl->crit_sect);
@@ -1141,9 +307,7 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
        up(&ctrl->crit_sect);
 
        /* Wait for ~1 second */
-       dbg("%s: before long_delay\n", __FUNCTION__);
        wait_for_ctrl_irq (ctrl);
-       dbg("%s: afterlong_delay\n", __FUNCTION__);
 
        /*  Check link training status */
        rc = p_slot->hpc_ops->check_lnk_status(ctrl);  
@@ -1153,98 +317,47 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
                return rc;
        }
 
-       dbg("%s: func status = %x\n", __FUNCTION__, func->status);
+       dbg("%s: slot status = %x\n", __FUNCTION__, p_slot->status);
 
        /* Check for a power fault */
-       if (func->status == 0xFF) {
+       if (p_slot->status == 0xFF) {
                /* power fault occurred, but it was benign */
-               temp_register = 0xFFFFFFFF;
-               dbg("%s: temp register set to %x by power fault\n", __FUNCTION__, temp_register);
                rc = POWER_FAILURE;
-               func->status = 0;
-       } else {
-               /* Get vendor/device ID u32 */
-               rc = pci_bus_read_config_dword (ctrl->pci_dev->subordinate, PCI_DEVFN(func->device, func->function), 
-                       PCI_VENDOR_ID, &temp_register);
-               dbg("%s: pci_bus_read_config_dword returns %d\n", __FUNCTION__, rc);
-               dbg("%s: temp_register is %x\n", __FUNCTION__, temp_register);
-
-               if (rc != 0) {
-                       /* Something's wrong here */
-                       temp_register = 0xFFFFFFFF;
-                       dbg("%s: temp register set to %x by error\n", __FUNCTION__, temp_register);
-               }
-               /* Preset return code.  It will be changed later if things go okay. */
-               rc = NO_ADAPTER_PRESENT;
+               p_slot->status = 0;
+               goto err_exit;
        }
 
-       /* All F's is an empty slot or an invalid board */
-       if (temp_register != 0xFFFFFFFF) {        /* Check for a board in the slot */
-               res_lists.io_head = ctrl->io_head;
-               res_lists.mem_head = ctrl->mem_head;
-               res_lists.p_mem_head = ctrl->p_mem_head;
-               res_lists.bus_head = ctrl->bus_head;
-               res_lists.irqs = NULL;
-
-               rc = configure_new_device(ctrl, func, 0, &res_lists, 0, 0);
-               dbg("%s: back from configure_new_device\n", __FUNCTION__);
-
-               ctrl->io_head = res_lists.io_head;
-               ctrl->mem_head = res_lists.mem_head;
-               ctrl->p_mem_head = res_lists.p_mem_head;
-               ctrl->bus_head = res_lists.bus_head;
+       rc = pciehp_configure_device(p_slot);
+       if (rc) {
+               err("Cannot add device 0x%x:%x\n", p_slot->bus,
+                               p_slot->device);
+               goto err_exit;
+       }
 
-               pciehp_resource_sort_and_combine(&(ctrl->mem_head));
-               pciehp_resource_sort_and_combine(&(ctrl->p_mem_head));
-               pciehp_resource_sort_and_combine(&(ctrl->io_head));
-               pciehp_resource_sort_and_combine(&(ctrl->bus_head));
+       p_slot->status = 0;
 
-               if (rc) {
-                       set_slot_off(ctrl, p_slot);
-                       return rc;
-               }
-               pciehp_save_slot_config(ctrl, func);
-
-               func->status = 0;
-               func->switch_save = 0x10;
-               func->is_a_board = 0x01;
+       /*
+        * Some PCI Express root ports require fixup after hot-plug operation.
+        */
+       if (pcie_mch_quirk)
+               pci_fixup_device(pci_fixup_final, ctrl->pci_dev);
+       if (PWR_LED(ctrl->ctrlcap)) {
+               /* Wait for exclusive access to hardware */
+               down(&ctrl->crit_sect);
 
-               /* next, we will instantiate the linux pci_dev structures 
-                * (with appropriate driver notification, if already present) 
-                */
-               index = 0;
-               do {
-                       new_func = pciehp_slot_find(ctrl->slot_bus, func->device, index++);
-                       if (new_func && !new_func->pci_dev) {
-                               dbg("%s:call pci_hp_configure_dev, func %x\n", 
-                                       __FUNCTION__, index);
-                               pciehp_configure_device(ctrl, new_func);
-                       }
-               } while (new_func);
-
-               /* 
-                * Some PCI Express root ports require fixup after hot-plug operation.
-                */
-               if (pcie_mch_quirk)
-                       pci_fixup_device(pci_fixup_final, ctrl->pci_dev);
-               if (PWR_LED(ctrl->ctrlcap)) {
-                       /* Wait for exclusive access to hardware */
-                       down(&ctrl->crit_sect);
-   
-                       p_slot->hpc_ops->green_led_on(p_slot);
+               p_slot->hpc_ops->green_led_on(p_slot);
   
-                       /* Wait for the command to complete */
-                       wait_for_ctrl_irq (ctrl);
+               /* Wait for the command to complete */
+               wait_for_ctrl_irq (ctrl);
        
-                       /* Done with exclusive hardware access */
-                       up(&ctrl->crit_sect);
-               }
-       } else {
-               set_slot_off(ctrl, p_slot);
-               return -1;
-       }
+               /* Done with exclusive hardware access */
+               up(&ctrl->crit_sect);
+       }
        return 0;
+
+err_exit:
+       set_slot_off(ctrl, p_slot);
+       return -1;
 }
 
 
@@ -1252,55 +365,25 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
  * remove_board - Turns off slot and LED's
  *
  */
-static u32 remove_board(struct pci_func *func, struct controller *ctrl)
+static int remove_board(struct slot *p_slot)
 {
-       int index;
-       u8 skip = 0;
        u8 device;
        u8 hp_slot;
-       u32 rc;
-       struct resource_lists res_lists;
-       struct pci_func *temp_func;
-       struct slot *p_slot;
-
-       if (func == NULL)
-               return 1;
+       int rc;
+       struct controller *ctrl = p_slot->ctrl;
 
-       if (pciehp_unconfigure_device(func))
+       if (pciehp_unconfigure_device(p_slot))
                return 1;
 
-       device = func->device;
+       device = p_slot->device;
 
-       hp_slot = func->device - ctrl->slot_device_offset;
+       hp_slot = p_slot->device - ctrl->slot_device_offset;
        p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
 
        dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
 
-       if ((ctrl->add_support) &&
-               !(func->bus_head || func->mem_head || func->p_mem_head || func->io_head)) {
-               /* Here we check to see if we've saved any of the board's
-                * resources already.  If so, we'll skip the attempt to
-                * determine what's being used.
-                */
-               index = 0;
-
-               temp_func = func;
-
-               while ((temp_func = pciehp_slot_find(temp_func->bus, temp_func->device, index++))) {
-                       if (temp_func->bus_head || temp_func->mem_head
-                           || temp_func->p_mem_head || temp_func->io_head) {
-                               skip = 1;
-                               break;
-                       }
-               }
-
-               if (!skip)
-                       rc = pciehp_save_used_resources(ctrl, func, DISABLE_CARD);
-       }
        /* Change status to shutdown */
-       if (func->is_a_board)
-               func->status = 0x01;
-       func->configured = 0;
+       p_slot->status = 0x01;
 
        /* Wait for exclusive access to hardware */
        down(&ctrl->crit_sect);
@@ -1325,58 +408,8 @@ static u32 remove_board(struct pci_func *func, struct controller *ctrl)
                wait_for_ctrl_irq (ctrl);
        }
 
-       /* Done with exclusive hardware access */
-       up(&ctrl->crit_sect);
-
-       if (ctrl->add_support) {
-               while (func) {
-                       res_lists.io_head = ctrl->io_head;
-                       res_lists.mem_head = ctrl->mem_head;
-                       res_lists.p_mem_head = ctrl->p_mem_head;
-                       res_lists.bus_head = ctrl->bus_head;
-
-                       dbg("Returning resources to ctlr lists for (B/D/F) = (%#x/%#x/%#x)\n", 
-                               func->bus, func->device, func->function);
-
-                       pciehp_return_board_resources(func, &res_lists);
-
-                       ctrl->io_head = res_lists.io_head;
-                       ctrl->mem_head = res_lists.mem_head;
-                       ctrl->p_mem_head = res_lists.p_mem_head;
-                       ctrl->bus_head = res_lists.bus_head;
-
-                       pciehp_resource_sort_and_combine(&(ctrl->mem_head));
-                       pciehp_resource_sort_and_combine(&(ctrl->p_mem_head));
-                       pciehp_resource_sort_and_combine(&(ctrl->io_head));
-                       pciehp_resource_sort_and_combine(&(ctrl->bus_head));
-
-                       if (is_bridge(func)) {
-                               dbg("PCI Bridge Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n", 
-                                       ctrl->seg, func->bus, func->device, func->function);
-                               bridge_slot_remove(func);
-                       } else {
-                               dbg("PCI Function Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n", 
-                                       ctrl->seg, func->bus, func->device, func->function);
-                               slot_remove(func);
-                       }
-
-                       func = pciehp_slot_find(ctrl->slot_bus, device, 0);
-               }
-
-               /* Setup slot structure with entry for empty slot */
-               func = pciehp_slot_create(ctrl->slot_bus);
-
-               if (func == NULL) {
-                       return 1;
-               }
-
-               func->bus = ctrl->slot_bus;
-               func->device = device;
-               func->function = 0;
-               func->configured = 0;
-               func->switch_save = 0x10;
-               func->is_a_board = 0;
-       }
+       /* Done with exclusive hardware access */
+       up(&ctrl->crit_sect);
 
        return 0;
 }
@@ -1411,13 +444,15 @@ static void pciehp_pushbutton_thread(unsigned long slot)
        p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
        if (getstatus) {
                p_slot->state = POWEROFF_STATE;
-               dbg("In power_down_board, b:d(%x:%x)\n", p_slot->bus, p_slot->device);
+               dbg("%s: disabling bus:device(%x:%x)\n", __FUNCTION__,
+                               p_slot->bus, p_slot->device);
 
                pciehp_disable_slot(p_slot);
                p_slot->state = STATIC_STATE;
        } else {
                p_slot->state = POWERON_STATE;
-               dbg("In add_board, b:d(%x:%x)\n", p_slot->bus, p_slot->device);
+               dbg("%s: adding bus:device(%x:%x)\n", __FUNCTION__,
+                               p_slot->bus, p_slot->device);
 
                if (pciehp_enable_slot(p_slot) && PWR_LED(p_slot->ctrl->ctrlcap)) {
                        /* Wait for exclusive access to hardware */
@@ -1459,13 +494,15 @@ static void pciehp_surprise_rm_thread(unsigned long slot)
        p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
        if (!getstatus) {
                p_slot->state = POWEROFF_STATE;
-               dbg("In removing board, b:d(%x:%x)\n", p_slot->bus, p_slot->device);
+               dbg("%s: removing bus:device(%x:%x)\n",
+                               __FUNCTION__, p_slot->bus, p_slot->device);
 
                pciehp_disable_slot(p_slot);
                p_slot->state = STATIC_STATE;
        } else {
                p_slot->state = POWERON_STATE;
-               dbg("In add_board, b:d(%x:%x)\n", p_slot->bus, p_slot->device);
+               dbg("%s: adding bus:device(%x:%x)\n",
+                               __FUNCTION__, p_slot->bus, p_slot->device);
 
                if (pciehp_enable_slot(p_slot) && PWR_LED(p_slot->ctrl->ctrlcap)) {
                        /* Wait for exclusive access to hardware */
@@ -1531,7 +568,6 @@ int pciehp_event_start_thread(void)
                err ("Can't start up our event thread\n");
                return -1;
        }
-       dbg("Our event thread pid = %d\n", pid);
        return 0;
 }
 
@@ -1539,9 +575,7 @@ int pciehp_event_start_thread(void)
 void pciehp_event_stop_thread(void)
 {
        event_finished = 1;
-       dbg("event_thread finish command given\n");
        up(&event_semaphore);
-       dbg("wait for event_thread to exit\n");
        down(&event_exit);
 }
 
@@ -1573,7 +607,6 @@ static void interrupt_event_handler(struct controller *ctrl)
 {
        int loop = 0;
        int change = 1;
-       struct pci_func *func;
        u8 hp_slot;
        u8 getstatus;
        struct slot *p_slot;
@@ -1581,16 +614,12 @@ static void interrupt_event_handler(struct controller *ctrl)
        while (change) {
                change = 0;
 
-               for (loop = 0; loop < 10; loop++) {
+               for (loop = 0; loop < MAX_EVENTS; loop++) {
                        if (ctrl->event_queue[loop].event_type != 0) {
                                hp_slot = ctrl->event_queue[loop].hp_slot;
 
-                               func = pciehp_slot_find(ctrl->slot_bus, (hp_slot + ctrl->slot_device_offset), 0);
-
                                p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
 
-                               dbg("hp_slot %d, func %p, p_slot %p\n", hp_slot, func, p_slot);
-
                                if (ctrl->event_queue[loop].event_type == INT_BUTTON_CANCEL) {
                                        dbg("button cancel\n");
                                        del_timer(&p_slot->task_event);
@@ -1682,7 +711,6 @@ static void interrupt_event_handler(struct controller *ctrl)
                                                p_slot->task_event.function = (void (*)(unsigned long)) pushbutton_helper_thread;
                                                p_slot->task_event.data = (unsigned long) p_slot;
 
-                                               dbg("add_timer p_slot = %p\n", (void *) p_slot);
                                                add_timer(&p_slot->task_event);
                                        }
                                }
@@ -1737,13 +765,6 @@ int pciehp_enable_slot(struct slot *p_slot)
 {
        u8 getstatus = 0;
        int rc;
-       struct pci_func *func;
-
-       func = pciehp_slot_find(p_slot->bus, p_slot->device, 0);
-       if (!func) {
-               dbg("%s: Error! slot NULL\n", __FUNCTION__);
-               return 1;
-       }
 
        /* Check to see if (latch closed, card present, power off) */
        down(&p_slot->ctrl->crit_sect);
@@ -1773,45 +794,11 @@ int pciehp_enable_slot(struct slot *p_slot)
        }
        up(&p_slot->ctrl->crit_sect);
 
-       slot_remove(func);
-
-       func = pciehp_slot_create(p_slot->bus);
-       if (func == NULL)
-               return 1;
-
-       func->bus = p_slot->bus;
-       func->device = p_slot->device;
-       func->function = 0;
-       func->configured = 0;
-       func->is_a_board = 1;
-
-       /* We have to save the presence info for these slots */
-       p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
        p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-       func->switch_save = !getstatus? 0x10:0;
 
-       rc = board_added(func, p_slot->ctrl);
+       rc = board_added(p_slot);
        if (rc) {
-               if (is_bridge(func))
-                       bridge_slot_remove(func);
-               else
-                       slot_remove(func);
-
-               /* Setup slot structure with entry for empty slot */
-               func = pciehp_slot_create(p_slot->bus);
-               if (func == NULL)
-                       return 1;       /* Out of memory */
-
-               func->bus = p_slot->bus;
-               func->device = p_slot->device;
-               func->function = 0;
-               func->configured = 0;
-               func->is_a_board = 1;
-
-               /* We have to save the presence info for these slots */
-               p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
                p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-               func->switch_save = !getstatus? 0x10:0;
        }
 
        if (p_slot)
@@ -1823,14 +810,8 @@ int pciehp_enable_slot(struct slot *p_slot)
 
 int pciehp_disable_slot(struct slot *p_slot)
 {
-       u8 class_code, header_type, BCR;
-       u8 index = 0;
        u8 getstatus = 0;
-       u32 rc = 0;
        int ret = 0;
-       unsigned int devfn;
-       struct pci_bus *pci_bus = p_slot->ctrl->pci_dev->subordinate;
-       struct pci_func *func;
 
        if (!p_slot->ctrl)
                return 1;
@@ -1867,838 +848,8 @@ int pciehp_disable_slot(struct slot *p_slot)
 
        up(&p_slot->ctrl->crit_sect);
 
-       func = pciehp_slot_find(p_slot->bus, p_slot->device, index++);
-
-       /* Make sure there are no video controllers here
-        * for all func of p_slot
-        */
-       while (func && !rc) {
-               pci_bus->number = func->bus;
-               devfn = PCI_DEVFN(func->device, func->function);
-
-               /* Check the Class Code */
-               rc = pci_bus_read_config_byte (pci_bus, devfn, 0x0B, &class_code);
-               if (rc)
-                       return rc;
-
-               if (class_code == PCI_BASE_CLASS_DISPLAY) {
-                       /* Display/Video adapter (not supported) */
-                       rc = REMOVE_NOT_SUPPORTED;
-               } else {
-                       /* See if it's a bridge */
-                       rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
-                       if (rc)
-                               return rc;
-
-                       /* If it's a bridge, check the VGA Enable bit */
-                       if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
-                               rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_BRIDGE_CONTROL, &BCR);
-                               if (rc)
-                                       return rc;
-
-                               /* If the VGA Enable bit is set, remove isn't supported */
-                               if (BCR & PCI_BRIDGE_CTL_VGA) {
-                                       rc = REMOVE_NOT_SUPPORTED;
-                               }
-                       }
-               }
-
-               func = pciehp_slot_find(p_slot->bus, p_slot->device, index++);
-       }
-
-       func = pciehp_slot_find(p_slot->bus, p_slot->device, 0);
-       if ((func != NULL) && !rc) {
-               rc = remove_board(func, p_slot->ctrl);
-       } else if (!rc)
-               rc = 1;
-
-       if (p_slot)
-               update_slot_info(p_slot);
-
-       return rc;
-}
-
-
-/**
- * configure_new_device - Configures the PCI header information of one board.
- *
- * @ctrl: pointer to controller structure
- * @func: pointer to function structure
- * @behind_bridge: 1 if this is a recursive call, 0 if not
- * @resources: pointer to set of resource lists
- *
- * Returns 0 if success
- *
- */
-static u32 configure_new_device(struct controller * ctrl, struct pci_func * func,
-       u8 behind_bridge, struct resource_lists * resources, u8 bridge_bus, u8 bridge_dev)
-{
-       u8 temp_byte, function, max_functions, stop_it;
-       int rc;
-       u32 ID;
-       struct pci_func *new_slot;
-       struct pci_bus lpci_bus, *pci_bus;
-       int index;
-
-       new_slot = func;
-
-       dbg("%s\n", __FUNCTION__);
-       memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-
-       /* Check for Multi-function device */
-       rc = pci_bus_read_config_byte(pci_bus, PCI_DEVFN(func->device, func->function), 0x0E, &temp_byte);
-       if (rc) {
-               dbg("%s: rc = %d\n", __FUNCTION__, rc);
-               return rc;
-       }
-
-       if (temp_byte & 0x80)   /* Multi-function device */
-               max_functions = 8;
-       else
-               max_functions = 1;
-
-       function = 0;
-
-       do {
-               rc = configure_new_function(ctrl, new_slot, behind_bridge,
-                                       resources, bridge_bus, bridge_dev);
-
-               if (rc) {
-                       dbg("configure_new_function failed: %d\n", rc);
-                       index = 0;
-
-                       while (new_slot) {
-                               new_slot = pciehp_slot_find(new_slot->bus,
-                                               new_slot->device, index++);
-
-                               if (new_slot)
-                                       pciehp_return_board_resources(new_slot,
-                                               resources);
-                       }
-
-                       return rc;
-               }
-
-               function++;
-
-               stop_it = 0;
-
-               /*  The following loop skips to the next present function
-                *  and creates a board structure
-                */
-
-               while ((function < max_functions) && (!stop_it)) {
-                       pci_bus_read_config_dword(pci_bus, PCI_DEVFN(func->device, function), 0x00, &ID);
-
-                       if (ID == 0xFFFFFFFF) {   /* There's nothing there. */
-                               function++;
-                       } else {  /* There's something there */
-                               /* Setup slot structure. */
-                               new_slot = pciehp_slot_create(func->bus);
-
-                               if (new_slot == NULL) {
-                                       /* Out of memory */
-                                       return 1;
-                               }
-
-                               new_slot->bus = func->bus;
-                               new_slot->device = func->device;
-                               new_slot->function = function;
-                               new_slot->is_a_board = 1;
-                               new_slot->status = 0;
-
-                               stop_it++;
-                       }
-               }
-
-       } while (function < max_functions);
-       dbg("returning from %s\n", __FUNCTION__);
-
-       return 0;
-}
-
-/*
- * Configuration logic that involves the hotplug data structures and 
- * their bookkeeping
- */
-
-/**
- * configure_bridge: fill bridge's registers, either configure or disable it.
- */
-static int
-configure_bridge(struct pci_bus *pci_bus, unsigned int devfn,
-                       struct pci_resource *mem_node,
-                       struct pci_resource **hold_mem_node,
-                       int base_addr, int limit_addr)
-{
-       u16 temp_word;
-       u32 rc;
-
-       if (mem_node) {
-               memcpy(*hold_mem_node, mem_node, sizeof(struct pci_resource));
-               mem_node->next = NULL;
-
-               /* set Mem base and Limit registers */
-               RES_CHECK(mem_node->base, 16);
-               temp_word = (u16)(mem_node->base >> 16);
-               rc = pci_bus_write_config_word(pci_bus, devfn, base_addr, temp_word);
-
-               RES_CHECK(mem_node->base + mem_node->length - 1, 16);
-               temp_word = (u16)((mem_node->base + mem_node->length - 1) >> 16);
-               rc = pci_bus_write_config_word(pci_bus, devfn, limit_addr, temp_word);
-       } else {
-               temp_word = 0xFFFF;
-               rc = pci_bus_write_config_word(pci_bus, devfn, base_addr, temp_word);
-
-               temp_word = 0x0000;
-               rc = pci_bus_write_config_word(pci_bus, devfn, limit_addr, temp_word);
-
-               kfree(*hold_mem_node);
-               *hold_mem_node = NULL;
-       }
-       return rc;
-}
-
-static int
-configure_new_bridge(struct controller *ctrl, struct pci_func *func,
-               u8 behind_bridge, struct resource_lists *resources,
-               struct pci_bus *pci_bus)
-{
-       int cloop;
-       u8 temp_byte;
-       u8 device;
-       u16 temp_word;
-       u32 rc;
-       u32 ID;
-       unsigned int devfn;
-       struct pci_resource *mem_node;
-       struct pci_resource *p_mem_node;
-       struct pci_resource *io_node;
-       struct pci_resource *bus_node;
-       struct pci_resource *hold_mem_node;
-       struct pci_resource *hold_p_mem_node;
-       struct pci_resource *hold_IO_node;
-       struct pci_resource *hold_bus_node;
-       struct irq_mapping irqs;
-       struct pci_func *new_slot;
-       struct resource_lists temp_resources;
-
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       /* set Primary bus */
-       dbg("set Primary bus = 0x%x\n", func->bus);
-       rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_PRIMARY_BUS, func->bus);
-       if (rc)
-               return rc;
-
-       /* find range of busses to use */
-       bus_node = get_max_resource(&resources->bus_head, 1L);
-
-       /* If we don't have any busses to allocate, we can't continue */
-       if (!bus_node) {
-               err("Got NO bus resource to use\n");
-               return -ENOMEM;
-       }
-       dbg("Got ranges of buses to use: base:len=0x%x:%x\n", bus_node->base, bus_node->length);
-
-       /* set Secondary bus */
-       temp_byte = (u8)bus_node->base;
-       dbg("set Secondary bus = 0x%x\n", temp_byte);
-       rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, temp_byte);
-       if (rc)
-               return rc;
-
-       /* set subordinate bus */
-       temp_byte = (u8)(bus_node->base + bus_node->length - 1);
-       dbg("set subordinate bus = 0x%x\n", temp_byte);
-       rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_SUBORDINATE_BUS, temp_byte);
-       if (rc)
-               return rc;
-
-       /* Set HP parameters (Cache Line Size, Latency Timer) */
-       rc = pciehprm_set_hpp(ctrl, func, PCI_HEADER_TYPE_BRIDGE);
-       if (rc)
-               return rc;
-
-       /* Setup the IO, memory, and prefetchable windows */
-
-       io_node = get_max_resource(&(resources->io_head), 0x1000L);
-       if (io_node) {
-               dbg("io_node(base, len, next) (%x, %x, %p)\n", io_node->base,
-                               io_node->length, io_node->next);
-       }
-
-       mem_node = get_max_resource(&(resources->mem_head), 0x100000L);
-       if (mem_node) {
-               dbg("mem_node(base, len, next) (%x, %x, %p)\n", mem_node->base,
-                               mem_node->length, mem_node->next);
-       }
-
-       if (resources->p_mem_head)
-               p_mem_node = get_max_resource(&(resources->p_mem_head), 0x100000L);
-       else {
-               /*
-                * In some platform implementation, MEM and PMEM are not
-                *  distinguished, and hence ACPI _CRS has only MEM entries
-                *  for both MEM and PMEM.
-                */
-               dbg("using MEM for PMEM\n");
-               p_mem_node = get_max_resource(&(resources->mem_head), 0x100000L);
-       }
-       if (p_mem_node) {
-               dbg("p_mem_node(base, len, next) (%x, %x, %p)\n", p_mem_node->base,
-                               p_mem_node->length, p_mem_node->next);
-       }
-
-       /* set up the IRQ info */
-       if (!resources->irqs) {
-               irqs.barber_pole = 0;
-               irqs.interrupt[0] = 0;
-               irqs.interrupt[1] = 0;
-               irqs.interrupt[2] = 0;
-               irqs.interrupt[3] = 0;
-               irqs.valid_INT = 0;
-       } else {
-               irqs.barber_pole = resources->irqs->barber_pole;
-               irqs.interrupt[0] = resources->irqs->interrupt[0];
-               irqs.interrupt[1] = resources->irqs->interrupt[1];
-               irqs.interrupt[2] = resources->irqs->interrupt[2];
-               irqs.interrupt[3] = resources->irqs->interrupt[3];
-               irqs.valid_INT = resources->irqs->valid_INT;
-       }
-
-       /* set up resource lists that are now aligned on top and bottom
-        * for anything behind the bridge.
-        */
-       temp_resources.bus_head = bus_node;
-       temp_resources.io_head = io_node;
-       temp_resources.mem_head = mem_node;
-       temp_resources.p_mem_head = p_mem_node;
-       temp_resources.irqs = &irqs;
-
-       /* Make copies of the nodes we are going to pass down so that
-        * if there is a problem,we can just use these to free resources
-        */
-       hold_bus_node = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-       hold_IO_node = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-       hold_mem_node = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-       hold_p_mem_node = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-
-       if (!hold_bus_node || !hold_IO_node || !hold_mem_node || !hold_p_mem_node) {
-               kfree(hold_bus_node);
-               kfree(hold_IO_node);
-               kfree(hold_mem_node);
-               kfree(hold_p_mem_node);
-
-               return 1;
-       }
-
-       memcpy(hold_bus_node, bus_node, sizeof(struct pci_resource));
-
-       bus_node->base += 1;
-       bus_node->length -= 1;
-       bus_node->next = NULL;
-
-       /* If we have IO resources copy them and fill in the bridge's
-        * IO range registers
-        */
-       if (io_node) {
-               memcpy(hold_IO_node, io_node, sizeof(struct pci_resource));
-               io_node->next = NULL;
-
-               /* set IO base and Limit registers */
-               RES_CHECK(io_node->base, 8);
-               temp_byte = (u8)(io_node->base >> 8);
-               rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_IO_BASE, temp_byte);
-
-               RES_CHECK(io_node->base + io_node->length - 1, 8);
-               temp_byte = (u8)((io_node->base + io_node->length - 1) >> 8);
-               rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_IO_LIMIT, temp_byte);
-       } else {
-               kfree(hold_IO_node);
-               hold_IO_node = NULL;
-       }
-
-       /* If we have memory resources copy them and fill in the bridge's
-        * memory range registers.  Otherwise, fill in the range
-        * registers with values that disable them.
-        */
-       rc = configure_bridge(pci_bus, devfn, mem_node, &hold_mem_node,
-                               PCI_MEMORY_BASE, PCI_MEMORY_LIMIT);
-
-       /* If we have prefetchable memory resources copy them and 
-        * fill in the bridge's memory range registers.  Otherwise,
-        * fill in the range registers with values that disable them.
-        */
-       rc = configure_bridge(pci_bus, devfn, p_mem_node, &hold_p_mem_node,
-                               PCI_PREF_MEMORY_BASE, PCI_PREF_MEMORY_LIMIT);
-
-       /* Adjust this to compensate for extra adjustment in first loop */
-       irqs.barber_pole--;
-
-       rc = 0;
-
-       /* Here we actually find the devices and configure them */
-       for (device = 0; (device <= 0x1F) && !rc; device++) {
-               irqs.barber_pole = (irqs.barber_pole + 1) & 0x03;
-
-               ID = 0xFFFFFFFF;
-               pci_bus->number = hold_bus_node->base;
-               pci_bus_read_config_dword (pci_bus, PCI_DEVFN(device, 0), PCI_VENDOR_ID, &ID);
-               pci_bus->number = func->bus;
-
-               if (ID != 0xFFFFFFFF) {   /*  device Present */
-                       /* Setup slot structure. */
-                       new_slot = pciehp_slot_create(hold_bus_node->base);
-
-                       if (new_slot == NULL) {
-                               /* Out of memory */
-                               rc = -ENOMEM;
-                               continue;
-                       }
-
-                       new_slot->bus = hold_bus_node->base;
-                       new_slot->device = device;
-                       new_slot->function = 0;
-                       new_slot->is_a_board = 1;
-                       new_slot->status = 0;
-
-                       rc = configure_new_device(ctrl, new_slot, 1,
-                                       &temp_resources, func->bus,
-                                       func->device);
-                       dbg("configure_new_device rc=0x%x\n",rc);
-               }       /* End of IF (device in slot?) */
-       }               /* End of FOR loop */
-
-       if (rc) {
-               pciehp_destroy_resource_list(&temp_resources);
-
-               return_resource(&(resources->bus_head), hold_bus_node);
-               return_resource(&(resources->io_head), hold_IO_node);
-               return_resource(&(resources->mem_head), hold_mem_node);
-               return_resource(&(resources->p_mem_head), hold_p_mem_node);
-               return(rc);
-       }
-
-       /* save the interrupt routing information */
-       if (resources->irqs) {
-               resources->irqs->interrupt[0] = irqs.interrupt[0];
-               resources->irqs->interrupt[1] = irqs.interrupt[1];
-               resources->irqs->interrupt[2] = irqs.interrupt[2];
-               resources->irqs->interrupt[3] = irqs.interrupt[3];
-               resources->irqs->valid_INT = irqs.valid_INT;
-       } else if (!behind_bridge) {
-               /* We need to hook up the interrupts here */
-               for (cloop = 0; cloop < 4; cloop++) {
-                       if (irqs.valid_INT & (0x01 << cloop)) {
-                               rc = pciehp_set_irq(func->bus, func->device,
-                                                       0x0A + cloop, irqs.interrupt[cloop]);
-                               if (rc) {
-                                       pciehp_destroy_resource_list (&temp_resources);
-                                       return_resource(&(resources->bus_head), hold_bus_node);
-                                       return_resource(&(resources->io_head), hold_IO_node);
-                                       return_resource(&(resources->mem_head), hold_mem_node);
-                                       return_resource(&(resources->p_mem_head), hold_p_mem_node);
-                                       return rc;
-                               }
-                       }
-               }       /* end of for loop */
-       }
-
-       /* Return unused bus resources
-        * First use the temporary node to store information for the board
-        */
-       if (hold_bus_node && bus_node && temp_resources.bus_head) {
-               hold_bus_node->length = bus_node->base - hold_bus_node->base;
-
-               hold_bus_node->next = func->bus_head;
-               func->bus_head = hold_bus_node;
-
-               temp_byte = (u8)(temp_resources.bus_head->base - 1);
-
-               /* set subordinate bus */
-               dbg("re-set subordinate bus = 0x%x\n", temp_byte);
-               rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_SUBORDINATE_BUS, temp_byte);
-
-               if (temp_resources.bus_head->length == 0) {
-                       kfree(temp_resources.bus_head);
-                       temp_resources.bus_head = NULL;
-               } else {
-                       dbg("return bus res of b:d(0x%x:%x) base:len(0x%x:%x)\n",
-                               func->bus, func->device, temp_resources.bus_head->base, temp_resources.bus_head->length);
-                       return_resource(&(resources->bus_head), temp_resources.bus_head);
-               }
-       }
-
-       /* If we have IO space available and there is some left,
-        * return the unused portion
-        */
-       if (hold_IO_node && temp_resources.io_head) {
-               io_node = do_pre_bridge_resource_split(&(temp_resources.io_head),
-                                                       &hold_IO_node, 0x1000);
-
-               /* Check if we were able to split something off */
-               if (io_node) {
-                       hold_IO_node->base = io_node->base + io_node->length;
-
-                       RES_CHECK(hold_IO_node->base, 8);
-                       temp_byte = (u8)((hold_IO_node->base) >> 8);
-                       rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_IO_BASE, temp_byte);
-
-                       return_resource(&(resources->io_head), io_node);
-               }
-
-               io_node = do_bridge_resource_split(&(temp_resources.io_head), 0x1000);
-
-               /*  Check if we were able to split something off */
-               if (io_node) {
-                       /* First use the temporary node to store information for the board */
-                       hold_IO_node->length = io_node->base - hold_IO_node->base;
-
-                       /* If we used any, add it to the board's list */
-                       if (hold_IO_node->length) {
-                               hold_IO_node->next = func->io_head;
-                               func->io_head = hold_IO_node;
-
-                               RES_CHECK(io_node->base - 1, 8);
-                               temp_byte = (u8)((io_node->base - 1) >> 8);
-                               rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_IO_LIMIT, temp_byte);
-
-                               return_resource(&(resources->io_head), io_node);
-                       } else {
-                               /* it doesn't need any IO */
-                               temp_byte = 0x00;
-                               rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_LIMIT, temp_byte);
-
-                               return_resource(&(resources->io_head), io_node);
-                               kfree(hold_IO_node);
-                       }
-               } else {
-                       /* it used most of the range */
-                       hold_IO_node->next = func->io_head;
-                       func->io_head = hold_IO_node;
-               }
-       } else if (hold_IO_node) {
-               /* it used the whole range */
-               hold_IO_node->next = func->io_head;
-               func->io_head = hold_IO_node;
-       }
-
-       /* If we have memory space available and there is some left,
-        * return the unused portion
-        */
-       if (hold_mem_node && temp_resources.mem_head) {
-               mem_node = do_pre_bridge_resource_split(&(temp_resources.mem_head), &hold_mem_node, 0x100000L);
-
-               /* Check if we were able to split something off */
-               if (mem_node) {
-                       hold_mem_node->base = mem_node->base + mem_node->length;
-
-                       RES_CHECK(hold_mem_node->base, 16);
-                       temp_word = (u16)((hold_mem_node->base) >> 16);
-                       rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_BASE, temp_word);
-
-                       return_resource(&(resources->mem_head), mem_node);
-               }
-
-               mem_node = do_bridge_resource_split(&(temp_resources.mem_head), 0x100000L);
-
-               /* Check if we were able to split something off */
-               if (mem_node) {
-                       /* First use the temporary node to store information for the board */
-                       hold_mem_node->length = mem_node->base - hold_mem_node->base;
-
-                       if (hold_mem_node->length) {
-                               hold_mem_node->next = func->mem_head;
-                               func->mem_head = hold_mem_node;
-
-                               /* configure end address */
-                               RES_CHECK(mem_node->base - 1, 16);
-                               temp_word = (u16)((mem_node->base - 1) >> 16);
-                               rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word);
-
-                               /* Return unused resources to the pool */
-                               return_resource(&(resources->mem_head), mem_node);
-                       } else {
-                               /* it doesn't need any Mem */
-                               temp_word = 0x0000;
-                               rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word);
-
-                               return_resource(&(resources->mem_head), mem_node);
-                               kfree(hold_mem_node);
-                       }
-               } else {
-                       /* it used most of the range */
-                       hold_mem_node->next = func->mem_head;
-                       func->mem_head = hold_mem_node;
-               }
-       } else if (hold_mem_node) {
-               /* it used the whole range */
-               hold_mem_node->next = func->mem_head;
-               func->mem_head = hold_mem_node;
-       }
-
-       /* If we have prefetchable memory space available and there is some 
-        * left at the end, return the unused portion
-        */
-       if (hold_p_mem_node && temp_resources.p_mem_head) {
-               p_mem_node = do_pre_bridge_resource_split(&(temp_resources.p_mem_head),
-                                                               &hold_p_mem_node, 0x100000L);
-
-               /* Check if we were able to split something off */
-               if (p_mem_node) {
-                       hold_p_mem_node->base = p_mem_node->base + p_mem_node->length;
-
-                       RES_CHECK(hold_p_mem_node->base, 16);
-                       temp_word = (u16)((hold_p_mem_node->base) >> 16);
-                       rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_BASE, temp_word);
-
-                       return_resource(&(resources->p_mem_head), p_mem_node);
-               }
-
-               p_mem_node = do_bridge_resource_split(&(temp_resources.p_mem_head), 0x100000L);
-
-               /* Check if we were able to split something off */
-               if (p_mem_node) {
-                       /* First use the temporary node to store information for the board */
-                       hold_p_mem_node->length = p_mem_node->base - hold_p_mem_node->base;
-
-                       /* If we used any, add it to the board's list */
-                       if (hold_p_mem_node->length) {
-                               hold_p_mem_node->next = func->p_mem_head;
-                               func->p_mem_head = hold_p_mem_node;
-
-                               RES_CHECK(p_mem_node->base - 1, 16);
-                               temp_word = (u16)((p_mem_node->base - 1) >> 16);
-                               rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, temp_word);
-
-                               return_resource(&(resources->p_mem_head), p_mem_node);
-                       } else {
-                               /* it doesn't need any PMem */
-                               temp_word = 0x0000;
-                               rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, temp_word);
-
-                               return_resource(&(resources->p_mem_head), p_mem_node);
-                               kfree(hold_p_mem_node);
-                       }
-               } else {
-                       /* it used the most of the range */
-                       hold_p_mem_node->next = func->p_mem_head;
-                       func->p_mem_head = hold_p_mem_node;
-               }
-       } else if (hold_p_mem_node) {
-               /* it used the whole range */
-               hold_p_mem_node->next = func->p_mem_head;
-               func->p_mem_head = hold_p_mem_node;
-       }
-
-       /* We should be configuring an IRQ and the bridge's base address
-        * registers if it needs them.  Although we have never seen such
-        * a device
-        */
-
-       pciehprm_enable_card(ctrl, func, PCI_HEADER_TYPE_BRIDGE);
-
-       dbg("PCI Bridge Hot-Added s:b:d:f(%02x:%02x:%02x:%02x)\n", ctrl->seg, func->bus, func->device, func->function);
-
-       return rc;
+       ret = remove_board(p_slot);
+       update_slot_info(p_slot);
+       return ret;
 }
 
-/**
- * configure_new_function - Configures the PCI header information of one device
- *
- * @ctrl: pointer to controller structure
- * @func: pointer to function structure
- * @behind_bridge: 1 if this is a recursive call, 0 if not
- * @resources: pointer to set of resource lists
- *
- * Calls itself recursively for bridged devices.
- * Returns 0 if success
- *
- */
-static int
-configure_new_function(struct controller *ctrl, struct pci_func *func,
-               u8 behind_bridge, struct resource_lists *resources,
-               u8 bridge_bus, u8 bridge_dev)
-{
-       int cloop;
-       u8 temp_byte;
-       u8 class_code;
-       u32 rc;
-       u32 temp_register;
-       u32 base;
-       unsigned int devfn;
-       struct pci_resource *mem_node;
-       struct pci_resource *io_node;
-       struct pci_bus lpci_bus, *pci_bus;
-
-       memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       /* Check for Bridge */
-       rc = pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &temp_byte);
-       if (rc)
-               return rc;
-       dbg("%s: bus %x dev %x func %x temp_byte = %x\n", __FUNCTION__,
-               func->bus, func->device, func->function, temp_byte);
-
-       if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_BRIDGE) { /* PCI-PCI Bridge */
-               rc = configure_new_bridge(ctrl, func, behind_bridge, resources,
-                                               pci_bus);
-
-               if (rc)
-                       return rc;
-       } else if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_NORMAL) {
-               /* Standard device */
-               u64     base64;
-               rc = pci_bus_read_config_byte(pci_bus, devfn, 0x0B, &class_code);
-
-               if (class_code == PCI_BASE_CLASS_DISPLAY)
-                       return DEVICE_TYPE_NOT_SUPPORTED;
-
-               /* Figure out IO and memory needs */
-               for (cloop = PCI_BASE_ADDRESS_0; cloop <= PCI_BASE_ADDRESS_5; cloop += 4) {
-                       temp_register = 0xFFFFFFFF;
-
-                       rc = pci_bus_write_config_dword (pci_bus, devfn, cloop, temp_register);
-                       rc = pci_bus_read_config_dword(pci_bus, devfn, cloop, &temp_register);
-                       dbg("Bar[%x]=0x%x on bus:dev:func(0x%x:%x:%x)\n", cloop, temp_register, 
-                               func->bus, func->device, func->function);
-
-                       if (!temp_register)
-                               continue;
-
-                       base64 = 0L;
-                       if (temp_register & PCI_BASE_ADDRESS_SPACE_IO) {
-                               /* Map IO */
-
-                               /* set base = amount of IO space */
-                               base = temp_register & 0xFFFFFFFC;
-                               base = ~base + 1;
-
-                               dbg("NEED IO length(0x%x)\n", base);
-                               io_node = get_io_resource(&(resources->io_head),(ulong)base);
-
-                               /* allocate the resource to the board */
-                               if (io_node) {
-                                       dbg("Got IO base=0x%x(length=0x%x)\n", io_node->base, io_node->length);
-                                       base = (u32)io_node->base;
-                                       io_node->next = func->io_head;
-                                       func->io_head = io_node;
-                               } else {
-                                       err("Got NO IO resource(length=0x%x)\n", base);
-                                       return -ENOMEM;
-                               }
-                       } else {        /* map MEM */
-                               int prefetchable = 1;
-                               struct pci_resource **res_node = &func->p_mem_head;
-                               char *res_type_str = "PMEM";
-                               u32     temp_register2;
-
-                               if (!(temp_register & PCI_BASE_ADDRESS_MEM_PREFETCH)) {
-                                       prefetchable = 0;
-                                       res_node = &func->mem_head;
-                                       res_type_str++;
-                               }
-
-                               base = temp_register & 0xFFFFFFF0;
-                               base = ~base + 1;
-
-                               switch (temp_register & PCI_BASE_ADDRESS_MEM_TYPE_MASK) {
-                               case PCI_BASE_ADDRESS_MEM_TYPE_32:
-                                       dbg("NEED 32 %s bar=0x%x(length=0x%x)\n", res_type_str, temp_register, base);
-
-                                       if (prefetchable && resources->p_mem_head)
-                                               mem_node=get_resource(&(resources->p_mem_head), (ulong)base);
-                                       else {
-                                               if (prefetchable)
-                                                       dbg("using MEM for PMEM\n");
-                                               mem_node = get_resource(&(resources->mem_head), (ulong)base);
-                                       }
-
-                                       /* allocate the resource to the board */
-                                       if (mem_node) {
-                                               base = (u32)mem_node->base; 
-                                               mem_node->next = *res_node;
-                                               *res_node = mem_node;
-                                               dbg("Got 32 %s base=0x%x(length=0x%x)\n", res_type_str, mem_node->base, 
-                                                       mem_node->length);
-                                       } else {
-                                               err("Got NO 32 %s resource(length=0x%x)\n", res_type_str, base);
-                                               return -ENOMEM;
-                                       }
-                                       break;
-                               case PCI_BASE_ADDRESS_MEM_TYPE_64:
-                                       rc = pci_bus_read_config_dword(pci_bus, devfn, cloop+4, &temp_register2);
-                                       dbg("NEED 64 %s bar=0x%x:%x(length=0x%x)\n", res_type_str, temp_register2, 
-                                               temp_register, base);
-
-                                       if (prefetchable && resources->p_mem_head)
-                                               mem_node = get_resource(&(resources->p_mem_head), (ulong)base);
-                                       else {
-                                               if (prefetchable)
-                                                       dbg("using MEM for PMEM\n");
-                                               mem_node = get_resource(&(resources->mem_head), (ulong)base);
-                                       }
-
-                                       /* allocate the resource to the board */
-                                       if (mem_node) {
-                                               base64 = mem_node->base; 
-                                               mem_node->next = *res_node;
-                                               *res_node = mem_node;
-                                               dbg("Got 64 %s base=0x%x:%x(length=%x)\n", res_type_str, (u32)(base64 >> 32), 
-                                                       (u32)base64, mem_node->length);
-                                       } else {
-                                               err("Got NO 64 %s resource(length=0x%x)\n", res_type_str, base);
-                                               return -ENOMEM;
-                                       }
-                                       break;
-                               default:
-                                       dbg("reserved BAR type=0x%x\n", temp_register);
-                                       break;
-                               }
-
-                       }
-
-                       if (base64) {
-                               rc = pci_bus_write_config_dword(pci_bus, devfn, cloop, (u32)base64);
-                               cloop += 4;
-                               base64 >>= 32;
-
-                               if (base64) {
-                                       dbg("%s: high dword of base64(0x%x) set to 0\n", __FUNCTION__, (u32)base64);
-                                       base64 = 0x0L;
-                               }
-
-                               rc = pci_bus_write_config_dword(pci_bus, devfn, cloop, (u32)base64);
-                       } else {
-                               rc = pci_bus_write_config_dword(pci_bus, devfn, cloop, base);
-                       }
-               }               /* End of base register loop */
-
-               /* disable ROM base Address */
-               rc = pci_bus_write_config_dword (pci_bus, devfn, PCI_ROM_ADDRESS, 0x00);
-
-               /* Set HP parameters (Cache Line Size, Latency Timer) */
-               rc = pciehprm_set_hpp(ctrl, func, PCI_HEADER_TYPE_NORMAL);
-               if (rc)
-                       return rc;
-
-               pciehprm_enable_card(ctrl, func, PCI_HEADER_TYPE_NORMAL);
-
-               dbg("PCI function Hot-Added s:b:d:f(%02x:%02x:%02x:%02x)\n", ctrl->seg, func->bus, func->device, 
-                       func->function);
-       }  /* End of Not-A-Bridge else */
-       else {
-               /* It's some strange type of PCI adapter (Cardbus?) */
-               return DEVICE_TYPE_NOT_SUPPORTED;
-       }
-
-       func->configured = 1;
-
-       return 0;
-}
index 7a0e27f0e063d40eebb4c02a3bd67b2177fb59d4..2387e75da0feee0ab93e4491fc3b1ee0ad0d0f62 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/interrupt.h>
-#include <linux/spinlock.h>
 #include <linux/pci.h>
-#include <asm/system.h>
+#include <linux/interrupt.h>
+
 #include "../pci.h"
 #include "pciehp.h"
 
@@ -217,23 +213,6 @@ static int pcie_cap_base = 0;              /* Base of the PCI Express capability item struct
 #define MRL_STATE              0x0020
 #define PRSN_STATE             0x0040
 
-struct php_ctlr_state_s {
-       struct php_ctlr_state_s *pnext;
-       struct pci_dev *pci_dev;
-       unsigned int irq;
-       unsigned long flags;                            /* spinlock's */
-       u32 slot_device_offset;
-       u32 num_slots;
-       struct timer_list       int_poll_timer;         /* Added for poll event */
-       php_intr_callback_t     attention_button_callback;
-       php_intr_callback_t     switch_change_callback;
-       php_intr_callback_t     presence_change_callback;
-       php_intr_callback_t     power_fault_callback;
-       void                    *callback_instance_id;
-       struct ctrl_reg         *creg;                          /* Ptr to controller register space */
-};
-
-
 static spinlock_t hpc_event_lock;
 
 DEFINE_DBG_BUFFER              /* Debug string buffer for entire HPC defined here */
@@ -297,7 +276,6 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd)
 
        DBG_ENTER_ROUTINE 
        
-       dbg("%s : Enter\n", __FUNCTION__);
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
                return -1;
@@ -308,7 +286,6 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd)
                        err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                        return retval;
                }
-       dbg("%s : hp_register_read_word SLOT_STATUS %x\n", __FUNCTION__, slot_status);
        
        if ((slot_status & CMD_COMPLETED) == CMD_COMPLETED ) { 
                /* After 1 sec and CMD_COMPLETED still not set, just proceed forward to issue 
@@ -316,14 +293,11 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd)
                dbg("%s : CMD_COMPLETED not clear after 1 sec.\n", __FUNCTION__);
        }
 
-       dbg("%s: Before hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd);
        retval = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), cmd | CMD_CMPL_INTR_ENABLE);
        if (retval) {
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s : hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd | CMD_CMPL_INTR_ENABLE);
-       dbg("%s : Exit\n", __FUNCTION__);
 
        DBG_LEAVE_ROUTINE 
        return retval;
@@ -509,7 +483,6 @@ static int hpc_query_power_fault(struct slot * slot)
        u16 slot_status;
        u8 pwr_fault;
        int retval = 0;
-       u8 status;
 
        DBG_ENTER_ROUTINE 
 
@@ -521,15 +494,13 @@ static int hpc_query_power_fault(struct slot * slot)
        retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(slot->ctrl->cap_base), slot_status);
 
        if (retval) {
-               err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
+               err("%s : Cannot check for power fault\n", __FUNCTION__);
                return retval;
        }
        pwr_fault = (u8)((slot_status & PWR_FAULT_DETECTED) >> 1);
-       status = (pwr_fault != 1) ? 1 : 0;
        
        DBG_LEAVE_ROUTINE
-       /* Note: Logic 0 => fault */
-       return status;
+       return pwr_fault;
 }
 
 static int hpc_set_attention_status(struct slot *slot, u8 value)
@@ -539,7 +510,8 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
        u16 slot_ctrl;
        int rc = 0;
 
-       dbg("%s: \n", __FUNCTION__);
+       DBG_ENTER_ROUTINE
+
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
                return -1;
@@ -555,7 +527,6 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return rc;
        }
-       dbg("%s : hp_register_read_word SLOT_CTRL %x\n", __FUNCTION__, slot_ctrl);
 
        switch (value) {
                case 0 :        /* turn off */
@@ -576,6 +547,7 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
        pcie_write_cmd(slot, slot_cmd);
        dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
        
+       DBG_LEAVE_ROUTINE
        return rc;
 }
 
@@ -587,7 +559,8 @@ static void hpc_set_green_led_on(struct slot *slot)
        u16 slot_ctrl;
        int rc = 0;
                
-       dbg("%s: \n", __FUNCTION__);    
+       DBG_ENTER_ROUTINE
+
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
                return ;
@@ -604,7 +577,6 @@ static void hpc_set_green_led_on(struct slot *slot)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return;
        }
-       dbg("%s : hp_register_read_word SLOT_CTRL %x\n", __FUNCTION__, slot_ctrl);
        slot_cmd = (slot_ctrl & ~PWR_LED_CTRL) | 0x0100;
        if (!pciehp_poll_mode)
                slot_cmd = slot_cmd | HP_INTR_ENABLE; 
@@ -612,6 +584,7 @@ static void hpc_set_green_led_on(struct slot *slot)
        pcie_write_cmd(slot, slot_cmd);
 
        dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
+       DBG_LEAVE_ROUTINE
        return;
 }
 
@@ -622,7 +595,8 @@ static void hpc_set_green_led_off(struct slot *slot)
        u16 slot_ctrl;
        int rc = 0;
 
-       dbg("%s: \n", __FUNCTION__);    
+       DBG_ENTER_ROUTINE
+
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
                return ;
@@ -639,7 +613,6 @@ static void hpc_set_green_led_off(struct slot *slot)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return;
        }
-       dbg("%s : hp_register_read_word SLOT_CTRL %x\n", __FUNCTION__, slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_LED_CTRL) | 0x0300;
 
@@ -648,6 +621,7 @@ static void hpc_set_green_led_off(struct slot *slot)
        pcie_write_cmd(slot, slot_cmd);
        dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
 
+       DBG_LEAVE_ROUTINE
        return;
 }
 
@@ -658,7 +632,8 @@ static void hpc_set_green_led_blink(struct slot *slot)
        u16 slot_ctrl;
        int rc = 0; 
        
-       dbg("%s: \n", __FUNCTION__);    
+       DBG_ENTER_ROUTINE
+
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
                return ;
@@ -675,7 +650,6 @@ static void hpc_set_green_led_blink(struct slot *slot)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return;
        }
-       dbg("%s : hp_register_read_word SLOT_CTRL %x\n", __FUNCTION__, slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_LED_CTRL) | 0x0200;
 
@@ -684,6 +658,7 @@ static void hpc_set_green_led_blink(struct slot *slot)
        pcie_write_cmd(slot, slot_cmd);
 
        dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base), slot_cmd);
+       DBG_LEAVE_ROUTINE
        return;
 }
 
@@ -780,7 +755,6 @@ static int hpc_power_on_slot(struct slot * slot)
        int retval = 0;
 
        DBG_ENTER_ROUTINE 
-       dbg("%s: \n", __FUNCTION__);    
 
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
@@ -799,8 +773,6 @@ static int hpc_power_on_slot(struct slot * slot)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s: SLOT_CTRL %x, value read %xn", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base),
-               slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_CTRL) | POWER_ON;
 
@@ -829,7 +801,6 @@ static int hpc_power_off_slot(struct slot * slot)
        int retval = 0;
 
        DBG_ENTER_ROUTINE 
-       dbg("%s: \n", __FUNCTION__);    
 
        if (!php_ctlr) {
                err("%s: Invalid HPC controller handle!\n", __FUNCTION__);
@@ -848,8 +819,6 @@ static int hpc_power_off_slot(struct slot * slot)
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                return retval;
        }
-       dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__, SLOT_CTRL(slot->ctrl->cap_base),
-               slot_ctrl);
 
        slot_cmd = (slot_ctrl & ~PWR_CTRL) | POWER_OFF;
 
@@ -924,7 +893,6 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                        return IRQ_NONE;
                }
 
-               dbg("%s: Set Mask Hot-plug Interrupt Enable\n", __FUNCTION__);
                dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) | 0x00;
 
@@ -933,7 +901,6 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                        err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
-               dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                
                rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
                if (rc) {
@@ -949,14 +916,12 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                        err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
-               dbg("%s: hp_register_write_word SLOT_STATUS with value %x\n", __FUNCTION__, temp_word);
        }
        
        if (intr_loc & CMD_COMPLETED) {
                /* 
                 * Command Complete Interrupt Pending 
                 */
-               dbg("%s: In Command Complete Interrupt Pending\n", __FUNCTION__);
                wake_up_interruptible(&ctrl->queue);
        }
 
@@ -989,7 +954,6 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                }
 
                dbg("%s: Unmask Hot-plug Interrupt Enable\n", __FUNCTION__);
-               dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
                temp_word = (temp_word & ~HP_INTR_ENABLE) | HP_INTR_ENABLE;
 
                rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL(ctrl->cap_base), temp_word);
@@ -997,14 +961,12 @@ static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                        err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
-               dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);   
        
                rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
                if (rc) {
                        err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                        return IRQ_NONE;
                }
-               dbg("%s: hp_register_read_word SLOT_STATUS with value %x\n", __FUNCTION__, slot_status); 
                
                /* Clear command complete interrupt caused by this write */
                temp_word = 0x1F;
@@ -1248,12 +1210,7 @@ static struct hpc_ops pciehp_hpc_ops = {
        .check_lnk_status               = hpc_check_lnk_status,
 };
 
-int pcie_init(struct controller * ctrl,
-       struct pcie_device *dev,
-       php_intr_callback_t attention_button_callback,
-       php_intr_callback_t switch_change_callback,
-       php_intr_callback_t presence_change_callback,
-       php_intr_callback_t power_fault_callback)
+int pcie_init(struct controller * ctrl, struct pcie_device *dev)
 {
        struct php_ctlr_state_s *php_ctlr, *p;
        void *instance_id = ctrl;
@@ -1282,8 +1239,8 @@ int pcie_init(struct controller * ctrl,
        pdev = dev->port;
        php_ctlr->pci_dev = pdev;       /* save pci_dev in context */
 
-       dbg("%s: pdev->vendor %x pdev->device %x\n", __FUNCTION__,
-               pdev->vendor, pdev->device);
+       dbg("%s: hotplug controller vendor id 0x%x device id 0x%x\n",
+                       __FUNCTION__, pdev->vendor, pdev->device);
 
        saved_cap_base = pcie_cap_base;
 
@@ -1340,8 +1297,6 @@ int pcie_init(struct controller * ctrl,
                first = 0;
        }
 
-       dbg("pdev = %p: b:d:f:irq=0x%x:%x:%x:%x\n", pdev, pdev->bus->number, 
-               PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), dev->irq);
        for ( rc = 0; rc < DEVICE_COUNT_RESOURCE; rc++)
                if (pci_resource_len(pdev, rc) > 0)
                        dbg("pci resource[%d] start=0x%lx(len=0x%lx)\n", rc,
@@ -1359,13 +1314,12 @@ int pcie_init(struct controller * ctrl,
 
        /* find the IRQ */
        php_ctlr->irq = dev->irq;
-       dbg("HPC interrupt = %d\n", php_ctlr->irq);
 
        /* Save interrupt callback info */
-       php_ctlr->attention_button_callback = attention_button_callback;
-       php_ctlr->switch_change_callback = switch_change_callback;
-       php_ctlr->presence_change_callback = presence_change_callback;
-       php_ctlr->power_fault_callback = power_fault_callback;
+       php_ctlr->attention_button_callback = pciehp_handle_attention_button;
+       php_ctlr->switch_change_callback = pciehp_handle_switch_change;
+       php_ctlr->presence_change_callback = pciehp_handle_presence_change;
+       php_ctlr->power_fault_callback = pciehp_handle_power_fault;
        php_ctlr->callback_instance_id = instance_id;
 
        /* return PCI Controller Info */
@@ -1387,15 +1341,12 @@ int pcie_init(struct controller * ctrl,
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s : Mask HPIE hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, temp_word);
 
        rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: Mask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base)
-               , slot_status);
 
        temp_word = 0x1F; /* Clear all events */
        rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
@@ -1403,7 +1354,6 @@ int pcie_init(struct controller * ctrl,
                err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base), temp_word);
 
        if (pciehp_poll_mode)  {/* Install interrupt polling code */
                /* Install and start the interrupt polling timer */
@@ -1419,13 +1369,14 @@ int pcie_init(struct controller * ctrl,
                }
        }
 
+       dbg("pciehp ctrl b:d:f:irq=0x%x:%x:%x:%x\n", pdev->bus->number,
+               PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), dev->irq);
+
        rc = hp_register_read_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
        if (rc) {
                err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL(ctrl->cap_base), temp_word);
-       dbg("%s: slot_cap %x\n", __FUNCTION__, slot_cap);
 
        intr_enable = intr_enable | PRSN_DETECT_ENABLE;
 
@@ -1445,7 +1396,6 @@ int pcie_init(struct controller * ctrl,
        } else {
                temp_word = (temp_word & ~HP_INTR_ENABLE) | HP_INTR_ENABLE;
        }
-       dbg("%s: temp_word %x\n", __FUNCTION__, temp_word);
 
        /* Unmask Hot-plug Interrupt Enable for the interrupt notification mechanism case */
        rc = hp_register_write_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word);
@@ -1453,14 +1403,11 @@ int pcie_init(struct controller * ctrl,
                err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s : Unmask HPIE hp_register_write_word SLOT_CTRL with %x\n", __FUNCTION__, temp_word);
        rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status);
        if (rc) {
                err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: Unmask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, 
-               SLOT_STATUS(ctrl->cap_base), slot_status);
        
        temp_word =  0x1F; /* Clear all events */
        rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word);
@@ -1468,8 +1415,16 @@ int pcie_init(struct controller * ctrl,
                err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
                goto abort_free_ctlr;
        }
-       dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS(ctrl->cap_base), temp_word);
        
+       if (pciehp_force) {
+               dbg("Bypassing BIOS check for pciehp use on %s\n",
+                               pci_name(ctrl->pci_dev));
+       } else {
+               rc = pciehp_get_hp_hw_control_from_firmware(ctrl->pci_dev);
+               if (rc)
+                       goto abort_free_ctlr;
+       }
+
        /*  Add this HPC instance into the HPC list */
        spin_lock(&list_lock);
        if (php_ctlr_list_head == 0) {
index ff17d8e07e94d09df1d197a8d64b18d7ac679c54..647673a7d22481b6d443dd56a4548a69a4a6cf0d 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <linux/proc_fs.h>
 #include <linux/pci.h>
 #include "../pci.h"
 #include "pciehp.h"
-#ifndef CONFIG_IA64
-#include "../../../arch/i386/pci/pci.h"    /* horrible hack showing how processor dependant we are... */
-#endif
 
 
-int pciehp_configure_device (struct controller* ctrl, struct pci_func* func)  
+int pciehp_configure_device(struct slot *p_slot)
 {
-       unsigned char bus;
-       struct pci_bus *child;
-       int num;
-
-       if (func->pci_dev == NULL)
-               func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));
-
-       /* Still NULL ? Well then scan for it ! */
-       if (func->pci_dev == NULL) {
-               dbg("%s: pci_dev still null. do pci_scan_slot\n", __FUNCTION__);
-
-               num = pci_scan_slot(ctrl->pci_dev->subordinate, PCI_DEVFN(func->device, func->function));
-
-               if (num)
-                       pci_bus_add_devices(ctrl->pci_dev->subordinate);
-               
-               func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));
-               if (func->pci_dev == NULL) {
-                       dbg("ERROR: pci_dev still null\n");
-                       return 0;
-               }
+       struct pci_dev *dev;
+       struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate;
+       int num, fn;
+
+       dev = pci_find_slot(p_slot->bus, PCI_DEVFN(p_slot->device, 0));
+       if (dev) {
+               err("Device %s already exists at %x:%x, cannot hot-add\n",
+                               pci_name(dev), p_slot->bus, p_slot->device);
+               return -EINVAL;
        }
 
-       if (func->pci_dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
-               pci_read_config_byte(func->pci_dev, PCI_SECONDARY_BUS, &bus);
-               child = pci_add_new_bus(func->pci_dev->bus, (func->pci_dev), bus);
-               pci_do_scan_bus(child);
+       num = pci_scan_slot(parent, PCI_DEVFN(p_slot->device, 0));
+       if (num == 0) {
+               err("No new device found\n");
+               return -ENODEV;
+       }
 
+       for (fn = 0; fn < 8; fn++) {
+               if (!(dev = pci_find_slot(p_slot->bus,
+                                       PCI_DEVFN(p_slot->device, fn))))
+                       continue;
+               if ((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) {
+                       err("Cannot hot-add display device %s\n",
+                                       pci_name(dev));
+                       continue;
+               }
+               if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) ||
+                               (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) {
+                       /* Find an unused bus number for the new bridge */
+                       struct pci_bus *child;
+                       unsigned char busnr, start = parent->secondary;
+                       unsigned char end = parent->subordinate;
+                       for (busnr = start; busnr <= end; busnr++) {
+                               if (!pci_find_bus(pci_domain_nr(parent),
+                                                       busnr))
+                                       break;
+                       }
+                       if (busnr >= end) {
+                               err("No free bus for hot-added bridge\n");
+                               continue;
+                       }
+                       child = pci_add_new_bus(parent, dev, busnr);
+                       if (!child) {
+                               err("Cannot add new bus for %s\n",
+                                               pci_name(dev));
+                               continue;
+                       }
+                       child->subordinate = pci_do_scan_bus(child);
+                       pci_bus_size_bridges(child);
+               }
+               /* TBD: program firmware provided _HPP values */
+               /* program_fw_provided_values(dev); */
        }
 
+       pci_bus_assign_resources(parent);
+       pci_bus_add_devices(parent);
+       pci_enable_bridges(parent);
        return 0;
 }
 
-
-int pciehp_unconfigure_device(struct pci_func* func) 
+int pciehp_unconfigure_device(struct slot *p_slot)
 {
        int rc = 0;
        int j;
-       struct pci_bus *pbus;
+       u8 bctl = 0;
 
-       dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus,
-                               func->device, func->function);
-       pbus = func->pci_dev->bus;
+       dbg("%s: bus/dev = %x/%x\n", __FUNCTION__, p_slot->bus,
+                               p_slot->device);
 
        for (j=0; j<8 ; j++) {
-               struct pci_dev* temp = pci_find_slot(func->bus,
-                               (func->device << 3) | j);
-               if (temp) {
-                       pci_remove_bus_device(temp);
+               struct pci_dev* temp = pci_find_slot(p_slot->bus,
+                               (p_slot->device << 3) | j);
+               if (!temp)
+                       continue;
+               if ((temp->class >> 16) == PCI_BASE_CLASS_DISPLAY) {
+                       err("Cannot remove display device %s\n",
+                                       pci_name(temp));
+                       continue;
                }
+               if (temp->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
+                       pci_read_config_byte(temp, PCI_BRIDGE_CONTROL, &bctl);
+                       if (bctl & PCI_BRIDGE_CTL_VGA) {
+                               err("Cannot remove display device %s\n",
+                                               pci_name(temp));
+                               continue;
+                       }
+               }
+               pci_remove_bus_device(temp);
        }
        /* 
         * Some PCI Express root ports require fixup after hot-plug operation.
         */
        if (pcie_mch_quirk) 
-               pci_fixup_device(pci_fixup_final, pbus->self);
+               pci_fixup_device(pci_fixup_final, p_slot->ctrl->pci_dev);
        
        return rc;
 }
 
-/*
- * pciehp_set_irq
- *
- * @bus_num: bus number of PCI device
- * @dev_num: device number of PCI device
- * @slot: pointer to u8 where slot number will be returned
- */
-int pciehp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
-{
-#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_IO_APIC)
-       int rc;
-       u16 temp_word;
-       struct pci_dev fakedev;
-       struct pci_bus fakebus;
-
-       fakedev.devfn = dev_num << 3;
-       fakedev.bus = &fakebus;
-       fakebus.number = bus_num;
-       dbg("%s: dev %d, bus %d, pin %d, num %d\n",
-           __FUNCTION__, dev_num, bus_num, int_pin, irq_num);
-       rc = pcibios_set_irq_routing(&fakedev, int_pin - 0x0a, irq_num);
-       dbg("%s: rc %d\n", __FUNCTION__, rc);
-       if (!rc)
-               return !rc;
-
-       /* set the Edge Level Control Register (ELCR) */
-       temp_word = inb(0x4d0);
-       temp_word |= inb(0x4d1) << 8;
-
-       temp_word |= 0x01 << irq_num;
-
-       /* This should only be for x86 as it sets the Edge Level Control Register */
-       outb((u8) (temp_word & 0xFF), 0x4d0);
-       outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1);
-#endif
-       return 0;
-}
-
-/* More PCI configuration routines; this time centered around hotplug controller */
-
-
-/*
- * pciehp_save_config
- *
- * Reads configuration for all slots in a PCI bus and saves info.
- *
- * Note:  For non-hot plug busses, the slot # saved is the device #
- *
- * returns 0 if success
- */
-int pciehp_save_config(struct controller *ctrl, int busnumber, int num_ctlr_slots, int first_device_num)
-{
-       int rc;
-       u8 class_code;
-       u8 header_type;
-       u32 ID;
-       u8 secondary_bus;
-       struct pci_func *new_slot;
-       int sub_bus;
-       int max_functions;
-       int function;
-       u8 DevError;
-       int device = 0;
-       int cloop = 0;
-       int stop_it;
-       int index;
-       int is_hot_plug = num_ctlr_slots || first_device_num;
-       struct pci_bus lpci_bus, *pci_bus;
-       int FirstSupported, LastSupported;
-
-       dbg("%s: Enter\n", __FUNCTION__);
-
-       memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-
-       dbg("%s: num_ctlr_slots = %d, first_device_num = %d\n", __FUNCTION__,
-                               num_ctlr_slots, first_device_num);
-
-       /*   Decide which slots are supported */
-       if (is_hot_plug) {
-               /*********************************
-                *  is_hot_plug is the slot mask
-                *********************************/
-               FirstSupported = first_device_num;
-               LastSupported = FirstSupported + num_ctlr_slots - 1;
-       } else {
-               FirstSupported = 0;
-               LastSupported = 0x1F;
-       }
-
-       dbg("FirstSupported = %d, LastSupported = %d\n", FirstSupported,
-                                       LastSupported);
-
-       /*   Save PCI configuration space for all devices in supported slots */
-       dbg("%s: pci_bus->number = %x\n", __FUNCTION__, pci_bus->number);
-       pci_bus->number = busnumber;
-       dbg("%s: bus = %x, dev = %x\n", __FUNCTION__, busnumber, device);
-       for (device = FirstSupported; device <= LastSupported; device++) {
-               ID = 0xFFFFFFFF;
-               rc = pci_bus_read_config_dword(pci_bus, PCI_DEVFN(device, 0),
-                                       PCI_VENDOR_ID, &ID);
-
-               if (ID != 0xFFFFFFFF) {   /*  device in slot */
-                       dbg("%s: ID = %x\n", __FUNCTION__, ID);
-                       rc = pci_bus_read_config_byte(pci_bus, PCI_DEVFN(device, 0),
-                                       0x0B, &class_code);
-                       if (rc)
-                               return rc;
-
-                       rc = pci_bus_read_config_byte(pci_bus, PCI_DEVFN(device, 0),
-                                       PCI_HEADER_TYPE, &header_type);
-                       if (rc)
-                               return rc;
-
-                       dbg("class_code = %x, header_type = %x\n", class_code, header_type);
-
-                       /* If multi-function device, set max_functions to 8 */
-                       if (header_type & 0x80)
-                               max_functions = 8;
-                       else
-                               max_functions = 1;
-
-                       function = 0;
-
-                       do {
-                               DevError = 0;
-                               dbg("%s: In do loop\n", __FUNCTION__);
-
-                               if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {   /* P-P Bridge */
-                                       /* Recurse the subordinate bus
-                                        * get the subordinate bus number
-                                        */
-                                       rc = pci_bus_read_config_byte(pci_bus,
-                                               PCI_DEVFN(device, function), 
-                                               PCI_SECONDARY_BUS, &secondary_bus);
-                                       if (rc) {
-                                               return rc;
-                                       } else {
-                                               sub_bus = (int) secondary_bus;
-
-                                               /* Save secondary bus cfg spc with this recursive call. */
-                                               rc = pciehp_save_config(ctrl, sub_bus, 0, 0);
-                                               if (rc)
-                                                       return rc;
-                                       }
-                               }
-
-                               index = 0;
-                               new_slot = pciehp_slot_find(busnumber, device, index++);
-
-                               dbg("%s: new_slot = %p bus %x dev %x fun %x\n",
-                               __FUNCTION__, new_slot, busnumber, device, index-1);
-
-                               while (new_slot && (new_slot->function != (u8) function)) {
-                                       new_slot = pciehp_slot_find(busnumber, device, index++);
-                                       dbg("%s: while loop, new_slot = %p bus %x dev %x fun %x\n",
-                                       __FUNCTION__, new_slot, busnumber, device, index-1);
-                               }
-                               if (!new_slot) {
-                                       /* Setup slot structure. */
-                                       new_slot = pciehp_slot_create(busnumber);
-                                       dbg("%s: if, new_slot = %p bus %x dev %x fun %x\n",
-                                       __FUNCTION__, new_slot, busnumber, device, function);
-
-                                       if (new_slot == NULL)
-                                               return(1);
-                               }
-
-                               new_slot->bus = (u8) busnumber;
-                               new_slot->device = (u8) device;
-                               new_slot->function = (u8) function;
-                               new_slot->is_a_board = 1;
-                               new_slot->switch_save = 0x10;
-                               /* In case of unsupported board */
-                               new_slot->status = DevError;
-                               new_slot->pci_dev = pci_find_slot(new_slot->bus,
-                                       (new_slot->device << 3) | new_slot->function);
-                               dbg("new_slot->pci_dev = %p\n", new_slot->pci_dev);
-
-                               for (cloop = 0; cloop < 0x20; cloop++) {
-                                       rc = pci_bus_read_config_dword(pci_bus,
-                                               PCI_DEVFN(device, function),
-                                               cloop << 2, 
-                                               (u32 *) &(new_slot->config_space [cloop]));
-                                       /* dbg("new_slot->config_space[%x] = %x\n",
-                                               cloop, new_slot->config_space[cloop]); */
-                                       if (rc)
-                                               return rc;
-                               }
-
-                               function++;
-
-                               stop_it = 0;
-
-                               /*  this loop skips to the next present function
-                                *  reading in Class Code and Header type.
-                                */
-
-                               while ((function < max_functions)&&(!stop_it)) {
-                                       dbg("%s: In while loop \n", __FUNCTION__);
-                                       rc = pci_bus_read_config_dword(pci_bus,
-                                                       PCI_DEVFN(device, function),
-                                                       PCI_VENDOR_ID, &ID);
-
-                                       if (ID == 0xFFFFFFFF) {  /* nothing there. */
-                                               function++;
-                                               dbg("Nothing there\n");
-                                       } else {  /* Something there */
-                                               rc = pci_bus_read_config_byte(pci_bus,
-                                                       PCI_DEVFN(device, function),
-                                                       0x0B, &class_code);
-                                               if (rc)
-                                                       return rc;
-
-                                               rc = pci_bus_read_config_byte(pci_bus,
-                                                       PCI_DEVFN(device, function),
-                                                       PCI_HEADER_TYPE, &header_type);
-                                               if (rc)
-                                                       return rc;
-
-                                               dbg("class_code = %x, header_type = %x\n", class_code, header_type);
-                                               stop_it++;
-                                       }
-                               }
-
-                       } while (function < max_functions);
-                       /* End of IF (device in slot?) */
-               } else if (is_hot_plug) {
-                       /* Setup slot structure with entry for empty slot */
-                       new_slot = pciehp_slot_create(busnumber);
-
-                       if (new_slot == NULL) {
-                               return(1);
-                       }
-                       dbg("new_slot = %p, bus = %x, dev = %x, fun = %x\n", new_slot,
-                               new_slot->bus, new_slot->device, new_slot->function);
-
-                       new_slot->bus = (u8) busnumber;
-                       new_slot->device = (u8) device;
-                       new_slot->function = 0;
-                       new_slot->is_a_board = 0;
-                       new_slot->presence_save = 0;
-                       new_slot->switch_save = 0;
-               }
-       }                       /* End of FOR loop */
-
-       dbg("%s: Exit\n", __FUNCTION__);
-       return(0);
-}
-
-
-/*
- * pciehp_save_slot_config
- *
- * Saves configuration info for all PCI devices in a given slot
- * including subordinate busses.
- *
- * returns 0 if success
- */
-int pciehp_save_slot_config(struct controller *ctrl, struct pci_func * new_slot)
-{
-       int rc;
-       u8 class_code;
-       u8 header_type;
-       u32 ID;
-       u8 secondary_bus;
-       int sub_bus;
-       int max_functions;
-       int function;
-       int cloop = 0;
-       int stop_it;
-       struct pci_bus lpci_bus, *pci_bus;
-       memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = new_slot->bus;
-
-       ID = 0xFFFFFFFF;
-
-       pci_bus_read_config_dword(pci_bus, PCI_DEVFN(new_slot->device, 0),
-                                       PCI_VENDOR_ID, &ID);
-
-       if (ID != 0xFFFFFFFF) {   /*  device in slot */
-               pci_bus_read_config_byte(pci_bus, PCI_DEVFN(new_slot->device, 0),
-                                       0x0B, &class_code);
-
-               pci_bus_read_config_byte(pci_bus, PCI_DEVFN(new_slot->device, 0),
-                                       PCI_HEADER_TYPE, &header_type);
-
-               if (header_type & 0x80) /* Multi-function device */
-                       max_functions = 8;
-               else
-                       max_functions = 1;
-
-               function = 0;
-
-               do {
-                       if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {     /* PCI-PCI Bridge */
-                               /*  Recurse the subordinate bus */
-                               pci_bus_read_config_byte(pci_bus,
-                                       PCI_DEVFN(new_slot->device, function), 
-                                       PCI_SECONDARY_BUS, &secondary_bus);
-
-                               sub_bus = (int) secondary_bus;
-
-                               /* Save the config headers for the secondary bus. */
-                               rc = pciehp_save_config(ctrl, sub_bus, 0, 0);
-
-                               if (rc)
-                                       return rc;
-
-                       }       /* End of IF */
-
-                       new_slot->status = 0;
-
-                       for (cloop = 0; cloop < 0x20; cloop++) {
-                               pci_bus_read_config_dword(pci_bus,
-                                       PCI_DEVFN(new_slot->device, function), 
-                                       cloop << 2,
-                                       (u32 *) &(new_slot->config_space [cloop]));
-                       }
-
-                       function++;
-
-                       stop_it = 0;
-
-                       /*  this loop skips to the next present function
-                        *  reading in the Class Code and the Header type.
-                        */
-
-                       while ((function < max_functions) && (!stop_it)) {
-                               pci_bus_read_config_dword(pci_bus,
-                                       PCI_DEVFN(new_slot->device, function),
-                                       PCI_VENDOR_ID, &ID);
-
-                               if (ID == 0xFFFFFFFF) {  /* nothing there. */
-                                       function++;
-                               } else {  /* Something there */
-                                       pci_bus_read_config_byte(pci_bus,
-                                               PCI_DEVFN(new_slot->device, function),
-                                               0x0B, &class_code);
-
-                                       pci_bus_read_config_byte(pci_bus,
-                                               PCI_DEVFN(new_slot->device, function),
-                                               PCI_HEADER_TYPE, &header_type);
-
-                                       stop_it++;
-                               }
-                       }
-
-               } while (function < max_functions);
-       }                       /* End of IF (device in slot?) */
-       else {
-               return 2;
-       }
-
-       return 0;
-}
-
-
-/*
- * pciehp_save_used_resources
- *
- * Stores used resource information for existing boards.  this is
- * for boards that were in the system when this driver was loaded.
- * this function is for hot plug ADD
- *
- * returns 0 if success
- * if disable  == 1(DISABLE_CARD),
- *  it loops for all functions of the slot and disables them.
- * else, it just get resources of the function and return.
- */
-int pciehp_save_used_resources(struct controller *ctrl, struct pci_func *func, int disable)
-{
-       u8 cloop;
-       u8 header_type;
-       u8 secondary_bus;
-       u8 temp_byte;
-       u16 command;
-       u16 save_command;
-       u16 w_base, w_length;
-       u32 temp_register;
-       u32 save_base;
-       u32 base, length;
-       u64 base64 = 0;
-       int index = 0;
-       unsigned int devfn;
-       struct pci_resource *mem_node = NULL;
-       struct pci_resource *p_mem_node = NULL;
-       struct pci_resource *t_mem_node;
-       struct pci_resource *io_node;
-       struct pci_resource *bus_node;
-       struct pci_bus lpci_bus, *pci_bus;
-       memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-
-       if (disable)
-               func = pciehp_slot_find(func->bus, func->device, index++);
-
-       while ((func != NULL) && func->is_a_board) {
-               pci_bus->number = func->bus;
-               devfn = PCI_DEVFN(func->device, func->function);
-
-               /* Save the command register */
-               pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &save_command);
-
-               if (disable) {
-                       /* disable card */
-                       command = 0x00;
-                       pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command);
-               }
-
-               /* Check for Bridge */
-               pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
-
-               if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {     /* PCI-PCI Bridge */
-                       dbg("Save_used_res of PCI bridge b:d=0x%x:%x, sc=0x%x\n",
-                                       func->bus, func->device, save_command);
-                       if (disable) {
-                               /* Clear Bridge Control Register */
-                               command = 0x00;
-                               pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, command);
-                       }
-
-                       pci_bus_read_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
-                       pci_bus_read_config_byte(pci_bus, devfn, PCI_SUBORDINATE_BUS, &temp_byte);
-
-                       bus_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-                       if (!bus_node)
-                               return -ENOMEM;
-
-                       bus_node->base = (ulong)secondary_bus;
-                       bus_node->length = (ulong)(temp_byte - secondary_bus + 1);
-
-                       bus_node->next = func->bus_head;
-                       func->bus_head = bus_node;
-
-                       /* Save IO base and Limit registers */
-                       pci_bus_read_config_byte(pci_bus, devfn, PCI_IO_BASE, &temp_byte);
-                       base = temp_byte;
-                       pci_bus_read_config_byte(pci_bus, devfn, PCI_IO_LIMIT, &temp_byte);
-                       length = temp_byte;
-
-                       if ((base <= length) && (!disable || (save_command & PCI_COMMAND_IO))) {
-                               io_node = kmalloc(sizeof(struct pci_resource),
-                                                       GFP_KERNEL);
-                               if (!io_node)
-                                       return -ENOMEM;
-
-                               io_node->base = (ulong)(base & PCI_IO_RANGE_MASK) << 8;
-                               io_node->length = (ulong)(length - base + 0x10) << 8;
-
-                               io_node->next = func->io_head;
-                               func->io_head = io_node;
-                       }
-
-                       /* Save memory base and Limit registers */
-                       pci_bus_read_config_word(pci_bus, devfn, PCI_MEMORY_BASE, &w_base);
-                       pci_bus_read_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, &w_length);
-
-                       if ((w_base <= w_length) && (!disable || (save_command & PCI_COMMAND_MEMORY))) {
-                               mem_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-                               if (!mem_node)
-                                       return -ENOMEM;
-
-                               mem_node->base = (ulong)w_base << 16;
-                               mem_node->length = (ulong)(w_length - w_base + 0x10) << 16;
-
-                               mem_node->next = func->mem_head;
-                               func->mem_head = mem_node;
-                       }
-                       /* Save prefetchable memory base and Limit registers */
-                       pci_bus_read_config_word(pci_bus, devfn, PCI_PREF_MEMORY_BASE, &w_base);
-                       pci_bus_read_config_word(pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, &w_length);
-
-                       if ((w_base <= w_length) && (!disable || (save_command & PCI_COMMAND_MEMORY))) {
-                               p_mem_node = kmalloc(sizeof(struct pci_resource),
-                                               GFP_KERNEL);
-                               if (!p_mem_node)
-                                       return -ENOMEM;
-
-                               p_mem_node->base = (ulong)w_base << 16;
-                               p_mem_node->length = (ulong)(w_length - w_base + 0x10) << 16;
-
-                               p_mem_node->next = func->p_mem_head;
-                               func->p_mem_head = p_mem_node;
-                       }
-               } else if ((header_type & 0x7F) == PCI_HEADER_TYPE_NORMAL) {
-                       dbg("Save_used_res of PCI adapter b:d=0x%x:%x, sc=0x%x\n",
-                                       func->bus, func->device, save_command);
-
-                       /* Figure out IO and memory base lengths */
-                       for (cloop = PCI_BASE_ADDRESS_0; cloop <= PCI_BASE_ADDRESS_5; cloop += 4) {
-                               pci_bus_read_config_dword(pci_bus, devfn, cloop, &save_base);
-
-                               temp_register = 0xFFFFFFFF;
-                               pci_bus_write_config_dword(pci_bus, devfn, cloop, temp_register);
-                               pci_bus_read_config_dword(pci_bus, devfn, cloop, &temp_register);
-
-                               if (!disable)
-                                       pci_bus_write_config_dword(pci_bus, devfn, cloop, save_base);
-
-                               if (!temp_register)
-                                       continue;
-
-                               base = temp_register;
-
-                               if ((base & PCI_BASE_ADDRESS_SPACE_IO) &&
-                                               (!disable || (save_command & PCI_COMMAND_IO))) {
-                                       /* IO base */
-                                       /* set temp_register = amount of IO space requested */
-                                       base = base & 0xFFFFFFFCL;
-                                       base = (~base) + 1;
-
-                                       io_node = kmalloc(sizeof (struct pci_resource),
-                                                               GFP_KERNEL);
-                                       if (!io_node)
-                                               return -ENOMEM;
-
-                                       io_node->base = (ulong)save_base & PCI_BASE_ADDRESS_IO_MASK;
-                                       io_node->length = (ulong)base;
-                                       dbg("sur adapter: IO bar=0x%x(length=0x%x)\n",
-                                               io_node->base, io_node->length);
-
-                                       io_node->next = func->io_head;
-                                       func->io_head = io_node;
-                               } else {  /* map Memory */
-                                       int prefetchable = 1;
-                                       /* struct pci_resources **res_node; */
-                                       char *res_type_str = "PMEM";
-                                       u32 temp_register2;
-
-                                       t_mem_node = kmalloc(sizeof (struct pci_resource),
-                                                               GFP_KERNEL);
-                                       if (!t_mem_node)
-                                               return -ENOMEM;
-
-                                       if (!(base & PCI_BASE_ADDRESS_MEM_PREFETCH) &&
-                                                       (!disable || (save_command & PCI_COMMAND_MEMORY))) {
-                                               prefetchable = 0;
-                                               mem_node = t_mem_node;
-                                               res_type_str++;
-                                       } else
-                                               p_mem_node = t_mem_node;
-
-                                       base = base & 0xFFFFFFF0L;
-                                       base = (~base) + 1;
-
-                                       switch (temp_register & PCI_BASE_ADDRESS_MEM_TYPE_MASK) {
-                                       case PCI_BASE_ADDRESS_MEM_TYPE_32:
-                                               if (prefetchable) {
-                                                       p_mem_node->base = (ulong)save_base & PCI_BASE_ADDRESS_MEM_MASK;
-                                                       p_mem_node->length = (ulong)base;
-                                                       dbg("sur adapter: 32 %s bar=0x%x(length=0x%x)\n",
-                                                               res_type_str, 
-                                                               p_mem_node->base,
-                                                               p_mem_node->length);
-
-                                                       p_mem_node->next = func->p_mem_head;
-                                                       func->p_mem_head = p_mem_node;
-                                               } else {
-                                                       mem_node->base = (ulong)save_base & PCI_BASE_ADDRESS_MEM_MASK;
-                                                       mem_node->length = (ulong)base;
-                                                       dbg("sur adapter: 32 %s bar=0x%x(length=0x%x)\n",
-                                                               res_type_str, 
-                                                               mem_node->base,
-                                                               mem_node->length);
-
-                                                       mem_node->next = func->mem_head;
-                                                       func->mem_head = mem_node;
-                                               }
-                                               break;
-                                       case PCI_BASE_ADDRESS_MEM_TYPE_64:
-                                               pci_bus_read_config_dword(pci_bus, devfn, cloop+4, &temp_register2);
-                                               base64 = temp_register2;
-                                               base64 = (base64 << 32) | save_base;
-
-                                               if (temp_register2) {
-                                                       dbg("sur adapter: 64 %s high dword of base64(0x%x:%x) masked to 0\n", 
-                                                               res_type_str, temp_register2, (u32)base64);
-                                                       base64 &= 0x00000000FFFFFFFFL;
-                                               }
-
-                                               if (prefetchable) {
-                                                       p_mem_node->base = base64 & PCI_BASE_ADDRESS_MEM_MASK;
-                                                       p_mem_node->length = base;
-                                                       dbg("sur adapter: 64 %s base=0x%x(len=0x%x)\n",
-                                                               res_type_str, 
-                                                               p_mem_node->base,
-                                                               p_mem_node->length);
-
-                                                       p_mem_node->next = func->p_mem_head;
-                                                       func->p_mem_head = p_mem_node;
-                                               } else {
-                                                       mem_node->base = base64 & PCI_BASE_ADDRESS_MEM_MASK;
-                                                       mem_node->length = base;
-                                                       dbg("sur adapter: 64 %s base=0x%x(len=0x%x)\n",
-                                                               res_type_str, 
-                                                               mem_node->base,
-                                                               mem_node->length);
-
-                                                       mem_node->next = func->mem_head;
-                                                       func->mem_head = mem_node;
-                                               }
-                                               cloop += 4;
-                                               break;
-                                       default:
-                                               dbg("asur: reserved BAR type=0x%x\n",
-                                                       temp_register);
-                                               break;
-                                       }
-                               } 
-                       }       /* End of base register loop */
-               } else {        /* Some other unknown header type */
-                       dbg("Save_used_res of PCI unknown type b:d=0x%x:%x. skip.\n",
-                                       func->bus, func->device);
-               }
-
-               /* find the next device in this slot */
-               if (!disable)
-                       break;
-               func = pciehp_slot_find(func->bus, func->device, index++);
-       }
-
-       return 0;
-}
-
-
-/**
- * kfree_resource_list: release memory of all list members
- * @res: resource list to free
- */
-static inline void
-return_resource_list(struct pci_resource **func, struct pci_resource **res)
-{
-       struct pci_resource *node;
-       struct pci_resource *t_node;
-
-       node = *func;
-       *func = NULL;
-       while (node) {
-               t_node = node->next;
-               return_resource(res, node);
-               node = t_node;
-       }
-}
-
-/*
- * pciehp_return_board_resources
- *
- * this routine returns all resources allocated to a board to
- * the available pool.
- *
- * returns 0 if success
- */
-int pciehp_return_board_resources(struct pci_func * func,
-                               struct resource_lists * resources)
-{
-       int rc;
-
-       dbg("%s\n", __FUNCTION__);
-
-       if (!func)
-               return 1;
-
-       return_resource_list(&(func->io_head),&(resources->io_head));
-       return_resource_list(&(func->mem_head),&(resources->mem_head));
-       return_resource_list(&(func->p_mem_head),&(resources->p_mem_head));
-       return_resource_list(&(func->bus_head),&(resources->bus_head));
-
-       rc = pciehp_resource_sort_and_combine(&(resources->mem_head));
-       rc |= pciehp_resource_sort_and_combine(&(resources->p_mem_head));
-       rc |= pciehp_resource_sort_and_combine(&(resources->io_head));
-       rc |= pciehp_resource_sort_and_combine(&(resources->bus_head));
-
-       return rc;
-}
-
-/**
- * kfree_resource_list: release memory of all list members
- * @res: resource list to free
- */
-static inline void
-kfree_resource_list(struct pci_resource **r)
-{
-       struct pci_resource *res, *tres;
-
-       res = *r;
-       *r = NULL;
-
-       while (res) {
-               tres = res;
-               res = res->next;
-               kfree(tres);
-       }
-}
-
-/**
- * pciehp_destroy_resource_list: put node back in the resource list
- * @resources: list to put nodes back
- */
-void pciehp_destroy_resource_list(struct resource_lists * resources)
-{
-       kfree_resource_list(&(resources->io_head));
-       kfree_resource_list(&(resources->mem_head));
-       kfree_resource_list(&(resources->p_mem_head));
-       kfree_resource_list(&(resources->bus_head));
-}
-
-/**
- * pciehp_destroy_board_resources: put node back in the resource list
- * @resources: list to put nodes back
- */
-void pciehp_destroy_board_resources(struct pci_func * func)
-{
-       kfree_resource_list(&(func->io_head));
-       kfree_resource_list(&(func->mem_head));
-       kfree_resource_list(&(func->p_mem_head));
-       kfree_resource_list(&(func->bus_head));
-}
diff --git a/drivers/pci/hotplug/pciehprm.h b/drivers/pci/hotplug/pciehprm.h
deleted file mode 100644 (file)
index 05f20fb..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * PCIEHPRM : PCIEHP Resource Manager for ACPI/non-ACPI platform
- *
- * Copyright (C) 1995,2001 Compaq Computer Corporation
- * Copyright (C) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
- * Copyright (C) 2001 IBM Corp.
- * Copyright (C) 2003-2004 Intel Corporation
- *
- * All rights reserved.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com>
- *
- */
-
-#ifndef _PCIEHPRM_H_
-#define _PCIEHPRM_H_
-
-#ifdef CONFIG_HOTPLUG_PCI_PCIE_PHPRM_NONACPI
-#include "pciehprm_nonacpi.h"
-#endif
-
-int pciehprm_init(enum php_ctlr_type ct);
-void pciehprm_cleanup(void);
-int pciehprm_print_pirt(void);
-int pciehprm_find_available_resources(struct controller *ctrl);
-int pciehprm_set_hpp(struct controller *ctrl, struct pci_func *func, u8 card_type);
-void pciehprm_enable_card(struct controller *ctrl, struct pci_func *func, u8 card_type);
-
-#ifdef DEBUG
-#define RES_CHECK(this, bits)  \
-       { if (((this) & (bits - 1))) \
-               printk("%s:%d ERR: potential res loss!\n", __FUNCTION__, __LINE__); }
-#else
-#define RES_CHECK(this, bits)
-#endif
-
-#endif                         /* _PCIEHPRM_H_ */
index 1406db35b08967f40bfb1c03625a412c68b98263..ae244e21862075107c41ad057683567c6923fa92 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/pci.h>
-#include <linux/init.h>
 #include <linux/acpi.h>
-#include <linux/efi.h>
 #include <linux/pci-acpi.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#ifdef CONFIG_IA64
-#include <asm/iosapic.h>
-#endif
-#include <acpi/acpi.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/actypes.h>
 #include "pciehp.h"
-#include "pciehprm.h"
-
-#define        PCI_MAX_BUS             0x100
-#define        ACPI_STA_DEVICE_PRESENT 0x01
 
 #define        METHOD_NAME__SUN        "_SUN"
 #define        METHOD_NAME__HPP        "_HPP"
 #define        METHOD_NAME_OSHP        "OSHP"
 
-/* Status code for running acpi method to gain native control */
-#define NC_NOT_RUN     0
-#define OSC_NOT_EXIST  1
-#define OSC_RUN_FAILED 2
-#define OSHP_NOT_EXIST 3
-#define OSHP_RUN_FAILED        4
-#define NC_RUN_SUCCESS 5
-
-#define        PHP_RES_BUS             0xA0
-#define        PHP_RES_IO              0xA1
-#define        PHP_RES_MEM             0xA2
-#define        PHP_RES_PMEM            0xA3
-
-#define        BRIDGE_TYPE_P2P         0x00
-#define        BRIDGE_TYPE_HOST        0x01
-
-/* this should go to drivers/acpi/include/ */
-struct acpi__hpp {
-       u8      cache_line_size;
-       u8      latency_timer;
-       u8      enable_serr;
-       u8      enable_perr;
-};
-
-struct acpi_php_slot {
-       struct acpi_php_slot    *next;
-       struct acpi_bridge      *bridge;
-       acpi_handle     handle;
-       int     seg;
-       int     bus;
-       int     dev;
-       int     fun;
-       u32     sun;
-       struct pci_resource *mem_head;
-       struct pci_resource *p_mem_head;
-       struct pci_resource *io_head;
-       struct pci_resource *bus_head;
-       void    *slot_ops;      /* _STA, _EJx, etc */
-       struct slot *slot;
-};             /* per func */
-
-struct acpi_bridge {
-       struct acpi_bridge      *parent;
-       struct acpi_bridge      *next;
-       struct acpi_bridge      *child;
-       acpi_handle     handle;
-       int seg;
-       int pbus;                       /* pdev->bus->number            */
-       int pdevice;                    /* PCI_SLOT(pdev->devfn)        */
-       int pfunction;                  /* PCI_DEVFN(pdev->devfn)       */
-       int bus;                        /* pdev->subordinate->number    */
-       struct acpi__hpp                *_hpp;
-       struct acpi_php_slot    *slots;
-       struct pci_resource     *tmem_head;     /* total from crs       */
-       struct pci_resource     *tp_mem_head;   /* total from crs       */
-       struct pci_resource     *tio_head;      /* total from crs       */
-       struct pci_resource     *tbus_head;     /* total from crs       */
-       struct pci_resource     *mem_head;      /* available    */
-       struct pci_resource     *p_mem_head;    /* available    */
-       struct pci_resource     *io_head;       /* available    */
-       struct pci_resource     *bus_head;      /* available    */
-       int scanned;
-       int type;
-};
-
-static struct acpi_bridge *acpi_bridges_head;
-
 static u8 * acpi_path_name( acpi_handle        handle)
 {
        acpi_status             status;
@@ -133,85 +53,43 @@ static u8 * acpi_path_name( acpi_handle    handle)
                return path_name;       
 }
 
-static void acpi_get__hpp ( struct acpi_bridge *ab);
-static int acpi_run_oshp ( struct acpi_bridge  *ab);
-static int osc_run_status = NC_NOT_RUN;
-static int oshp_run_status = NC_NOT_RUN;
-
-static int acpi_add_slot_to_php_slots(
-       struct acpi_bridge      *ab,
-       int                     bus_num,
-       acpi_handle             handle,
-       u32                     adr,
-       u32                     sun
-       )
-{
-       struct acpi_php_slot    *aps;
-       static long     samesun = -1;
-
-       aps = (struct acpi_php_slot *) kmalloc (sizeof(struct acpi_php_slot), GFP_KERNEL);
-       if (!aps) {
-               err ("acpi_pciehprm: alloc for aps fail\n");
-               return -1;
-       }
-       memset(aps, 0, sizeof(struct acpi_php_slot));
-
-       aps->handle = handle;
-       aps->bus = bus_num;
-       aps->dev = (adr >> 16) & 0xffff;
-       aps->fun = adr & 0xffff;
-       aps->sun = sun;
-
-       aps->next = ab->slots;  /* cling to the bridge */
-       aps->bridge = ab;
-       ab->slots = aps;
-
-       ab->scanned += 1;
-       if (!ab->_hpp)
-               acpi_get__hpp(ab);
-       
-       if (osc_run_status == OSC_NOT_EXIST)
-               oshp_run_status = acpi_run_oshp(ab);
-
-       if (sun != samesun) {
-               info("acpi_pciehprm:   Slot sun(%x) at s:b:d:f=0x%02x:%02x:%02x:%02x\n", 
-                       aps->sun, ab->seg, aps->bus, aps->dev, aps->fun);
-               samesun = sun;
-       }
-       return 0;
-}
-
-static void acpi_get__hpp ( struct acpi_bridge *ab)
+static acpi_status
+acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
 {
        acpi_status             status;
        u8                      nui[4];
        struct acpi_buffer      ret_buf = { 0, NULL};
        union acpi_object       *ext_obj, *package;
-       u8                      *path_name = acpi_path_name(ab->handle);
+       u8                      *path_name = acpi_path_name(handle);
        int                     i, len = 0;
 
        /* get _hpp */
-       status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf);
+       status = acpi_evaluate_object(handle, METHOD_NAME__HPP, NULL, &ret_buf);
        switch (status) {
        case AE_BUFFER_OVERFLOW:
                ret_buf.pointer = kmalloc (ret_buf.length, GFP_KERNEL);
                if (!ret_buf.pointer) {
-                       err ("acpi_pciehprm:%s alloc for _HPP fail\n", path_name);
-                       return;
+                       err ("%s:%s alloc for _HPP fail\n", __FUNCTION__,
+                                       path_name);
+                       return AE_NO_MEMORY;
                }
-               status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf);
+               status = acpi_evaluate_object(handle, METHOD_NAME__HPP,
+                               NULL, &ret_buf);
                if (ACPI_SUCCESS(status))
                        break;
        default:
                if (ACPI_FAILURE(status)) {
-                       err("acpi_pciehprm:%s _HPP fail=0x%x\n", path_name, status);
-                       return;
+                       dbg("%s:%s _HPP fail=0x%x\n", __FUNCTION__,
+                                       path_name, status);
+                       return status;
                }
        }
 
        ext_obj = (union acpi_object *) ret_buf.pointer;
        if (ext_obj->type != ACPI_TYPE_PACKAGE) {
-               err ("acpi_pciehprm:%s _HPP obj not a package\n", path_name);
+               err ("%s:%s _HPP obj not a package\n", __FUNCTION__,
+                               path_name);
+               status = AE_ERROR;
                goto free_and_return;
        }
 
@@ -224,1514 +102,153 @@ static void acpi_get__hpp ( struct acpi_bridge *ab)
                        nui[i] = (u8)ext_obj->integer.value;
                        break;
                default:
-                       err ("acpi_pciehprm:%s _HPP obj type incorrect\n", path_name);
+                       err ("%s:%s _HPP obj type incorrect\n", __FUNCTION__,
+                                       path_name);
+                       status = AE_ERROR;
                        goto free_and_return;
                }
        }
 
-       ab->_hpp = kmalloc (sizeof (struct acpi__hpp), GFP_KERNEL);
-       if (!ab->_hpp) {
-               err ("acpi_pciehprm:%s alloc for _HPP failed\n", path_name);
-               goto free_and_return;
-       }
-       memset(ab->_hpp, 0, sizeof(struct acpi__hpp));
+       hpp->cache_line_size = nui[0];
+       hpp->latency_timer = nui[1];
+       hpp->enable_serr = nui[2];
+       hpp->enable_perr = nui[3];
 
-       ab->_hpp->cache_line_size       = nui[0];
-       ab->_hpp->latency_timer         = nui[1];
-       ab->_hpp->enable_serr           = nui[2];
-       ab->_hpp->enable_perr           = nui[3];
-
-       dbg("  _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size);
-       dbg("  _HPP: latency timer  =0x%x\n", ab->_hpp->latency_timer);
-       dbg("  _HPP: enable SERR    =0x%x\n", ab->_hpp->enable_serr);
-       dbg("  _HPP: enable PERR    =0x%x\n", ab->_hpp->enable_perr);
+       dbg("  _HPP: cache_line_size=0x%x\n", hpp->cache_line_size);
+       dbg("  _HPP: latency timer  =0x%x\n", hpp->latency_timer);
+       dbg("  _HPP: enable SERR    =0x%x\n", hpp->enable_serr);
+       dbg("  _HPP: enable PERR    =0x%x\n", hpp->enable_perr);
 
 free_and_return:
        kfree(ret_buf.pointer);
+       return status;
 }
 
-static int acpi_run_oshp ( struct acpi_bridge  *ab)
+static acpi_status acpi_run_oshp(acpi_handle handle)
 {
        acpi_status             status;
-       u8                      *path_name = acpi_path_name(ab->handle);
+       u8                      *path_name = acpi_path_name(handle);
 
        /* run OSHP */
-       status = acpi_evaluate_object(ab->handle, METHOD_NAME_OSHP, NULL, NULL);
+       status = acpi_evaluate_object(handle, METHOD_NAME_OSHP, NULL, NULL);
        if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s OSHP fails=0x%x\n", path_name, status);
-               oshp_run_status = (status == AE_NOT_FOUND) ? OSHP_NOT_EXIST : OSHP_RUN_FAILED;
+               dbg("%s:%s OSHP fails=0x%x\n", __FUNCTION__, path_name,
+                               status);
        } else {
-               oshp_run_status = NC_RUN_SUCCESS;
-               dbg("acpi_pciehprm:%s OSHP passes =0x%x\n", path_name, status);
-               dbg("acpi_pciehprm:%s oshp_run_status =0x%x\n", path_name, oshp_run_status);
-       }
-       return oshp_run_status;
-}
-
-static acpi_status acpi_evaluate_crs(
-       acpi_handle             handle,
-       struct acpi_resource    **retbuf
-       )
-{
-       acpi_status             status;
-       struct acpi_buffer      crsbuf;
-       u8                      *path_name = acpi_path_name(handle);
-
-       crsbuf.length  = 0;
-       crsbuf.pointer = NULL;
-
-       status = acpi_get_current_resources (handle, &crsbuf);
-
-       switch (status) {
-       case AE_BUFFER_OVERFLOW:
-               break;          /* found */
-       case AE_NOT_FOUND:
-               dbg("acpi_pciehprm:%s _CRS not found\n", path_name);
-               return status;
-       default:
-               err ("acpi_pciehprm:%s _CRS fail=0x%x\n", path_name, status);
-               return status;
+               dbg("%s:%s OSHP passes\n", __FUNCTION__, path_name);
        }
-
-       crsbuf.pointer = kmalloc (crsbuf.length, GFP_KERNEL);
-       if (!crsbuf.pointer) {
-               err ("acpi_pciehprm: alloc %ld bytes for %s _CRS fail\n", (ulong)crsbuf.length, path_name);
-               return AE_NO_MEMORY;
-       }
-
-       status = acpi_get_current_resources (handle, &crsbuf);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm: %s _CRS fail=0x%x.\n", path_name, status);
-               kfree(crsbuf.pointer);
-               return status;
-       }
-
-       *retbuf = crsbuf.pointer;
-
        return status;
 }
 
-static void free_pci_resource ( struct pci_resource    *aprh)
+static int is_root_bridge(acpi_handle handle)
 {
-       struct pci_resource     *res, *next;
+       acpi_status status;
+       struct acpi_device_info *info;
+       struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+       int i;
 
-       for (res = aprh; res; res = next) {
-               next = res->next;
-               kfree(res);
-       }
-}
-
-static void print_pci_resource ( struct pci_resource   *aprh)
-{
-       struct pci_resource     *res;
-
-       for (res = aprh; res; res = res->next)
-               dbg("        base= 0x%x length= 0x%x\n", res->base, res->length);
-}
-
-static void print_slot_resources( struct acpi_php_slot *aps)
-{
-       if (aps->bus_head) {
-               dbg("    BUS Resources:\n");
-               print_pci_resource (aps->bus_head);
-       }
-
-       if (aps->io_head) {
-               dbg("    IO Resources:\n");
-               print_pci_resource (aps->io_head);
-       }
-
-       if (aps->mem_head) {
-               dbg("    MEM Resources:\n");
-               print_pci_resource (aps->mem_head);
-       }
-
-       if (aps->p_mem_head) {
-               dbg("    PMEM Resources:\n");
-               print_pci_resource (aps->p_mem_head);
-       }
-}
-
-static void print_pci_resources( struct acpi_bridge    *ab)
-{
-       if (ab->tbus_head) {
-               dbg("    Total BUS Resources:\n");
-               print_pci_resource (ab->tbus_head);
-       }
-       if (ab->bus_head) {
-               dbg("    BUS Resources:\n");
-               print_pci_resource (ab->bus_head);
-       }
-
-       if (ab->tio_head) {
-               dbg("    Total IO Resources:\n");
-               print_pci_resource (ab->tio_head);
-       }
-       if (ab->io_head) {
-               dbg("    IO Resources:\n");
-               print_pci_resource (ab->io_head);
-       }
-
-       if (ab->tmem_head) {
-               dbg("    Total MEM Resources:\n");
-               print_pci_resource (ab->tmem_head);
-       }
-       if (ab->mem_head) {
-               dbg("    MEM Resources:\n");
-               print_pci_resource (ab->mem_head);
-       }
-
-       if (ab->tp_mem_head) {
-               dbg("    Total PMEM Resources:\n");
-               print_pci_resource (ab->tp_mem_head);
-       }
-       if (ab->p_mem_head) {
-               dbg("    PMEM Resources:\n");
-               print_pci_resource (ab->p_mem_head);
-       }
-       if (ab->_hpp) {
-               dbg("    _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size);
-               dbg("    _HPP: latency timer  =0x%x\n", ab->_hpp->latency_timer);
-               dbg("    _HPP: enable SERR    =0x%x\n", ab->_hpp->enable_serr);
-               dbg("    _HPP: enable PERR    =0x%x\n", ab->_hpp->enable_perr);
-       }
-}
-
-static int pciehprm_delete_resource(
-       struct pci_resource **aprh,
-       ulong base,
-       ulong size)
-{
-       struct pci_resource *res;
-       struct pci_resource *prevnode;
-       struct pci_resource *split_node;
-       ulong tbase;
-
-       pciehp_resource_sort_and_combine(aprh);
-
-       for (res = *aprh; res; res = res->next) {
-               if (res->base > base)
-                       continue;
-
-               if ((res->base + res->length) < (base + size))
-                       continue;
-
-               if (res->base < base) {
-                       tbase = base;
-
-                       if ((res->length - (tbase - res->base)) < size)
-                               continue;
-
-                       split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base;
-                       split_node->length = tbase - res->base;
-                       res->base = tbase;
-                       res->length -= split_node->length;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (res->length >= size) {
-                       split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base + size;
-                       split_node->length = res->length - size;
-                       res->length = size;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (*aprh == res) {
-                       *aprh = res->next;
-               } else {
-                       prevnode = *aprh;
-                       while (prevnode->next != res)
-                               prevnode = prevnode->next;
-
-                       prevnode->next = res->next;
-               }
-               res->next = NULL;
-               kfree(res);
-               break;
-       }
-
-       return 0;
-}
-
-static int pciehprm_delete_resources(
-       struct pci_resource **aprh,
-       struct pci_resource *this
-       )
-{
-       struct pci_resource *res;
-
-       for (res = this; res; res = res->next)
-               pciehprm_delete_resource(aprh, res->base, res->length);
-
-       return 0;
-}
-
-static int pciehprm_add_resource(
-       struct pci_resource **aprh,
-       ulong base,
-       ulong size)
-{
-       struct pci_resource *res;
-
-       for (res = *aprh; res; res = res->next) {
-               if ((res->base + res->length) == base) {
-                       res->length += size;
-                       size = 0L;
-                       break;
+       status = acpi_get_object_info(handle, &buffer);
+       if (ACPI_SUCCESS(status)) {
+               info = buffer.pointer;
+               if ((info->valid & ACPI_VALID_HID) &&
+                       !strcmp(PCI_ROOT_HID_STRING,
+                                       info->hardware_id.value)) {
+                       acpi_os_free(buffer.pointer);
+                       return 1;
+               }
+               if (info->valid & ACPI_VALID_CID) {
+                       for (i=0; i < info->compatibility_id.count; i++) {
+                               if (!strcmp(PCI_ROOT_HID_STRING,
+                                       info->compatibility_id.id[i].value)) {
+                                       acpi_os_free(buffer.pointer);
+                                       return 1;
+                               }
+                       }
                }
-               if (res->next == *aprh)
-                       break;
        }
-
-       if (size) {
-               res = kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-               if (!res) {
-                       err ("acpi_pciehprm: alloc for res fail\n");
-                       return -ENOMEM;
-               }
-               memset(res, 0, sizeof (struct pci_resource));
-
-               res->base = base;
-               res->length = size;
-               res->next = *aprh;
-               *aprh = res;
-       }
-
        return 0;
 }
 
-static int pciehprm_add_resources(
-       struct pci_resource **aprh,
-       struct pci_resource *this
-       )
-{
-       struct pci_resource *res;
-       int     rc = 0;
-
-       for (res = this; res && !rc; res = res->next)
-               rc = pciehprm_add_resource(aprh, res->base, res->length);
-
-       return rc;
-}
-
-static void acpi_parse_io (
-       struct acpi_bridge              *ab,
-       union acpi_resource_data        *data
-       )
+int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev)
 {
-       struct acpi_resource_io *dataio;
-       dataio = (struct acpi_resource_io *) data;
-
-       dbg("Io Resource\n");
-       dbg("  %d bit decode\n", ACPI_DECODE_16 == dataio->io_decode ? 16:10);
-       dbg("  Range minimum base: %08X\n", dataio->min_base_address);
-       dbg("  Range maximum base: %08X\n", dataio->max_base_address);
-       dbg("  Alignment: %08X\n", dataio->alignment);
-       dbg("  Range Length: %08X\n", dataio->range_length);
-}
-
-static void acpi_parse_fixed_io (
-       struct acpi_bridge      *ab,
-       union acpi_resource_data        *data
-       )
-{
-       struct acpi_resource_fixed_io  *datafio;
-       datafio = (struct acpi_resource_fixed_io *) data;
-
-       dbg("Fixed Io Resource\n");
-       dbg("  Range base address: %08X", datafio->base_address);
-       dbg("  Range length: %08X", datafio->range_length);
-}
-
-static void acpi_parse_address16_32 (
-       struct acpi_bridge      *ab,
-       union acpi_resource_data        *data,
-       acpi_resource_type      id
-       )
-{
-       /* 
-        * acpi_resource_address16 == acpi_resource_address32
-        * acpi_resource_address16 *data16 = (acpi_resource_address16 *) data;
+       acpi_status status;
+       acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev));
+       struct pci_dev *pdev = dev;
+       u8 *path_name;
+       /*
+        * Per PCI firmware specification, we should run the ACPI _OSC
+        * method to get control of hotplug hardware before using it.
+        * If an _OSC is missing, we look for an OSHP to do the same thing.
+        * To handle different BIOS behavior, we look for _OSC and OSHP
+        * within the scope of the hotplug controller and its parents, upto
+        * the host bridge under which this controller exists.
         */
-       struct acpi_resource_address32 *data32 = (struct acpi_resource_address32 *) data;
-       struct pci_resource **aprh, **tprh;
-
-       if (id == ACPI_RSTYPE_ADDRESS16)
-               dbg("acpi_pciehprm:16-Bit Address Space Resource\n");
-       else
-               dbg("acpi_pciehprm:32-Bit Address Space Resource\n");
-
-       switch (data32->resource_type) {
-       case ACPI_MEMORY_RANGE: 
-               dbg("  Resource Type: Memory Range\n");
-               aprh = &ab->mem_head;
-               tprh = &ab->tmem_head;
-
-               switch (data32->attribute.memory.cache_attribute) {
-               case ACPI_NON_CACHEABLE_MEMORY:
-                       dbg("  Type Specific: Noncacheable memory\n");
-                       break; 
-               case ACPI_CACHABLE_MEMORY:
-                       dbg("  Type Specific: Cacheable memory\n");
-                       break; 
-               case ACPI_WRITE_COMBINING_MEMORY:
-                       dbg("  Type Specific: Write-combining memory\n");
-                       break; 
-               case ACPI_PREFETCHABLE_MEMORY:
-                       aprh = &ab->p_mem_head;
-                       dbg("  Type Specific: Prefetchable memory\n");
-                       break; 
-               default:
-                       dbg("  Type Specific: Invalid cache attribute\n");
+       while (!handle) {
+               /*
+                * This hotplug controller was not listed in the ACPI name
+                * space at all. Try to get acpi handle of parent pci bus.
+                */
+               if (!pdev || !pdev->bus->parent)
                        break;
-               }
-
-               dbg("  Type Specific: Read%s\n", ACPI_READ_WRITE_MEMORY == data32->attribute.memory.read_write_attribute ? "/Write":" Only");
-               break;
-
-       case ACPI_IO_RANGE: 
-               dbg("  Resource Type: I/O Range\n");
-               aprh = &ab->io_head;
-               tprh = &ab->tio_head;
-
-               switch (data32->attribute.io.range_attribute) {
-               case ACPI_NON_ISA_ONLY_RANGES:
-                       dbg("  Type Specific: Non-ISA Io Addresses\n");
-                       break; 
-               case ACPI_ISA_ONLY_RANGES:
-                       dbg("  Type Specific: ISA Io Addresses\n");
-                       break; 
-               case ACPI_ENTIRE_RANGE:
-                       dbg("  Type Specific: ISA and non-ISA Io Addresses\n");
-                       break; 
-               default:
-                       dbg("  Type Specific: Invalid range attribute\n");
+               dbg("Could not find %s in acpi namespace, trying parent\n",
+                               pci_name(pdev));
+               if (!pdev->bus->parent->self)
+                       /* Parent must be a host bridge */
+                       handle = acpi_get_pci_rootbridge_handle(
+                                       pci_domain_nr(pdev->bus->parent),
+                                       pdev->bus->parent->number);
+               else
+                       handle = DEVICE_ACPI_HANDLE(
+                                       &(pdev->bus->parent->self->dev));
+               pdev = pdev->bus->parent->self;
+       }
+
+       while (handle) {
+               path_name = acpi_path_name(handle);
+               dbg("Trying to get hotplug control for %s \n", path_name);
+               status = pci_osc_control_set(handle,
+                               OSC_PCI_EXPRESS_NATIVE_HP_CONTROL);
+               if (status == AE_NOT_FOUND)
+                       status = acpi_run_oshp(handle);
+               if (ACPI_SUCCESS(status)) {
+                       dbg("Gained control for hotplug HW for pci %s (%s)\n",
+                               pci_name(dev), path_name);
+                       return 0;
+               }
+               if (is_root_bridge(handle))
                        break;
-               }
-               break;
-
-       case ACPI_BUS_NUMBER_RANGE: 
-               dbg("  Resource Type: Bus Number Range(fixed)\n");
-               /* fixup to be compatible with the rest of php driver */
-               data32->min_address_range++;
-               data32->address_length--;
-               aprh = &ab->bus_head;
-               tprh = &ab->tbus_head;
-               break; 
-       default: 
-               dbg("  Resource Type: Invalid resource type. Exiting.\n");
-               return;
-       }
-
-       dbg("  Resource %s\n", ACPI_CONSUMER == data32->producer_consumer ? "Consumer":"Producer");
-       dbg("  %s decode\n", ACPI_SUB_DECODE == data32->decode ? "Subtractive":"Positive");
-       dbg("  Min address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->min_address_fixed ? "":"not");
-       dbg("  Max address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->max_address_fixed ? "":"not");
-       dbg("  Granularity: %08X\n", data32->granularity);
-       dbg("  Address range min: %08X\n", data32->min_address_range);
-       dbg("  Address range max: %08X\n", data32->max_address_range);
-       dbg("  Address translation offset: %08X\n", data32->address_translation_offset);
-       dbg("  Address Length: %08X\n", data32->address_length);
-
-       if (0xFF != data32->resource_source.index) {
-               dbg("  Resource Source Index: %X\n", data32->resource_source.index);
-               /* dbg("  Resource Source: %s\n", data32->resource_source.string_ptr); */
-       }
-
-       pciehprm_add_resource(aprh, data32->min_address_range, data32->address_length);
-}
-
-static acpi_status acpi_parse_crs(
-       struct acpi_bridge      *ab,
-       struct acpi_resource    *crsbuf
-       )
-{
-       acpi_status             status = AE_OK;
-       struct acpi_resource    *resource = crsbuf;
-       u8                              count = 0;
-       u8                              done = 0;
-
-       while (!done) {
-               dbg("acpi_pciehprm: PCI bus 0x%x Resource structure %x.\n", ab->bus, count++);
-               switch (resource->id) {
-               case ACPI_RSTYPE_IRQ:
-                       dbg("Irq -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_DMA:
-                       dbg("DMA -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_START_DPF:
-                       dbg("Start DPF -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_END_DPF:
-                       dbg("End DPF -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_IO:
-                       acpi_parse_io (ab, &resource->data);
-                       break; 
-               case ACPI_RSTYPE_FIXED_IO:
-                       acpi_parse_fixed_io (ab, &resource->data);
-                       break; 
-               case ACPI_RSTYPE_VENDOR:
-                       dbg("Vendor -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_END_TAG:
-                       dbg("End_tag -------- Resource\n");
-                       done = 1;
-                       break; 
-               case ACPI_RSTYPE_MEM24:
-                       dbg("Mem24 -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_MEM32:
-                       dbg("Mem32 -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_FIXED_MEM32:
-                       dbg("Fixed Mem32 -------- Resource\n");
-                       break; 
-               case ACPI_RSTYPE_ADDRESS16:
-                       acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS16);
-                       break; 
-               case ACPI_RSTYPE_ADDRESS32:
-                       acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS32);
-                       break; 
-               case ACPI_RSTYPE_ADDRESS64:
-                       info("Address64 -------- Resource unparsed\n");
-                       break; 
-               case ACPI_RSTYPE_EXT_IRQ:
-                       dbg("Ext Irq -------- Resource\n");
-                       break; 
-               default:
-                       dbg("Invalid -------- resource type 0x%x\n", resource->id);
-                       break;
-               }
-
-               resource = (struct acpi_resource *) ((char *)resource + resource->length);
-       }
-
-       return status;
-}
-
-static acpi_status acpi_get_crs( struct acpi_bridge    *ab)
-{
-       acpi_status             status;
-       struct acpi_resource    *crsbuf;
-
-       status = acpi_evaluate_crs(ab->handle, &crsbuf);
-       if (ACPI_SUCCESS(status)) {
-               status = acpi_parse_crs(ab, crsbuf);
-               kfree(crsbuf);
-
-               pciehp_resource_sort_and_combine(&ab->bus_head);
-               pciehp_resource_sort_and_combine(&ab->io_head);
-               pciehp_resource_sort_and_combine(&ab->mem_head);
-               pciehp_resource_sort_and_combine(&ab->p_mem_head);
-
-               pciehprm_add_resources (&ab->tbus_head, ab->bus_head);
-               pciehprm_add_resources (&ab->tio_head, ab->io_head);
-               pciehprm_add_resources (&ab->tmem_head, ab->mem_head);
-               pciehprm_add_resources (&ab->tp_mem_head, ab->p_mem_head);
-       }
-
-       return status;
-}
-
-/* find acpi_bridge downword from ab.  */
-static struct acpi_bridge *
-find_acpi_bridge_by_bus(
-       struct acpi_bridge *ab,
-       int seg,
-       int bus         /* pdev->subordinate->number */
-       )
-{
-       struct acpi_bridge      *lab = NULL;
-
-       if (!ab)
-               return NULL;
-
-       if ((ab->bus == bus) && (ab->seg == seg))
-               return ab;
-
-       if (ab->child)
-               lab = find_acpi_bridge_by_bus(ab->child, seg, bus);
-
-       if (!lab)
-       if (ab->next)
-               lab = find_acpi_bridge_by_bus(ab->next, seg, bus);
-
-       return lab;
-}
-
-/*
- * Build a device tree of ACPI PCI Bridges
- */
-static void pciehprm_acpi_register_a_bridge (
-       struct acpi_bridge      **head,
-       struct acpi_bridge      *pab,   /* parent bridge to which child bridge is added */
-       struct acpi_bridge      *cab    /* child bridge to add */
-       )
-{
-       struct acpi_bridge      *lpab;
-       struct acpi_bridge      *lcab;
-
-       lpab = find_acpi_bridge_by_bus(*head, pab->seg, pab->bus);
-       if (!lpab) {
-               if (!(pab->type & BRIDGE_TYPE_HOST))
-                       warn("PCI parent bridge s:b(%x:%x) not in list.\n", pab->seg, pab->bus);
-               pab->next = *head;
-               *head = pab;
-               lpab = pab;
-       }
-
-       if ((cab->type & BRIDGE_TYPE_HOST) && (pab == cab))
-               return;
-
-       lcab = find_acpi_bridge_by_bus(*head, cab->seg, cab->bus);
-       if (lcab) {
-               if ((pab->bus != lcab->parent->bus) || (lcab->bus != cab->bus))
-                       err("PCI child bridge s:b(%x:%x) in list with diff parent.\n", cab->seg, cab->bus);
-               return;
-       } else
-               lcab = cab;
-
-       lcab->parent = lpab;
-       lcab->next = lpab->child;
-       lpab->child = lcab;
-}
-
-static acpi_status pciehprm_acpi_build_php_slots_callback(
-       acpi_handle             handle,
-       u32                     Level,
-       void                    *context,
-       void                    **retval
-       )
-{
-       ulong           bus_num;
-       ulong           seg_num;
-       ulong           sun, adr;
-       ulong           padr = 0;
-       acpi_handle             phandle = NULL;
-       struct acpi_bridge      *pab = (struct acpi_bridge *)context;
-       struct acpi_bridge      *lab;
-       acpi_status             status;
-       u8                      *path_name = acpi_path_name(handle);
-
-       /* get _SUN */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__SUN, NULL, &sun);
-       switch(status) {
-       case AE_NOT_FOUND:
-               return AE_OK;
-       default:
-               if (ACPI_FAILURE(status)) {
-                       err("acpi_pciehprm:%s _SUN fail=0x%x\n", path_name, status);
-                       return status;
-               }
-       }
-
-       /* get _ADR. _ADR must exist if _SUN exists */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status);
-               return status;
-       }
-
-       dbg("acpi_pciehprm:%s sun=0x%08x adr=0x%08x\n", path_name, (u32)sun, (u32)adr);
-
-       status = acpi_get_parent(handle, &phandle);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s get_parent fail=0x%x\n", path_name, status);
-               return (status);
-       }
-
-       bus_num = pab->bus;
-       seg_num = pab->seg;
-
-       if (pab->bus == bus_num) {
-               lab = pab;
-       } else {
-               dbg("WARN: pab is not parent\n");
-               lab = find_acpi_bridge_by_bus(pab, seg_num, bus_num);
-               if (!lab) {
-                       dbg("acpi_pciehprm: alloc new P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun);
-                       lab = (struct acpi_bridge *)kmalloc(sizeof(struct acpi_bridge), GFP_KERNEL);
-                       if (!lab) {
-                               err("acpi_pciehprm: alloc for ab fail\n");
-                               return AE_NO_MEMORY;
-                       }
-                       memset(lab, 0, sizeof(struct acpi_bridge));
-
-                       lab->handle = phandle;
-                       lab->pbus = pab->bus;
-                       lab->pdevice = (int)(padr >> 16) & 0xffff;
-                       lab->pfunction = (int)(padr & 0xffff);
-                       lab->bus = (int)bus_num;
-                       lab->scanned = 0;
-                       lab->type = BRIDGE_TYPE_P2P;
-
-                       pciehprm_acpi_register_a_bridge (&acpi_bridges_head, pab, lab);
-               } else
-                       dbg("acpi_pciehprm: found P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun);
-       }
-
-       acpi_add_slot_to_php_slots(lab, (int)bus_num, handle, (u32)adr, (u32)sun);
-
-       return (status);
-}
-
-static int pciehprm_acpi_build_php_slots(
-       struct acpi_bridge      *ab,
-       u32                     depth
-       )
-{
-       acpi_status     status;
-       u8              *path_name = acpi_path_name(ab->handle);
-
-       /* Walk down this pci bridge to get _SUNs if any behind P2P */
-       status = acpi_walk_namespace ( ACPI_TYPE_DEVICE,
-                               ab->handle,
-                               depth,
-                               pciehprm_acpi_build_php_slots_callback,
-                               ab,
-                               NULL );
-       if (ACPI_FAILURE(status)) {
-               dbg("acpi_pciehprm:%s walk for _SUN on pci bridge seg:bus(%x:%x) fail=0x%x\n", path_name, ab->seg, ab->bus, status);
-               return -1;
-       }
-
-       return 0;
-}
-
-static void build_a_bridge(
-       struct acpi_bridge      *pab,
-       struct acpi_bridge      *ab
-       )
-{
-       u8              *path_name = acpi_path_name(ab->handle);
-
-       pciehprm_acpi_register_a_bridge (&acpi_bridges_head, pab, ab);
-
-       switch (ab->type) {
-       case BRIDGE_TYPE_HOST:
-               dbg("acpi_pciehprm: Registered PCI HOST Bridge(%02x)    on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n",
-                       ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name);
-               break;
-       case BRIDGE_TYPE_P2P:
-               dbg("acpi_pciehprm: Registered PCI  P2P Bridge(%02x-%02x) on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n",
-                       ab->pbus, ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name);
-               break;
-       };
-
-       /* build any immediate PHP slots under this pci bridge */
-       pciehprm_acpi_build_php_slots(ab, 1);
-}
-
-static struct acpi_bridge * add_p2p_bridge(
-       acpi_handle handle,
-       struct acpi_bridge      *pab,   /* parent */
-       ulong   adr
-       )
-{
-       struct acpi_bridge      *ab;
-       struct pci_dev  *pdev;
-       ulong           devnum, funcnum;
-       u8                      *path_name = acpi_path_name(handle);
-
-       ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL);
-       if (!ab) {
-               err("acpi_pciehprm: alloc for ab fail\n");
-               return NULL;
-       }
-       memset(ab, 0, sizeof(struct acpi_bridge));
-
-       devnum = (adr >> 16) & 0xffff;
-       funcnum = adr & 0xffff;
-
-       pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum));
-       if (!pdev || !pdev->subordinate) {
-               err("acpi_pciehprm:%s is not a P2P Bridge\n", path_name);
-               kfree(ab);
-               return NULL;
-       }
-
-       ab->handle = handle;
-       ab->seg = pab->seg;
-       ab->pbus = pab->bus;            /* or pdev->bus->number */
-       ab->pdevice = devnum;           /* or PCI_SLOT(pdev->devfn) */
-       ab->pfunction = funcnum;        /* or PCI_FUNC(pdev->devfn) */
-       ab->bus = pdev->subordinate->number;
-       ab->scanned = 0;
-       ab->type = BRIDGE_TYPE_P2P;
-
-       dbg("acpi_pciehprm: P2P(%x-%x) on pci=b:d:f(%x:%x:%x) acpi=b:d:f(%x:%x:%x) [%s]\n",
-               pab->bus, ab->bus, pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
-               pab->bus, (u32)devnum, (u32)funcnum, path_name);
-
-       build_a_bridge(pab, ab);
-
-       return ab;
-}
-
-static acpi_status scan_p2p_bridge(
-       acpi_handle             handle,
-       u32                     Level,
-       void                    *context,
-       void                    **retval
-       )
-{
-       struct acpi_bridge      *pab = (struct acpi_bridge *)context;
-       struct acpi_bridge      *ab;
-       acpi_status             status;
-       ulong                   adr = 0;
-       u8                      *path_name = acpi_path_name(handle);
-       ulong                   devnum, funcnum;
-       struct pci_dev          *pdev;
-
-       /* get device, function */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr);
-       if (ACPI_FAILURE(status)) {
-               if (status != AE_NOT_FOUND)
-                       err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status);
-               return AE_OK;
-       }
-
-       devnum = (adr >> 16) & 0xffff;
-       funcnum = adr & 0xffff;
-
-       pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum));
-       if (!pdev)
-               return AE_OK;
-       if (!pdev->subordinate)
-               return AE_OK;
-
-       ab = add_p2p_bridge(handle, pab, adr);
-       if (ab) {
-               status = acpi_walk_namespace ( ACPI_TYPE_DEVICE,
-                                       handle,
-                                       (u32)1,
-                                       scan_p2p_bridge,
-                                       ab,
-                                       NULL);
+               chandle = handle;
+               status = acpi_get_parent(chandle, &handle);
                if (ACPI_FAILURE(status))
-                       dbg("acpi_pciehprm:%s find_p2p fail=0x%x\n", path_name, status);
-       }
-
-       return AE_OK;
-}
-
-static struct acpi_bridge * add_host_bridge(
-       acpi_handle handle,
-       ulong   segnum,
-       ulong   busnum
-       )
-{
-       ulong                   adr = 0;
-       acpi_status             status;
-       struct acpi_bridge      *ab;
-       u8                      *path_name = acpi_path_name(handle);
-
-       /* get device, function: host br adr is always 0000 though.  */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status);
-               return NULL;
-       }
-       dbg("acpi_pciehprm: ROOT PCI seg(0x%x)bus(0x%x)dev(0x%x)func(0x%x) [%s]\n", (u32)segnum, 
-               (u32)busnum, (u32)(adr >> 16) & 0xffff, (u32)adr & 0xffff, path_name);
-
-       ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL);
-       if (!ab) {
-               err("acpi_pciehprm: alloc for ab fail\n");
-               return NULL;
-       }
-       memset(ab, 0, sizeof(struct acpi_bridge));
-
-       ab->handle = handle;
-       ab->seg = (int)segnum;
-       ab->bus = ab->pbus = (int)busnum;
-       ab->pdevice = (int)(adr >> 16) & 0xffff;
-       ab->pfunction = (int)(adr & 0xffff);
-       ab->scanned = 0;
-       ab->type = BRIDGE_TYPE_HOST;
-
-       /* get root pci bridge's current resources */
-       status = acpi_get_crs(ab);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s evaluate _CRS fail=0x%x\n", path_name, status);
-               kfree(ab);
-               return NULL;
-       }
-
-       status = pci_osc_control_set (OSC_PCI_EXPRESS_NATIVE_HP_CONTROL); 
-       if (ACPI_FAILURE(status)) {
-               err("%s: status %x\n", __FUNCTION__, status);
-               osc_run_status = (status == AE_NOT_FOUND) ? OSC_NOT_EXIST : OSC_RUN_FAILED;
-       } else {
-               osc_run_status = NC_RUN_SUCCESS;
-       }       
-       dbg("%s: osc_run_status %x\n", __FUNCTION__, osc_run_status);
-       
-       build_a_bridge(ab, ab);
-
-       return ab;
-}
-
-static acpi_status acpi_scan_from_root_pci_callback (
-       acpi_handle     handle,
-       u32                     Level,
-       void            *context,
-       void            **retval
-       )
-{
-       ulong           segnum = 0;
-       ulong           busnum = 0;
-       acpi_status             status;
-       struct acpi_bridge      *ab;
-       u8                      *path_name = acpi_path_name(handle);
-
-       /* get bus number of this pci root bridge */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL, &segnum);
-       if (ACPI_FAILURE(status)) {
-               if (status != AE_NOT_FOUND) {
-                       err("acpi_pciehprm:%s evaluate _SEG fail=0x%x\n", path_name, status);
-                       return status;
-               }
-               segnum = 0;
-       }
-
-       /* get bus number of this pci root bridge */
-       status = acpi_evaluate_integer(handle, METHOD_NAME__BBN, NULL, &busnum);
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:%s evaluate _BBN fail=0x%x\n", path_name, status);
-               return (status);
-       }
-
-       ab = add_host_bridge(handle, segnum, busnum);
-       if (ab) {
-               status = acpi_walk_namespace ( ACPI_TYPE_DEVICE,
-                                       handle,
-                                       1,
-                                       scan_p2p_bridge,
-                                       ab,
-                                       NULL);
-               if (ACPI_FAILURE(status))
-                       dbg("acpi_pciehprm:%s find_p2p fail=0x%x\n", path_name, status);
+                       break;
        }
 
-       return AE_OK;
+       err("Cannot get control of hotplug hardware for pci %s\n",
+                       pci_name(dev));
+       return -1;
 }
 
-static int pciehprm_acpi_scan_pci (void)
+void pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
+               struct hotplug_params *hpp)
 {
-       acpi_status     status;
+       acpi_status status = AE_NOT_FOUND;
+       struct pci_dev *pdev = dev;
 
        /*
-        * TBD: traverse LDM device tree with the help of
-        *  unified ACPI augmented for php device population.
+        * _HPP settings apply to all child buses, until another _HPP is
+        * encountered. If we don't find an _HPP for the input pci dev,
+        * look for it in the parent device scope since that would apply to
+        * this pci dev. If we don't find any _HPP, use hardcoded defaults
         */
-       status = acpi_get_devices ( PCI_ROOT_HID_STRING,
-                               acpi_scan_from_root_pci_callback,
-                               NULL,
-                               NULL );
-       if (ACPI_FAILURE(status)) {
-               err("acpi_pciehprm:get_device PCI ROOT HID fail=0x%x\n", status);
-               return -1;
-       }
-
-       return 0;
-}
-
-int pciehprm_init(enum php_ctlr_type ctlr_type)
-{
-       int     rc;
-
-       if (ctlr_type != PCI)
-               return -ENODEV;
-
-       dbg("pciehprm ACPI init <enter>\n");
-       acpi_bridges_head = NULL;
-
-       /* construct PCI bus:device tree of acpi_handles */
-       rc = pciehprm_acpi_scan_pci();
-       if (rc)
-               return rc;
-
-       if ((oshp_run_status != NC_RUN_SUCCESS) && (osc_run_status != NC_RUN_SUCCESS)) {
-               err("Fails to gain control of native hot-plug\n");
-               rc = -ENODEV;
-       }
-
-       dbg("pciehprm ACPI init %s\n", (rc)?"fail":"success");
-       return rc;
-}
-
-static void free_a_slot(struct acpi_php_slot *aps)
-{
-       dbg("        free a php func of slot(0x%02x) on PCI b:d:f=0x%02x:%02x:%02x\n", aps->sun, aps->bus, aps->dev, aps->fun);
-
-       free_pci_resource (aps->io_head);
-       free_pci_resource (aps->bus_head);
-       free_pci_resource (aps->mem_head);
-       free_pci_resource (aps->p_mem_head);
-
-       kfree(aps);
-}
-
-static void free_a_bridge( struct acpi_bridge  *ab)
-{
-       struct acpi_php_slot    *aps, *next;
-
-       switch (ab->type) {
-       case BRIDGE_TYPE_HOST:
-               dbg("Free ACPI PCI HOST Bridge(%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n",
-                       ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction);
-               break;
-       case BRIDGE_TYPE_P2P:
-               dbg("Free ACPI PCI P2P Bridge(%x-%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n",
-                       ab->pbus, ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction);
-               break;
-       };
-
-       /* free slots first */
-       for (aps = ab->slots; aps; aps = next) {
-               next = aps->next;
-               free_a_slot(aps);
-       }
-
-       free_pci_resource (ab->io_head);
-       free_pci_resource (ab->tio_head);
-       free_pci_resource (ab->bus_head);
-       free_pci_resource (ab->tbus_head);
-       free_pci_resource (ab->mem_head);
-       free_pci_resource (ab->tmem_head);
-       free_pci_resource (ab->p_mem_head);
-       free_pci_resource (ab->tp_mem_head);
-
-       kfree(ab);
-}
-
-static void pciehprm_free_bridges ( struct acpi_bridge *ab)
-{
-       if (!ab)
-               return;
-
-       if (ab->child)
-               pciehprm_free_bridges (ab->child);
-
-       if (ab->next)
-               pciehprm_free_bridges (ab->next);
-
-       free_a_bridge(ab);
-}
-
-void pciehprm_cleanup(void)
-{
-       pciehprm_free_bridges (acpi_bridges_head);
-}
-
-static int get_number_of_slots (
-       struct acpi_bridge      *ab,
-       int                             selfonly
-       )
-{
-       struct acpi_php_slot    *aps;
-       int     prev_slot = -1;
-       int     slot_num = 0;
-
-       for ( aps = ab->slots; aps; aps = aps->next)
-               if (aps->dev != prev_slot) {
-                       prev_slot = aps->dev;
-                       slot_num++;
-               }
-
-       if (ab->child)
-               slot_num += get_number_of_slots (ab->child, 0);
-
-       if (selfonly)
-               return slot_num;
-
-       if (ab->next)
-               slot_num += get_number_of_slots (ab->next, 0);
-
-       return slot_num;
-}
-
-static int print_acpi_resources (struct acpi_bridge    *ab)
-{
-       struct acpi_php_slot            *aps;
-       int     i;
-
-       switch (ab->type) {
-       case BRIDGE_TYPE_HOST:
-               dbg("PCI HOST Bridge (%x) [%s]\n", ab->bus, acpi_path_name(ab->handle));
-               break;
-       case BRIDGE_TYPE_P2P:
-               dbg("PCI P2P Bridge (%x-%x) [%s]\n", ab->pbus, ab->bus, acpi_path_name(ab->handle));
-               break;
-       };
-
-       print_pci_resources (ab);
-
-       for ( i = -1, aps = ab->slots; aps; aps = aps->next) {
-               if (aps->dev == i)
-                       continue;
-               dbg("  Slot sun(%x) s:b:d:f(%02x:%02x:%02x:%02x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun);
-               print_slot_resources(aps);
-               i = aps->dev;
-       }
-
-       if (ab->child)
-               print_acpi_resources (ab->child);
-
-       if (ab->next)
-               print_acpi_resources (ab->next);
-
-       return 0;
-}
-
-int pciehprm_print_pirt(void)
-{
-       dbg("PCIEHPRM ACPI Slots\n");
-       if (acpi_bridges_head)
-               print_acpi_resources (acpi_bridges_head);
-
-       return 0;
-}
-
-static struct acpi_php_slot * get_acpi_slot (
-       struct acpi_bridge *ab,
-       u32 sun
-       )
-{
-       struct acpi_php_slot    *aps = NULL;
-
-       for ( aps = ab->slots; aps; aps = aps->next)
-               if (aps->sun == sun)
-                       return aps;
-
-       if (!aps && ab->child) {
-               aps = (struct acpi_php_slot *)get_acpi_slot (ab->child, sun);
-               if (aps)
-                       return aps;
-       }
-
-       if (!aps && ab->next) {
-               aps = (struct acpi_php_slot *)get_acpi_slot (ab->next, sun);
-               if (aps)
-                       return aps;
-       }
-
-       return aps;
-
-}
-
-#if 0
-void * pciehprm_get_slot(struct slot *slot)
-{
-       struct acpi_bridge      *ab = acpi_bridges_head;
-       struct acpi_php_slot    *aps = get_acpi_slot (ab, slot->number);
-
-       aps->slot = slot;
-
-       dbg("Got acpi slot sun(%x): s:b:d:f(%x:%x:%x:%x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun);
-
-       return (void *)aps;
-}
-#endif
-
-static void pciehprm_dump_func_res( struct pci_func *fun)
-{
-       struct pci_func *func = fun;
-
-       if (func->bus_head) {
-               dbg(":    BUS Resources:\n");
-               print_pci_resource (func->bus_head);
-       }
-       if (func->io_head) {
-               dbg(":    IO Resources:\n");
-               print_pci_resource (func->io_head);
-       }
-       if (func->mem_head) {
-               dbg(":    MEM Resources:\n");
-               print_pci_resource (func->mem_head);
-       }
-       if (func->p_mem_head) {
-               dbg(":    PMEM Resources:\n");
-               print_pci_resource (func->p_mem_head);
-       }
-}
-
-static void pciehprm_dump_ctrl_res( struct controller *ctlr)
-{
-       struct controller *ctrl = ctlr;
-
-       if (ctrl->bus_head) {
-               dbg(":    BUS Resources:\n");
-               print_pci_resource (ctrl->bus_head);
-       }
-       if (ctrl->io_head) {
-               dbg(":    IO Resources:\n");
-               print_pci_resource (ctrl->io_head);
-       }
-       if (ctrl->mem_head) {
-               dbg(":    MEM Resources:\n");
-               print_pci_resource (ctrl->mem_head);
-       }
-       if (ctrl->p_mem_head) {
-               dbg(":    PMEM Resources:\n");
-               print_pci_resource (ctrl->p_mem_head);
-       }
-}
-
-static int pciehprm_get_used_resources (
-       struct controller *ctrl,
-       struct pci_func *func
-       )
-{
-       return pciehp_save_used_resources (ctrl, func, !DISABLE_CARD);
-}
-
-static int configure_existing_function(
-       struct controller *ctrl,
-       struct pci_func *func
-       )
-{
-       int rc;
-
-       /* see how much resources the func has used. */
-       rc = pciehprm_get_used_resources (ctrl, func);
-
-       if (!rc) {
-               /* subtract the resources used by the func from ctrl resources */
-               rc  = pciehprm_delete_resources (&ctrl->bus_head, func->bus_head);
-               rc |= pciehprm_delete_resources (&ctrl->io_head, func->io_head);
-               rc |= pciehprm_delete_resources (&ctrl->mem_head, func->mem_head);
-               rc |= pciehprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head);
-               if (rc)
-                       warn("aCEF: cannot del used resources\n");
-       } else
-               err("aCEF: cannot get used resources\n");
-
-       return rc;
-}
-
-static int bind_pci_resources_to_slots ( struct controller *ctrl)
-{
-       struct pci_func *func, new_func;
-       int busn = ctrl->slot_bus;
-       int devn, funn;
-       u32     vid;
-
-       for (devn = 0; devn < 32; devn++) {
-               for (funn = 0; funn < 8; funn++) {
-                       /*
-                       if (devn == ctrl->device && funn == ctrl->function)
-                               continue;
-                       */
-                       /* find out if this entry is for an occupied slot */
-                       vid = 0xFFFFFFFF;
-                       pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid);
-
-                       if (vid != 0xFFFFFFFF) {
-                               dbg("%s: vid = %x\n", __FUNCTION__, vid);
-                               func = pciehp_slot_find(busn, devn, funn);
-                               if (!func) {
-                                       memset(&new_func, 0, sizeof(struct pci_func));
-                                       new_func.bus = busn;
-                                       new_func.device = devn;
-                                       new_func.function = funn;
-                                       new_func.is_a_board = 1;
-                                       configure_existing_function(ctrl, &new_func);
-                                       pciehprm_dump_func_res(&new_func);
-                               } else {
-                                       configure_existing_function(ctrl, func);
-                                       pciehprm_dump_func_res(func);
-                               }
-                               dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus);
-                       }
-               }
-       }
-
-       return 0;
-}
-
-static int bind_pci_resources(
-       struct controller       *ctrl,
-       struct acpi_bridge      *ab
-       )
-{
-       int             status = 0;
-
-       if (ab->bus_head) {
-               dbg("bapr:  BUS Resources add on PCI 0x%x\n", ab->bus);
-               status = pciehprm_add_resources (&ctrl->bus_head, ab->bus_head);
-               if (pciehprm_delete_resources (&ab->bus_head, ctrl->bus_head))
-                       warn("bapr:  cannot sub BUS Resource on PCI 0x%x\n", ab->bus);
-               if (status) {
-                       err("bapr:  BUS Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status);
-                       return status;
-               }
-       } else
-               info("bapr:  No BUS Resource on PCI 0x%x.\n", ab->bus);
-
-       if (ab->io_head) {
-               dbg("bapr:  IO Resources add on PCI 0x%x\n", ab->bus);
-               status = pciehprm_add_resources (&ctrl->io_head, ab->io_head);
-               if (pciehprm_delete_resources (&ab->io_head, ctrl->io_head))
-                       warn("bapr:  cannot sub IO Resource on PCI 0x%x\n", ab->bus);
-               if (status) {
-                       err("bapr:  IO Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status);
-                       return status;
-               }
-       } else
-               info("bapr:  No  IO Resource on PCI 0x%x.\n", ab->bus);
-
-       if (ab->mem_head) {
-               dbg("bapr:  MEM Resources add on PCI 0x%x\n", ab->bus);
-               status = pciehprm_add_resources (&ctrl->mem_head, ab->mem_head);
-               if (pciehprm_delete_resources (&ab->mem_head, ctrl->mem_head))
-                       warn("bapr:  cannot sub MEM Resource on PCI 0x%x\n", ab->bus);
-               if (status) {
-                       err("bapr:  MEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status);
-                       return status;
-               }
-       } else
-               info("bapr:  No MEM Resource on PCI 0x%x.\n", ab->bus);
-
-       if (ab->p_mem_head) {
-               dbg("bapr:  PMEM Resources add on PCI 0x%x\n", ab->bus);
-               status = pciehprm_add_resources (&ctrl->p_mem_head, ab->p_mem_head);
-               if (pciehprm_delete_resources (&ab->p_mem_head, ctrl->p_mem_head))
-                       warn("bapr:  cannot sub PMEM Resource on PCI 0x%x\n", ab->bus);
-               if (status) {
-                       err("bapr:  PMEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status);
-                       return status;
-               }
-       } else
-               info("bapr:  No PMEM Resource on PCI 0x%x.\n", ab->bus);
-
-       return status;
-}
-
-static int no_pci_resources( struct acpi_bridge *ab)
-{
-       return !(ab->p_mem_head || ab->mem_head || ab->io_head || ab->bus_head);
-}
-
-static int find_pci_bridge_resources (
-       struct controller *ctrl,
-       struct acpi_bridge *ab
-       )
-{
-       int     rc = 0;
-       struct pci_func func;
-
-       memset(&func, 0, sizeof(struct pci_func));
-
-       func.bus = ab->pbus;
-       func.device = ab->pdevice;
-       func.function = ab->pfunction;
-       func.is_a_board = 1;
-
-       /* Get used resources for this PCI bridge */
-       rc = pciehp_save_used_resources (ctrl, &func, !DISABLE_CARD);
-
-       ab->io_head = func.io_head;
-       ab->mem_head = func.mem_head;
-       ab->p_mem_head = func.p_mem_head;
-       ab->bus_head = func.bus_head;
-       if (ab->bus_head)
-               pciehprm_delete_resource(&ab->bus_head, ctrl->pci_dev->subordinate->number, 1);
-
-       return rc;
-}
-
-static int get_pci_resources_from_bridge(
-       struct controller *ctrl,
-       struct acpi_bridge *ab
-       )
-{
-       int     rc = 0;
-
-       dbg("grfb:  Get Resources for PCI 0x%x from actual PCI bridge 0x%x.\n", ctrl->bus, ab->bus);
-
-       rc = find_pci_bridge_resources (ctrl, ab);
-
-       pciehp_resource_sort_and_combine(&ab->bus_head);
-       pciehp_resource_sort_and_combine(&ab->io_head);
-       pciehp_resource_sort_and_combine(&ab->mem_head);
-       pciehp_resource_sort_and_combine(&ab->p_mem_head);
-
-       pciehprm_add_resources (&ab->tbus_head, ab->bus_head);
-       pciehprm_add_resources (&ab->tio_head, ab->io_head);
-       pciehprm_add_resources (&ab->tmem_head, ab->mem_head);
-       pciehprm_add_resources (&ab->tp_mem_head, ab->p_mem_head);
-
-       return rc;
-}
-
-static int get_pci_resources(
-       struct controller       *ctrl,
-       struct acpi_bridge      *ab
-       )
-{
-       int     rc = 0;
-
-       if (no_pci_resources(ab)) {
-               dbg("spbr:PCI 0x%x has no resources. Get parent resources.\n", ab->bus);
-               rc = get_pci_resources_from_bridge(ctrl, ab);
-       }
-
-       return rc;
-}
-
-/*
- * Get resources for this ctrl.
- *  1. get total resources from ACPI _CRS or bridge (this ctrl)
- *  2. find used resources of existing adapters
- *     3. subtract used resources from total resources
- */
-int pciehprm_find_available_resources( struct controller *ctrl)
-{
-       int rc = 0;
-       struct acpi_bridge      *ab;
-
-       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->pci_dev->subordinate->number);
-       if (!ab) {
-               err("pfar:cannot locate acpi bridge of PCI 0x%x.\n", ctrl->pci_dev->subordinate->number);
-               return -1;
-       }
-       if (no_pci_resources(ab)) {
-               rc = get_pci_resources(ctrl, ab);
-               if (rc) {
-                       err("pfar:cannot get pci resources of PCI 0x%x.\n", ctrl->pci_dev->subordinate->number);
-                       return -1;
-               }
-       }
-
-       rc = bind_pci_resources(ctrl, ab);
-       dbg("pfar:pre-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number);
-       pciehprm_dump_ctrl_res(ctrl);
-
-       bind_pci_resources_to_slots (ctrl);
-
-       dbg("pfar:post-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number);
-       pciehprm_dump_ctrl_res(ctrl);
-
-       return rc;
-}
-
-int pciehprm_set_hpp(
-       struct controller *ctrl,
-       struct pci_func *func,
-       u8      card_type
-       )
-{
-       struct acpi_bridge      *ab;
-       struct pci_bus lpci_bus, *pci_bus;
-       int                             rc = 0;
-       unsigned int    devfn;
-       u8                              cls= 0x08;      /* default cache line size      */
-       u8                              lt = 0x40;      /* default latency timer        */
-       u8                              ep = 0;
-       u8                              es = 0;
-
-       memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
-
-       if (ab) {
-               if (ab->_hpp) {
-                       lt  = (u8)ab->_hpp->latency_timer;
-                       cls = (u8)ab->_hpp->cache_line_size;
-                       ep  = (u8)ab->_hpp->enable_perr;
-                       es  = (u8)ab->_hpp->enable_serr;
-               } else
-                       dbg("_hpp: no _hpp for B/D/F=%#x/%#x/%#x. use default value\n", func->bus, func->device, func->function);
-       } else
-               dbg("_hpp: no acpi bridge for B/D/F = %#x/%#x/%#x. use default value\n", func->bus, func->device, func->function);
-
-
-       if (card_type == PCI_HEADER_TYPE_BRIDGE) {
-               /* set subordinate Latency Timer */
-               rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, lt);
+       while (pdev && (ACPI_FAILURE(status))) {
+               acpi_handle handle = DEVICE_ACPI_HANDLE(&(pdev->dev));
+               if (!handle)
+                       break;
+               status = acpi_run_hpp(handle, hpp);
+               if (!(pdev->bus->parent))
+                       break;
+               /* Check if a parent object supports _HPP */
+               pdev = pdev->bus->parent->self;
        }
-
-       /* set base Latency Timer */
-       rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, lt);
-       dbg("  set latency timer  =0x%02x: %x\n", lt, rc);
-
-       rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, cls);
-       dbg("  set cache_line_size=0x%02x: %x\n", cls, rc);
-
-       return rc;
 }
 
-void pciehprm_enable_card(
-       struct controller *ctrl,
-       struct pci_func *func,
-       u8 card_type)
-{
-       u16 command, cmd, bcommand, bcmd;
-       struct pci_bus lpci_bus, *pci_bus;
-       struct acpi_bridge      *ab;
-       unsigned int devfn;
-       int rc;
-
-       memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &cmd);
-
-       if (card_type == PCI_HEADER_TYPE_BRIDGE) {
-               rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcmd);
-       }
-
-       command  = cmd | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE
-               | PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
-       bcommand  = bcmd | PCI_BRIDGE_CTL_NO_ISA;
-
-       ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
-       if (ab) {
-               if (ab->_hpp) {
-                       if (ab->_hpp->enable_perr) {
-                               command |= PCI_COMMAND_PARITY;
-                               bcommand |= PCI_BRIDGE_CTL_PARITY;
-                       } else {
-                               command &= ~PCI_COMMAND_PARITY;
-                               bcommand &= ~PCI_BRIDGE_CTL_PARITY;
-                       }
-                       if (ab->_hpp->enable_serr) {
-                               command |= PCI_COMMAND_SERR;
-                               bcommand |= PCI_BRIDGE_CTL_SERR;
-                       } else {
-                               command &= ~PCI_COMMAND_SERR;
-                               bcommand &= ~PCI_BRIDGE_CTL_SERR;
-                       }
-               } else
-                       dbg("no _hpp for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function);
-       } else
-               dbg("no acpi bridge for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function);
-
-       if (command != cmd) {
-               rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command);
-       }
-       if ((card_type == PCI_HEADER_TYPE_BRIDGE) && (bcommand != bcmd)) {
-               rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand);
-       }
-}
index 76c727c74cc014c456b4c57c713c7a47a414a136..29180dfe8493d39bf877b94a744bc7d91c6cb6dd 100644 (file)
  *
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/sched.h>
 #include <linux/pci.h>
-#include <linux/init.h>
 #include <linux/slab.h>
-
-#include <asm/uaccess.h>
-#ifdef CONFIG_IA64
-#include <asm/iosapic.h>
-#endif
-
 #include "pciehp.h"
-#include "pciehprm.h"
-#include "pciehprm_nonacpi.h"
-
 
-void pciehprm_cleanup(void)
+void pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
+               struct hotplug_params *hpp)
 {
        return;
 }
 
-int pciehprm_print_pirt(void)
-{
-       return 0;
-}
-
-int pciehprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busnum, u8 devnum)
-{
-
-       *sun = (u8) (ctrl->first_slot);
-       return 0;
-}
-
-
-static void print_pci_resource ( struct pci_resource   *aprh)
-{
-       struct pci_resource     *res;
-
-       for (res = aprh; res; res = res->next)
-               dbg("        base= 0x%x length= 0x%x\n", res->base, res->length);
-}
-
-
-static void phprm_dump_func_res( struct pci_func *fun)
-{
-       struct pci_func *func = fun;
-
-       if (func->bus_head) {
-               dbg(":    BUS Resources:\n");
-               print_pci_resource (func->bus_head);
-       }
-       if (func->io_head) {
-               dbg(":    IO Resources:\n");
-               print_pci_resource (func->io_head);
-       }
-       if (func->mem_head) {
-               dbg(":    MEM Resources:\n");
-               print_pci_resource (func->mem_head);
-       }
-       if (func->p_mem_head) {
-               dbg(":    PMEM Resources:\n");
-               print_pci_resource (func->p_mem_head);
-       }
-}
-
-static int phprm_get_used_resources (
-       struct controller *ctrl,
-       struct pci_func *func
-       )
-{
-       return pciehp_save_used_resources (ctrl, func, !DISABLE_CARD);
-}
-
-static int phprm_delete_resource(
-       struct pci_resource **aprh,
-       ulong base,
-       ulong size)
-{
-       struct pci_resource *res;
-       struct pci_resource *prevnode;
-       struct pci_resource *split_node;
-       ulong tbase;
-
-       pciehp_resource_sort_and_combine(aprh);
-
-       for (res = *aprh; res; res = res->next) {
-               if (res->base > base)
-                       continue;
-
-               if ((res->base + res->length) < (base + size))
-                       continue;
-
-               if (res->base < base) {
-                       tbase = base;
-
-                       if ((res->length - (tbase - res->base)) < size)
-                               continue;
-
-                       split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base;
-                       split_node->length = tbase - res->base;
-                       res->base = tbase;
-                       res->length -= split_node->length;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (res->length >= size) {
-                       split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base + size;
-                       split_node->length = res->length - size;
-                       res->length = size;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (*aprh == res) {
-                       *aprh = res->next;
-               } else {
-                       prevnode = *aprh;
-                       while (prevnode->next != res)
-                               prevnode = prevnode->next;
-
-                       prevnode->next = res->next;
-               }
-               res->next = NULL;
-               kfree(res);
-               break;
-       }
-
-       return 0;
-}
-
-
-static int phprm_delete_resources(
-       struct pci_resource **aprh,
-       struct pci_resource *this
-       )
-{
-       struct pci_resource *res;
-
-       for (res = this; res; res = res->next)
-               phprm_delete_resource(aprh, res->base, res->length);
-
-       return 0;
-}
-
-
-static int configure_existing_function(
-       struct controller *ctrl,
-       struct pci_func *func
-       )
-{
-       int rc;
-
-       /* see how much resources the func has used. */
-       rc = phprm_get_used_resources (ctrl, func);
-
-       if (!rc) {
-               /* subtract the resources used by the func from ctrl resources */
-               rc  = phprm_delete_resources (&ctrl->bus_head, func->bus_head);
-               rc |= phprm_delete_resources (&ctrl->io_head, func->io_head);
-               rc |= phprm_delete_resources (&ctrl->mem_head, func->mem_head);
-               rc |= phprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head);
-               if (rc)
-                       warn("aCEF: cannot del used resources\n");
-       } else
-               err("aCEF: cannot get used resources\n");
-
-       return rc;
-}
-
-static int pciehprm_delete_resource(
-       struct pci_resource **aprh,
-       ulong base,
-       ulong size)
-{
-       struct pci_resource *res;
-       struct pci_resource *prevnode;
-       struct pci_resource *split_node;
-       ulong tbase;
-
-       pciehp_resource_sort_and_combine(aprh);
-
-       for (res = *aprh; res; res = res->next) {
-               if (res->base > base)
-                       continue;
-
-               if ((res->base + res->length) < (base + size))
-                       continue;
-
-               if (res->base < base) {
-                       tbase = base;
-
-                       if ((res->length - (tbase - res->base)) < size)
-                               continue;
-
-                       split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base;
-                       split_node->length = tbase - res->base;
-                       res->base = tbase;
-                       res->length -= split_node->length;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (res->length >= size) {
-                       split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL);
-                       if (!split_node)
-                               return -ENOMEM;
-
-                       split_node->base = res->base + size;
-                       split_node->length = res->length - size;
-                       res->length = size;
-
-                       split_node->next = res->next;
-                       res->next = split_node;
-               }
-
-               if (*aprh == res) {
-                       *aprh = res->next;
-               } else {
-                       prevnode = *aprh;
-                       while (prevnode->next != res)
-                               prevnode = prevnode->next;
-
-                       prevnode->next = res->next;
-               }
-               res->next = NULL;
-               kfree(res);
-               break;
-       }
-
-       return 0;
-}
-
-static int bind_pci_resources_to_slots ( struct controller *ctrl)
+int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev)
 {
-       struct pci_func *func, new_func;
-       int busn = ctrl->slot_bus;
-       int devn, funn;
-       u32     vid;
-
-       for (devn = 0; devn < 32; devn++) {
-               for (funn = 0; funn < 8; funn++) {
-                       /*
-                       if (devn == ctrl->device && funn == ctrl->function)
-                               continue;
-                       */
-                       /* find out if this entry is for an occupied slot */
-                       vid = 0xFFFFFFFF;
-
-                       pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid);
-
-                       if (vid != 0xFFFFFFFF) {
-                               dbg("%s: vid = %x bus %x dev %x fun %x\n", __FUNCTION__,
-                               vid, busn, devn, funn);
-                               func = pciehp_slot_find(busn, devn, funn);
-                               dbg("%s: func = %p\n", __FUNCTION__,func);
-                               if (!func) {
-                                       memset(&new_func, 0, sizeof(struct pci_func));
-                                       new_func.bus = busn;
-                                       new_func.device = devn;
-                                       new_func.function = funn;
-                                       new_func.is_a_board = 1;
-                                       configure_existing_function(ctrl, &new_func);
-                                       phprm_dump_func_res(&new_func);
-                               } else {
-                                       configure_existing_function(ctrl, func);
-                                       phprm_dump_func_res(func);
-                               }
-                               dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus);
-                       }
-               }
-       }
-
        return 0;
 }
-
-static void phprm_dump_ctrl_res( struct controller *ctlr)
-{
-       struct controller *ctrl = ctlr;
-
-       if (ctrl->bus_head) {
-               dbg(":    BUS Resources:\n");
-               print_pci_resource (ctrl->bus_head);
-       }
-       if (ctrl->io_head) {
-               dbg(":    IO Resources:\n");
-               print_pci_resource (ctrl->io_head);
-       }
-       if (ctrl->mem_head) {
-               dbg(":    MEM Resources:\n");
-               print_pci_resource (ctrl->mem_head);
-       }
-       if (ctrl->p_mem_head) {
-               dbg(":    PMEM Resources:\n");
-               print_pci_resource (ctrl->p_mem_head);
-       }
-}
-
-/*
- * phprm_find_available_resources
- *
- *  Finds available memory, IO, and IRQ resources for programming
- *  devices which may be added to the system
- *  this function is for hot plug ADD!
- *
- * returns 0 if success
- */
-int pciehprm_find_available_resources(struct controller *ctrl)
-{
-       struct pci_func func;
-       u32 rc;
-
-       memset(&func, 0, sizeof(struct pci_func));
-
-       func.bus = ctrl->bus;
-       func.device = ctrl->device;
-       func.function = ctrl->function;
-       func.is_a_board = 1;
-
-       /* Get resources for this PCI bridge */
-       rc = pciehp_save_used_resources (ctrl, &func, !DISABLE_CARD);
-       dbg("%s: pciehp_save_used_resources rc = %d\n", __FUNCTION__, rc);
-
-       if (func.mem_head)
-               func.mem_head->next = ctrl->mem_head;
-       ctrl->mem_head = func.mem_head;
-
-       if (func.p_mem_head)
-               func.p_mem_head->next = ctrl->p_mem_head;
-       ctrl->p_mem_head = func.p_mem_head;
-
-       if (func.io_head)
-               func.io_head->next = ctrl->io_head;
-       ctrl->io_head = func.io_head;
-
-       if(func.bus_head)
-               func.bus_head->next = ctrl->bus_head;
-       ctrl->bus_head = func.bus_head;
-
-       if (ctrl->bus_head)
-               pciehprm_delete_resource(&ctrl->bus_head, ctrl->pci_dev->subordinate->number, 1);
-       
-       dbg("%s:pre-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus);
-       phprm_dump_ctrl_res(ctrl);
-
-       dbg("%s: before bind_pci_resources_to slots\n", __FUNCTION__);
-
-       bind_pci_resources_to_slots (ctrl);
-
-       dbg("%s:post-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus);
-       phprm_dump_ctrl_res(ctrl);
-
-       return (rc);
-}
-
-int pciehprm_set_hpp(
-       struct controller *ctrl,
-       struct pci_func *func,
-       u8      card_type)
-{
-       u32 rc;
-       u8 temp_byte;
-       struct pci_bus lpci_bus, *pci_bus;
-       unsigned int    devfn;
-       memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       temp_byte = 0x40;       /* hard coded value for LT */
-       if (card_type == PCI_HEADER_TYPE_BRIDGE) {
-               /* set subordinate Latency Timer */
-               rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, temp_byte);
-
-               if (rc) {
-                       dbg("%s: set secondary LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, 
-                               func->bus, func->device, func->function);
-                       return rc;
-               }
-       }
-
-       /* set base Latency Timer */
-       rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, temp_byte);
-
-       if (rc) {
-               dbg("%s: set LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function);
-               return rc;
-       }
-
-       /* set Cache Line size */
-       temp_byte = 0x08;       /* hard coded value for CLS */
-
-       rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, temp_byte);
-
-       if (rc) {
-               dbg("%s: set CLS error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function);
-       }
-
-       /* set enable_perr */
-       /* set enable_serr */
-
-       return rc;
-}
-
-void pciehprm_enable_card(
-       struct controller *ctrl,
-       struct pci_func *func,
-       u8 card_type)
-{
-       u16 command, bcommand;
-       struct pci_bus lpci_bus, *pci_bus;
-       unsigned int devfn;
-       int rc;
-
-       memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus));
-       pci_bus = &lpci_bus;
-       pci_bus->number = func->bus;
-       devfn = PCI_DEVFN(func->device, func->function);
-
-       rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command);
-
-       command |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR
-               | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE
-               | PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
-
-       rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command);
-
-       if (card_type == PCI_HEADER_TYPE_BRIDGE) {
-
-               rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand);
-
-               bcommand |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR
-                       | PCI_BRIDGE_CTL_NO_ISA;
-
-               rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand);
-       }
-}
-
-static int legacy_pciehprm_init_pci(void)
-{
-       return 0;
-}
-
-int pciehprm_init(enum php_ctlr_type ctrl_type)
-{
-       int retval;
-
-       switch (ctrl_type) {
-       case PCI:
-               retval = legacy_pciehprm_init_pci();
-               break;
-       default:
-               retval = -ENODEV;
-               break;
-       }
-
-       return retval;
-}
diff --git a/drivers/pci/hotplug/pciehprm_nonacpi.h b/drivers/pci/hotplug/pciehprm_nonacpi.h
deleted file mode 100644 (file)
index b10603b..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * PCIEHPRM NONACPI: PHP Resource Manager for Non-ACPI/Legacy platform
- *
- * Copyright (C) 1995,2001 Compaq Computer Corporation
- * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
- * Copyright (C) 2001 IBM Corp.
- * Copyright (C) 2003-2004 Intel Corporation
- *
- * All rights reserved.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com>
- *
- */
-
-#ifndef _PCIEHPRM_NONACPI_H_
-#define _PCIEHPRM_NONACPI_H_
-
-struct irq_info {
-       u8 bus, devfn;          /* bus, device and function */
-       struct {
-               u8 link;        /* IRQ line ID, chipset dependent, 0=not routed */
-               u16 bitmap;     /* Available IRQs */
-       } __attribute__ ((packed)) irq[4];
-       u8 slot;                /* slot number, 0=onboard */
-       u8 rfu;
-} __attribute__ ((packed));
-
-struct irq_routing_table {
-       u32 signature;          /* PIRQ_SIGNATURE should be here */
-       u16 version;            /* PIRQ_VERSION */
-       u16 size;                       /* Table size in bytes */
-       u8 rtr_bus, rtr_devfn;  /* Where the interrupt router lies */
-       u16 exclusive_irqs;     /* IRQs devoted exclusively to PCI usage */
-       u16 rtr_vendor, rtr_device;     /* Vendor and device ID of interrupt router */
-       u32 miniport_data;      /* Crap */
-       u8 rfu[11];
-       u8 checksum;            /* Modulo 256 checksum must give zero */
-       struct irq_info slots[0];
-} __attribute__ ((packed));
-
-#endif                         /* _PCIEHPRM_NONACPI_H_ */
index e8593a60ee89d001e928adc737cbd3c638aa0de7..cc03609f45d02947095e214b5cde11cb8868deee 100644 (file)
@@ -134,43 +134,6 @@ static void rpadlpar_claim_one_bus(struct pci_bus *b)
                rpadlpar_claim_one_bus(child_bus);
 }
 
-static int pci_add_secondary_bus(struct device_node *dn,
-               struct pci_dev *bridge_dev)
-{
-       struct pci_dn *pdn = dn->data;
-       struct pci_controller *hose = pdn->phb;
-       struct pci_bus *child;
-       u8 sec_busno;
-
-       /* Get busno of downstream bus */
-       pci_read_config_byte(bridge_dev, PCI_SECONDARY_BUS, &sec_busno);
-
-       /* Allocate and add to children of bridge_dev->bus */
-       child = pci_add_new_bus(bridge_dev->bus, bridge_dev, sec_busno);
-       if (!child) {
-               printk(KERN_ERR "%s: could not add secondary bus\n", __FUNCTION__);
-               return -ENOMEM;
-       }
-
-       sprintf(child->name, "PCI Bus #%02x", child->number);
-
-       /* Fixup subordinate bridge bases and resources */
-       pcibios_fixup_bus(child);
-
-       /* Claim new bus resources */
-       rpadlpar_claim_one_bus(bridge_dev->bus);
-
-       if (hose->last_busno < child->number)
-               hose->last_busno = child->number;
-
-       pdn->bussubno = child->number;
-
-       /* ioremap() for child bus, which may or may not succeed */
-       remap_bus_range(child);
-
-       return 0;
-}
-
 static struct pci_dev *dlpar_find_new_dev(struct pci_bus *parent,
                                        struct device_node *dev_dn)
 {
@@ -188,29 +151,41 @@ static struct pci_dev *dlpar_find_new_dev(struct pci_bus *parent,
 static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
 {
        struct pci_dn *pdn = dn->data;
-       struct pci_controller *hose = pdn->phb;
+       struct pci_controller *phb = pdn->phb;
        struct pci_dev *dev = NULL;
 
-       /* Scan phb bus for EADS device, adding new one to bus->devices */
-       if (!pci_scan_single_device(hose->bus, pdn->devfn)) {
-               printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__);
+       rpaphp_eeh_init_nodes(dn);
+       /* Add EADS device to PHB bus, adding new entry to bus->devices */
+       dev = of_create_pci_dev(dn, phb->bus, pdn->devfn);
+       if (!dev) {
+               printk(KERN_ERR "%s: failed to create pci dev for %s\n",
+                               __FUNCTION__, dn->full_name);
                return NULL;
        }
 
+       if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
+           dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
+               of_scan_pci_bridge(dn, dev);
+
+       rpaphp_init_new_devs(dev->subordinate);
+
+       /* Claim new bus resources */
+       rpadlpar_claim_one_bus(dev->bus);
+
+       /* ioremap() for child bus, which may or may not succeed */
+       (void) remap_bus_range(dev->bus);
+
        /* Add new devices to global lists.  Register in proc, sysfs. */
-       pci_bus_add_devices(hose->bus);
+       pci_bus_add_devices(phb->bus);
 
        /* Confirm new bridge dev was created */
-       dev = dlpar_find_new_dev(hose->bus, dn);
+       dev = dlpar_find_new_dev(phb->bus, dn);
        if (dev) {
                if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
                        printk(KERN_ERR "%s: unexpected header type %d\n",
                                __FUNCTION__, dev->hdr_type);
                        return NULL;
                }
-
-               if (pci_add_secondary_bus(dn, dev))
-                       return NULL;
        }
 
        return dev;
@@ -219,7 +194,6 @@ static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
 static int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
 {
        struct pci_dev *dev;
-       int rc;
 
        if (rpaphp_find_pci_bus(dn))
                return -EINVAL;
@@ -232,15 +206,6 @@ static int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
                return -EIO;
        }
 
-       if (dn->child) {
-               rc = rpaphp_config_pci_adapter(dev->subordinate);
-               if (rc < 0) {
-                       printk(KERN_ERR "%s: unable to enable slot %s\n",
-                               __FUNCTION__, drc_name);
-                       return -EIO;
-               }
-       }
-
        /* Add hotplug slot */
        if (rpaphp_add_slot(dn)) {
                printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
@@ -435,6 +400,8 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
                                __FUNCTION__, drc_name);
                        return -EIO;
                }
+       } else {
+               rpaphp_unconfig_pci_adapter(bus);
        }
 
        if (unmap_bus_range(bus)) {
index 71ea5f9bb28402270b42bce31edb2f02db8bf3ce..57ea71a7bda5049210b418cfb357a703a945a85c 100644 (file)
@@ -93,6 +93,8 @@ extern int rpaphp_claim_resource(struct pci_dev *dev, int resource);
 extern int rpaphp_enable_pci_slot(struct slot *slot);
 extern int register_pci_slot(struct slot *slot);
 extern int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value);
+extern void rpaphp_init_new_devs(struct pci_bus *bus);
+extern void rpaphp_eeh_init_nodes(struct device_node *dn);
 
 extern int rpaphp_config_pci_adapter(struct pci_bus *bus);
 extern int rpaphp_unconfig_pci_adapter(struct pci_bus *bus);
index f7c12d7dfcfc35bc164163672b60ef817bc23ff5..4b35097b3d9fba0201dca7e2bca9f6fa8eb07dd9 100644 (file)
@@ -154,8 +154,7 @@ exit:
 }
 
 /* Must be called before pci_bus_add_devices */
-static void 
-rpaphp_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
+void rpaphp_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
 {
        struct pci_dev *dev;
 
@@ -184,6 +183,20 @@ rpaphp_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
        }
 }
 
+static void rpaphp_eeh_add_bus_device(struct pci_bus *bus)
+{
+       struct pci_dev *dev;
+
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               eeh_add_device_late(dev);
+               if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
+                       struct pci_bus *subbus = dev->subordinate;
+                       if (subbus)
+                               rpaphp_eeh_add_bus_device (subbus);
+               }
+       }
+}
+
 static int rpaphp_pci_config_bridge(struct pci_dev *dev)
 {
        u8 sec_busno;
@@ -217,6 +230,13 @@ static int rpaphp_pci_config_bridge(struct pci_dev *dev)
        return 0;
 }
 
+void rpaphp_init_new_devs(struct pci_bus *bus)
+{
+       rpaphp_fixup_new_pci_devices(bus, 0);
+       rpaphp_eeh_add_bus_device(bus);
+}
+EXPORT_SYMBOL_GPL(rpaphp_init_new_devs);
+
 /*****************************************************************************
  rpaphp_pci_config_slot() will  configure all devices under the
  given slot->dn and return the the first pci_dev.
@@ -233,36 +253,51 @@ rpaphp_pci_config_slot(struct pci_bus *bus)
        if (!dn || !dn->child)
                return NULL;
 
-       slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
+       if (_machine == PLATFORM_PSERIES_LPAR) {
+               of_scan_bus(dn, bus);
+               if (list_empty(&bus->devices)) {
+                       err("%s: No new device found\n", __FUNCTION__);
+                       return NULL;
+               }
 
-       /* pci_scan_slot should find all children */
-       num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
-       if (num) {
-               rpaphp_fixup_new_pci_devices(bus, 1);
+               rpaphp_init_new_devs(bus);
                pci_bus_add_devices(bus);
-       }
-       if (list_empty(&bus->devices)) {
-               err("%s: No new device found\n", __FUNCTION__);
-               return NULL;
-       }
-       list_for_each_entry(dev, &bus->devices, bus_list) {
-               if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
-                       rpaphp_pci_config_bridge(dev);
+               dev = list_entry(&bus->devices, struct pci_dev, bus_list);
+       } else {
+               slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
+
+               /* pci_scan_slot should find all children */
+               num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
+               if (num) {
+                       rpaphp_fixup_new_pci_devices(bus, 1);
+                       pci_bus_add_devices(bus);
+               }
+               if (list_empty(&bus->devices)) {
+                       err("%s: No new device found\n", __FUNCTION__);
+                       return NULL;
+               }
+               list_for_each_entry(dev, &bus->devices, bus_list) {
+                       if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
+                               rpaphp_pci_config_bridge(dev);
+
+                       rpaphp_eeh_add_bus_device(bus);
+               }
        }
 
        return dev;
 }
 
-static void enable_eeh(struct device_node *dn)
+void rpaphp_eeh_init_nodes(struct device_node *dn)
 {
        struct device_node *sib;
 
        for (sib = dn->child; sib; sib = sib->sibling) 
-               enable_eeh(sib);
+               rpaphp_eeh_init_nodes(sib);
        eeh_add_device_early(dn);
        return;
        
 }
+EXPORT_SYMBOL_GPL(rpaphp_eeh_init_nodes);
 
 static void print_slot_pci_funcs(struct pci_bus *bus)
 {
@@ -289,7 +324,7 @@ int rpaphp_config_pci_adapter(struct pci_bus *bus)
        if (!dn)
                goto exit;
 
-       enable_eeh(dn);
+       rpaphp_eeh_init_nodes(dn);
        dev = rpaphp_pci_config_slot(bus);
        if (!dev) {
                err("%s: can't find any devices.\n", __FUNCTION__);
@@ -331,6 +366,7 @@ int rpaphp_unconfig_pci_adapter(struct pci_bus *bus)
        }
        return 0;
 }
+EXPORT_SYMBOL_GPL(rpaphp_unconfig_pci_adapter);
 
 static int setup_pci_hotplug_slot_info(struct slot *slot)
 {
@@ -444,8 +480,8 @@ int rpaphp_enable_pci_slot(struct slot *slot)
                retval = rpaphp_config_pci_adapter(slot->bus);
                if (!retval) {
                        slot->state = CONFIGURED;
-                       dbg("%s: PCI devices in slot[%s] has been configured\n", 
-                               __FUNCTION__, slot->name);
+                       info("%s: devices in slot[%s] configured\n",
+                                       __FUNCTION__, slot->name);
                } else {
                        slot->state = NOT_CONFIGURED;
                        dbg("%s: no pci_dev struct for adapter in slot[%s]\n",
index 40905a6c809414f34fe196c1cd5d2099c2ea2221..9987a6fd65b8522af288925b78fe30361b4f4eea 100644 (file)
@@ -31,6 +31,8 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/pci.h>
+#include <linux/interrupt.h>
+
 #include "shpchp.h"
 
 #ifdef DEBUG
index b8e95acea3b6abfe36527f4aca6ba2c9d0611ca1..38009bc0fd5de7e21668763a958e7554347ac1f8 100644 (file)
@@ -34,7 +34,7 @@
 #include "../pci.h"
 #include "shpchp.h"
 
-void program_fw_provided_values(struct pci_dev *dev)
+static void program_fw_provided_values(struct pci_dev *dev)
 {
        u16 pci_cmd, pci_bctl;
        struct pci_dev *cdev;
index a2033552423c48a3be1f77c763f463ea38a263c3..202b7507a357092906680bd9e937e7882e428324 100644 (file)
@@ -23,6 +23,8 @@
 #include "pci.h"
 #include "msi.h"
 
+#define MSI_TARGET_CPU         first_cpu(cpu_online_map)
+
 static DEFINE_SPINLOCK(msi_lock);
 static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL };
 static kmem_cache_t* msi_cachep;
@@ -92,6 +94,7 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
        struct msi_desc *entry;
        struct msg_address address;
        unsigned int irq = vector;
+       unsigned int dest_cpu = first_cpu(cpu_mask);
 
        entry = (struct msi_desc *)msi_desc[vector];
        if (!entry || !entry->dev)
@@ -108,9 +111,9 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
                pci_read_config_dword(entry->dev, msi_lower_address_reg(pos),
                        &address.lo_address.value);
                address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK;
-               address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) <<
-                       MSI_TARGET_CPU_SHIFT);
-               entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
+               address.lo_address.value |= (cpu_physical_id(dest_cpu) <<
+                                                                       MSI_TARGET_CPU_SHIFT);
+               entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu);
                pci_write_config_dword(entry->dev, msi_lower_address_reg(pos),
                        address.lo_address.value);
                set_native_irq_info(irq, cpu_mask);
@@ -123,9 +126,9 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
 
                address.lo_address.value = readl(entry->mask_base + offset);
                address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK;
-               address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) <<
-                       MSI_TARGET_CPU_SHIFT);
-               entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
+               address.lo_address.value |= (cpu_physical_id(dest_cpu) <<
+                                                                       MSI_TARGET_CPU_SHIFT);
+               entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu);
                writel(address.lo_address.value, entry->mask_base + offset);
                set_native_irq_info(irq, cpu_mask);
                break;
@@ -259,14 +262,15 @@ static void msi_data_init(struct msg_data *msi_data,
 static void msi_address_init(struct msg_address *msi_address)
 {
        unsigned int    dest_id;
+       unsigned long   dest_phys_id = cpu_physical_id(MSI_TARGET_CPU);
 
        memset(msi_address, 0, sizeof(struct msg_address));
        msi_address->hi_address = (u32)0;
        dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT);
-       msi_address->lo_address.u.dest_mode = MSI_DEST_MODE;
+       msi_address->lo_address.u.dest_mode = MSI_PHYSICAL_MODE;
        msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE;
        msi_address->lo_address.u.dest_id = dest_id;
-       msi_address->lo_address.value |= (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT);
+       msi_address->lo_address.value |= (dest_phys_id << MSI_TARGET_CPU_SHIFT);
 }
 
 static int msi_free_vector(struct pci_dev* dev, int vector, int reassign);
index e9e37abe1f76447510d9ad9857e8f481a677696e..a9b00cc2d8850da7d958b8fbc1e13119894fe06d 100644 (file)
@@ -91,9 +91,7 @@ acpi_query_osc (
 static acpi_status  
 acpi_run_osc (
        acpi_handle     handle,
-       u32             level,
-       void            *context,
-       void            **retval )
+       void            *context)
 {
        acpi_status             status;
        struct acpi_object_list input;
@@ -184,7 +182,7 @@ EXPORT_SYMBOL(pci_osc_support_set);
  *
  * Attempt to take control from Firmware on requested control bits.
  **/
-acpi_status pci_osc_control_set(u32 flags)
+acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
 {
        acpi_status     status;
        u32             ctrlset;
@@ -198,10 +196,7 @@ acpi_status pci_osc_control_set(u32 flags)
                return AE_SUPPORT;
        }
        ctrlset_buf[OSC_CONTROL_TYPE] |= ctrlset;
-       status = acpi_get_devices ( PCI_ROOT_HID_STRING,
-                               acpi_run_osc,
-                               ctrlset_buf,
-                               NULL );
+       status = acpi_run_osc(handle, ctrlset_buf);
        if (ACPI_FAILURE (status)) {
                ctrlset_buf[OSC_CONTROL_TYPE] &= ~ctrlset;
        }
index 94e68c54d27397bf06c56b32d7539c927b8dcf41..a9046d4b8af32f99f42733fb7493d9adae1368b2 100644 (file)
@@ -37,7 +37,7 @@ struct pci_dynid {
  * Adds a new dynamic pci device ID to this driver,
  * and causes the driver to probe for all devices again.
  */
-static inline ssize_t
+static ssize_t
 store_new_id(struct device_driver *driver, const char *buf, size_t count)
 {
        struct pci_dynid *dynid;
@@ -364,15 +364,16 @@ static struct kobj_type pci_driver_kobj_type = {
 };
 
 /**
- * pci_register_driver - register a new pci driver
+ * __pci_register_driver - register a new pci driver
  * @drv: the driver structure to register
+ * @owner: owner module of drv
  * 
  * Adds the driver structure to the list of registered drivers.
  * Returns a negative value on error, otherwise 0. 
  * If no error occurred, the driver remains registered even if 
  * no device was claimed during registration.
  */
-int pci_register_driver(struct pci_driver *drv)
+int __pci_register_driver(struct pci_driver *drv, struct module *owner)
 {
        int error;
 
@@ -389,7 +390,7 @@ int pci_register_driver(struct pci_driver *drv)
                printk(KERN_WARNING "Warning: PCI driver %s has a struct "
                        "device_driver shutdown method, please update!\n",
                        drv->name);
-       drv->driver.owner = drv->owner;
+       drv->driver.owner = owner;
        drv->driver.kobj.ktype = &pci_driver_kobj_type;
 
        spin_lock_init(&drv->dynids.lock);
@@ -526,7 +527,7 @@ postcore_initcall(pci_driver_init);
 
 EXPORT_SYMBOL(pci_match_id);
 EXPORT_SYMBOL(pci_match_device);
-EXPORT_SYMBOL(pci_register_driver);
+EXPORT_SYMBOL(__pci_register_driver);
 EXPORT_SYMBOL(pci_unregister_driver);
 EXPORT_SYMBOL(pci_dev_driver);
 EXPORT_SYMBOL(pci_bus_type);
index e74d75843047c24cf299cf53daad16635355d640..8e287a828d5d3c1886d91e5e122ea544a7fc446c 100644 (file)
@@ -63,11 +63,38 @@ pci_max_busnr(void)
        return max;
 }
 
+static int __pci_find_next_cap(struct pci_bus *bus, unsigned int devfn, u8 pos, int cap)
+{
+       u8 id;
+       int ttl = 48;
+
+       while (ttl--) {
+               pci_bus_read_config_byte(bus, devfn, pos, &pos);
+               if (pos < 0x40)
+                       break;
+               pos &= ~3;
+               pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_ID,
+                                        &id);
+               if (id == 0xff)
+                       break;
+               if (id == cap)
+                       return pos;
+               pos += PCI_CAP_LIST_NEXT;
+       }
+       return 0;
+}
+
+int pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap)
+{
+       return __pci_find_next_cap(dev->bus, dev->devfn,
+                                  pos + PCI_CAP_LIST_NEXT, cap);
+}
+EXPORT_SYMBOL_GPL(pci_find_next_capability);
+
 static int __pci_bus_find_cap(struct pci_bus *bus, unsigned int devfn, u8 hdr_type, int cap)
 {
        u16 status;
-       u8 pos, id;
-       int ttl = 48;
+       u8 pos;
 
        pci_bus_read_config_word(bus, devfn, PCI_STATUS, &status);
        if (!(status & PCI_STATUS_CAP_LIST))
@@ -76,24 +103,15 @@ static int __pci_bus_find_cap(struct pci_bus *bus, unsigned int devfn, u8 hdr_ty
        switch (hdr_type) {
        case PCI_HEADER_TYPE_NORMAL:
        case PCI_HEADER_TYPE_BRIDGE:
-               pci_bus_read_config_byte(bus, devfn, PCI_CAPABILITY_LIST, &pos);
+               pos = PCI_CAPABILITY_LIST;
                break;
        case PCI_HEADER_TYPE_CARDBUS:
-               pci_bus_read_config_byte(bus, devfn, PCI_CB_CAPABILITY_LIST, &pos);
+               pos = PCI_CB_CAPABILITY_LIST;
                break;
        default:
                return 0;
        }
-       while (ttl-- && pos >= 0x40) {
-               pos &= ~3;
-               pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_ID, &id);
-               if (id == 0xff)
-                       break;
-               if (id == cap)
-                       return pos;
-               pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_NEXT, &pos);
-       }
-       return 0;
+       return __pci_find_next_cap(bus, devfn, pos, cap);
 }
 
 /**
index 5627ce1d2b320460a058db828230cd649910bc11..3a4f49f4effbfd647371bae04c040ec761d924a3 100644 (file)
@@ -462,11 +462,11 @@ static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev)
 
        pci_read_config_word(dev, 0x70, &hm);
        hm &= PCI_BASE_ADDRESS_IO_MASK;
-       quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c868 HW-mon");
+       quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c686 HW-mon");
 
        pci_read_config_dword(dev, 0x90, &smb);
        smb &= PCI_BASE_ADDRESS_IO_MASK;
-       quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c868 SMB");
+       quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c686 SMB");
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C686_4,     quirk_vt82c686_acpi );
 
@@ -1243,6 +1243,21 @@ static void __devinit quirk_netmos(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos);
 
+
+static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
+{
+       /* rev 1 ncr53c810 chips don't set the class at all which means
+        * they don't get their resources remapped. Fix that here.
+        */
+
+       if (dev->class == PCI_CLASS_NOT_DEFINED) {
+               printk(KERN_INFO "NCR 53c810 rev 1 detected, setting PCI class.\n");
+               dev->class = PCI_CLASS_STORAGE_SCSI;
+       }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
+
+
 static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end)
 {
        while (f < end) {
index 234cdca6fe137e8967fbe43bf6c71557a84c434b..a30aa74304a2712f946614093552ab117ba22507 100644 (file)
@@ -513,6 +513,11 @@ static int socket_insert(struct pcmcia_socket *skt)
        ret = socket_setup(skt, setup_delay);
        if (ret == CS_SUCCESS) {
                skt->state |= SOCKET_PRESENT;
+
+               printk(KERN_NOTICE "pccard: %s card inserted into slot %d\n",
+                      (skt->state & SOCKET_CARDBUS) ? "CardBus" : "PCMCIA",
+                      skt->sock);
+
 #ifdef CONFIG_CARDBUS
                if (skt->state & SOCKET_CARDBUS) {
                        cb_alloc(skt);
@@ -598,6 +603,7 @@ static int socket_resume(struct pcmcia_socket *skt)
 
 static void socket_remove(struct pcmcia_socket *skt)
 {
+       printk(KERN_NOTICE "pccard: card ejected from slot %d\n", skt->sock);
        socket_shutdown(skt);
        cs_socket_put(skt);
 }
index 39d096b52926fb4c5d6b33976c38c75511117ac1..7f8219f3fd9ef75b8cf10a223e7f1478fdb4cf2e 100644 (file)
@@ -544,6 +544,9 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
        list_add_tail(&p_dev->socket_device_list, &s->devices_list);
        spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
 
+       printk(KERN_NOTICE "pcmcia: registering new device %s\n",
+              p_dev->devname);
+
        pcmcia_device_query(p_dev);
 
        if (device_register(&p_dev->dev)) {
index 4ddd76239b34aff80f4783f9e2557baa51038326..4d56bc9926d691cd99a2af5e24e02f0ad3946d8c 100644 (file)
@@ -1339,10 +1339,7 @@ static struct device_driver i82365_driver = {
        .resume = pcmcia_socket_dev_resume,
 };
 
-static struct platform_device i82365_device = {
-       .name = "i82365",
-       .id = 0,
-};
+static struct platform_device *i82365_device;
 
 static int __init init_i82365(void)
 {
@@ -1352,7 +1349,14 @@ static int __init init_i82365(void)
     if (ret)
        return ret;
 
-    ret = platform_device_register(&i82365_device);
+    i82365_device = platform_device_alloc("i82365", 0);
+    if (i82365_device) {
+           ret = platform_device_add(i82365_device);
+           if (ret)
+                   platform_device_put(i82365_device);
+    } else
+           ret = -ENOMEM;
+
     if (ret) {
        driver_unregister(&i82365_driver);
        return ret;
@@ -1365,7 +1369,7 @@ static int __init init_i82365(void)
 
     if (sockets == 0) {
        printk("not found.\n");
-       platform_device_unregister(&i82365_device);
+       platform_device_unregister(i82365_device);
        release_region(i365_base, 2);
        driver_unregister(&i82365_driver);
        return -ENODEV;
@@ -1377,7 +1381,7 @@ static int __init init_i82365(void)
     
     /* register sockets with the pcmcia core */
     for (i = 0; i < sockets; i++) {
-           socket[i].socket.dev.dev = &i82365_device.dev;
+           socket[i].socket.dev.dev = &i82365_device->dev;
            socket[i].socket.ops = &pcic_operations;
            socket[i].socket.resource_ops = &pccard_nonstatic_ops;
            socket[i].socket.owner = THIS_MODULE;
@@ -1415,7 +1419,7 @@ static void __exit exit_i82365(void)
            if (socket[i].flags & IS_REGISTERED)
                    pcmcia_unregister_socket(&socket[i].socket);
     }
-    platform_device_unregister(&i82365_device);
+    platform_device_unregister(i82365_device);
     if (poll_interval != 0)
        del_timer_sync(&poll_timer);
     if (grab_irq != 0)
index f5b7d360fc10ae5973003ad2cd25031b71976503..1026f2bc318565334daa386321f592f125691010 100644 (file)
@@ -1179,12 +1179,12 @@ raw3270_create_attributes(struct raw3270 *rp)
        //FIXME: check return code
        sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
        rp->clttydev =
-               class_device_create(class3270,
+               class_device_create(class3270, NULL,
                                    MKDEV(IBM_TTY3270_MAJOR, rp->minor),
                                    &rp->cdev->dev, "tty%s",
                                    rp->cdev->dev.bus_id);
        rp->cltubdev =
-               class_device_create(class3270,
+               class_device_create(class3270, NULL,
                                    MKDEV(IBM_FS3270_MAJOR, rp->minor),
                                    &rp->cdev->dev, "tub%s",
                                    rp->cdev->dev.bus_id);
index 1c8ad2fcad8a59d2d67270de4cde2a5cdc43127d..da8c515743e871e4066f3dcc583d6e4b922838ff 100644 (file)
@@ -8,7 +8,7 @@
  *    Author(s): Original Code written by
  *                       DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  *              Rewritten by
- *                       Frank Pavlic (pavlic@de.ibm.com) and
+ *                       Frank Pavlic (fpavlic@de.ibm.com) and
  *                       Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
  *    $Revision: 1.99 $         $Date: 2005/05/11 08:10:17 $
@@ -2342,6 +2342,6 @@ __exit lcs_cleanup_module(void)
 module_init(lcs_init_module);
 module_exit(lcs_cleanup_module);
 
-MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>");
+MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");
 MODULE_LICENSE("GPL");
 
index 38a2441564d7d85bc94d2b931f4d641f619a7f0a..d238c7ed103b2e6cfd3bf73e808116bd4712a5b7 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/trdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/if_vlan.h>
+#include <linux/ctype.h>
 
 #include <net/ipv6.h>
 #include <linux/in6.h>
@@ -24,7 +25,7 @@
 
 #include "qeth_mpc.h"
 
-#define VERSION_QETH_H                 "$Revision: 1.142 $"
+#define VERSION_QETH_H                 "$Revision: 1.152 $"
 
 #ifdef CONFIG_QETH_IPV6
 #define QETH_VERSION_IPV6      ":IPv6"
@@ -718,8 +719,6 @@ struct qeth_reply {
        atomic_t refcnt;
 };
 
-#define QETH_BROADCAST_WITH_ECHO    1
-#define QETH_BROADCAST_WITHOUT_ECHO 2
 
 struct qeth_card_blkt {
        int time_total;
@@ -727,8 +726,10 @@ struct qeth_card_blkt {
        int inter_packet_jumbo;
 };
 
-
-
+#define QETH_BROADCAST_WITH_ECHO    0x01
+#define QETH_BROADCAST_WITHOUT_ECHO 0x02
+#define QETH_LAYER2_MAC_READ       0x01
+#define QETH_LAYER2_MAC_REGISTERED  0x02
 struct qeth_card_info {
        unsigned short unit_addr2;
        unsigned short cula;
@@ -736,7 +737,7 @@ struct qeth_card_info {
        __u16 func_level;
        char mcl_level[QETH_MCL_LENGTH + 1];
        int guestlan;
-       int layer2_mac_registered;
+       int mac_bits;
        int portname_required;
        int portno;
        char portname[9];
@@ -749,6 +750,7 @@ struct qeth_card_info {
        int unique_id;
        struct qeth_card_blkt blkt;
        __u32 csum_mask;
+       enum qeth_ipa_promisc_modes promisc_mode;
 };
 
 struct qeth_card_options {
@@ -775,6 +777,7 @@ struct qeth_card_options {
 enum qeth_threads {
        QETH_SET_IP_THREAD  = 1,
        QETH_RECOVER_THREAD = 2,
+       QETH_SET_PROMISC_MODE_THREAD = 4,
 };
 
 struct qeth_osn_info {
@@ -1074,6 +1077,26 @@ qeth_get_qdio_q_format(struct qeth_card *card)
        }
 }
 
+static inline int
+qeth_isdigit(char * buf)
+{
+       while (*buf) {
+               if (!isdigit(*buf++))
+                       return 0;
+       }
+       return 1;
+}
+
+static inline int
+qeth_isxdigit(char * buf)
+{
+       while (*buf) {
+               if (!isxdigit(*buf++))
+                       return 0;
+       }
+       return 1;
+}
+
 static inline void
 qeth_ipaddr4_to_string(const __u8 *addr, char *buf)
 {
@@ -1090,18 +1113,27 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
        int i;
 
        start = buf;
-       for (i = 0; i < 3; i++) {
-               if (!(end = strchr(start, '.')))
+       for (i = 0; i < 4; i++) {
+               if (i == 3) {
+                       end = strchr(start,0xa);
+                       if (end)
+                               len = end - start;
+                       else            
+                               len = strlen(start);
+               }
+               else {
+                       end = strchr(start, '.');
+                       len = end - start;
+               }
+               if ((len <= 0) || (len > 3))
                        return -EINVAL;
-               len = end - start;
                memset(abuf, 0, 4);
                strncpy(abuf, start, len);
+               if (!qeth_isdigit(abuf))
+                       return -EINVAL;
                addr[i] = simple_strtoul(abuf, &tmp, 10);
                start = end + 1;
        }
-       memset(abuf, 0, 4);
-       strcpy(abuf, start);
-       addr[3] = simple_strtoul(abuf, &tmp, 10);
        return 0;
 }
 
@@ -1128,18 +1160,27 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
 
        tmp_addr = (u16 *)addr;
        start = buf;
-       for (i = 0; i < 7; i++) {
-               if (!(end = strchr(start, ':')))
+       for (i = 0; i < 8; i++) {
+               if (i == 7) {
+                       end = strchr(start,0xa);
+                       if (end)
+                               len = end - start;
+                       else
+                               len = strlen(start);
+               }
+               else {
+                       end = strchr(start, ':');
+                       len = end - start;
+               }
+               if ((len <= 0) || (len > 4))
                        return -EINVAL;
-               len = end - start;
                memset(abuf, 0, 5);
                strncpy(abuf, start, len);
+               if (!qeth_isxdigit(abuf))
+                       return -EINVAL;
                tmp_addr[i] = simple_strtoul(abuf, &tmp, 16);
                start = end + 1;
        }
-       memset(abuf, 0, 5);
-       strcpy(abuf, start);
-       tmp_addr[7] = simple_strtoul(abuf, &tmp, 16);
        return 0;
 }
 
index 692003c9f896fd3dc54ea8265f8c834e00a80533..99cceb242ec4e31e4d815d8b623cc65f68363bfe 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.224 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -9,10 +9,10 @@
  *    Author(s): Original Code written by
  *                       Utz Bacher (utz.bacher@de.ibm.com)
  *              Rewritten by
- *                       Frank Pavlic (pavlic@de.ibm.com) and
+ *                       Frank Pavlic (fpavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.224 $        $Date: 2005/05/04 20:19:18 $
+ *    $Revision: 1.242 $        $Date: 2005/05/04 20:19:18 $
  *
  * 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
@@ -72,7 +72,7 @@
 #include "qeth_eddp.h"
 #include "qeth_tso.h"
 
-#define VERSION_QETH_C "$Revision: 1.224 $"
+#define VERSION_QETH_C "$Revision: 1.242 $"
 static const char *version = "qeth S/390 OSA-Express driver";
 
 /**
@@ -159,6 +159,9 @@ qeth_get_addr_buffer(enum qeth_prot_versions);
 static void
 qeth_set_multicast_list(struct net_device *);
 
+static void
+qeth_setadp_promisc_mode(struct qeth_card *);
+
 static void
 qeth_notify_processes(void)
 {
@@ -602,11 +605,20 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
        int found = 0;
 
        list_for_each_entry(addr, &card->ip_list, entry) {
+               if (card->options.layer2) {
+                       if ((addr->type == todo->type) &&
+                           (memcmp(&addr->mac, &todo->mac, 
+                                   OSA_ADDR_LEN) == 0)) {
+                               found = 1;
+                               break;
+                       }
+                       continue;
+               } 
                if ((addr->proto     == QETH_PROT_IPV4)  &&
                    (todo->proto     == QETH_PROT_IPV4)  &&
                    (addr->type      == todo->type)      &&
                    (addr->u.a4.addr == todo->u.a4.addr) &&
-                   (addr->u.a4.mask == todo->u.a4.mask)   ){
+                   (addr->u.a4.mask == todo->u.a4.mask){
                        found = 1;
                        break;
                }
@@ -615,12 +627,12 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
                    (addr->type        == todo->type)         &&
                    (addr->u.a6.pfxlen == todo->u.a6.pfxlen)  &&
                    (memcmp(&addr->u.a6.addr, &todo->u.a6.addr,
-                           sizeof(struct in6_addr)) == 0))     {
+                           sizeof(struct in6_addr)) == 0)) {
                        found = 1;
                        break;
                }
        }
-       if (found){
+       if (found) {
                addr->users += todo->users;
                if (addr->users <= 0){
                        *__addr = addr;
@@ -632,7 +644,7 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
                        return 0;
                }
        }
-       if (todo->users > 0){
+       if (todo->users > 0) {
                /* for VIPA and RXIP limit refcount to 1 */
                if (todo->type != QETH_IP_TYPE_NORMAL)
                        todo->users = 1;
@@ -682,12 +694,22 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
                if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) &&
                    (tmp->type == QETH_IP_TYPE_DEL_ALL_MC))
                        return 0;
+               if (card->options.layer2) {
+                       if ((tmp->type  == addr->type)  &&
+                           (tmp->is_multicast == addr->is_multicast) &&
+                           (memcmp(&tmp->mac, &addr->mac, 
+                                   OSA_ADDR_LEN) == 0)) {
+                               found = 1;
+                               break;
+                       }
+                       continue;
+               }        
                if ((tmp->proto        == QETH_PROT_IPV4)     &&
                    (addr->proto       == QETH_PROT_IPV4)     &&
                    (tmp->type         == addr->type)         &&
                    (tmp->is_multicast == addr->is_multicast) &&
                    (tmp->u.a4.addr    == addr->u.a4.addr)    &&
-                   (tmp->u.a4.mask    == addr->u.a4.mask)      ){
+                   (tmp->u.a4.mask    == addr->u.a4.mask){
                        found = 1;
                        break;
                }
@@ -697,7 +719,7 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
                    (tmp->is_multicast == addr->is_multicast)  &&
                    (tmp->u.a6.pfxlen  == addr->u.a6.pfxlen)   &&
                    (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
-                           sizeof(struct in6_addr)) == 0)        ){
+                           sizeof(struct in6_addr)) == 0){
                        found = 1;
                        break;
                }
@@ -707,7 +729,7 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
                        tmp->users += addr->users;
                else
                        tmp->users += add? 1:-1;
-               if (tmp->users == 0){
+               if (tmp->users == 0) {
                        list_del(&tmp->entry);
                        kfree(tmp);
                }
@@ -738,12 +760,15 @@ qeth_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
        unsigned long flags;
        int rc = 0;
 
-       QETH_DBF_TEXT(trace,4,"delip");
-       if (addr->proto == QETH_PROT_IPV4)
-               QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
+       QETH_DBF_TEXT(trace, 4, "delip");
+
+       if (card->options.layer2)
+               QETH_DBF_HEX(trace, 4, &addr->mac, 6);
+       else if (addr->proto == QETH_PROT_IPV4)
+               QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
        else {
-               QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8);
-               QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8);
+               QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
        }
        spin_lock_irqsave(&card->ip_lock, flags);
        rc = __qeth_insert_ip_todo(card, addr, 0);
@@ -757,12 +782,14 @@ qeth_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
        unsigned long flags;
        int rc = 0;
 
-       QETH_DBF_TEXT(trace,4,"addip");
-       if (addr->proto == QETH_PROT_IPV4)
-               QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
+       QETH_DBF_TEXT(trace, 4, "addip");
+       if (card->options.layer2)
+               QETH_DBF_HEX(trace, 4, &addr->mac, 6);
+       else if (addr->proto == QETH_PROT_IPV4)
+               QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
        else {
-               QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8);
-               QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8);
+               QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
        }
        spin_lock_irqsave(&card->ip_lock, flags);
        rc = __qeth_insert_ip_todo(card, addr, 1);
@@ -775,7 +802,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
 {
        struct qeth_ipaddr *addr, *tmp;
        int rc;
-
+again:
        list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
                if (addr->is_multicast) {
                        spin_unlock_irqrestore(&card->ip_lock, *flags);
@@ -784,6 +811,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
                        if (!rc) {
                                list_del(&addr->entry);
                                kfree(addr);
+                               goto again;
                        }
                }
        }
@@ -851,6 +879,7 @@ qeth_set_ip_addr_list(struct qeth_card *card)
 
 static void qeth_delete_mc_addresses(struct qeth_card *);
 static void qeth_add_multicast_ipv4(struct qeth_card *);
+static void qeth_layer2_add_multicast(struct qeth_card *);
 #ifdef CONFIG_QETH_IPV6
 static void qeth_add_multicast_ipv6(struct qeth_card *);
 #endif
@@ -939,6 +968,24 @@ qeth_register_ip_addresses(void *ptr)
        return 0;
 }
 
+/*
+ * Drive the SET_PROMISC_MODE thread
+ */
+static int
+qeth_set_promisc_mode(void *ptr)
+{
+       struct qeth_card *card = (struct qeth_card *) ptr;
+
+       daemonize("qeth_setprm");
+       QETH_DBF_TEXT(trace,4,"setprm1");
+       if (!qeth_do_run_thread(card, QETH_SET_PROMISC_MODE_THREAD))
+               return 0;
+       QETH_DBF_TEXT(trace,4,"setprm2");
+       qeth_setadp_promisc_mode(card);
+       qeth_clear_thread_running_bit(card, QETH_SET_PROMISC_MODE_THREAD);
+       return 0;
+}
+
 static int
 qeth_recover(void *ptr)
 {
@@ -1005,6 +1052,8 @@ qeth_start_kernel_thread(struct qeth_card *card)
 
        if (qeth_do_start_thread(card, QETH_SET_IP_THREAD))
                kernel_thread(qeth_register_ip_addresses, (void *)card,SIGCHLD);
+       if (qeth_do_start_thread(card, QETH_SET_PROMISC_MODE_THREAD))
+               kernel_thread(qeth_set_promisc_mode, (void *)card, SIGCHLD);
        if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
                kernel_thread(qeth_recover, (void *) card, SIGCHLD);
 }
@@ -3749,7 +3798,7 @@ qeth_open(struct net_device *dev)
 
        if ( (card->info.type != QETH_CARD_TYPE_OSN) &&
             (card->options.layer2) &&
-            (!card->info.layer2_mac_registered)) {
+            (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
                QETH_DBF_TEXT(trace,4,"nomacadr");
                return -EPERM;
        }
@@ -4311,6 +4360,8 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
 out:
        if (flush_count)
                qeth_flush_buffers(queue, 0, start_index, flush_count);
+       else if (!atomic_read(&queue->set_pci_flags_count))
+               atomic_swap(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
        /*
         * queue->state will go from LOCKED -> UNLOCKED or from
         * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
@@ -4975,6 +5026,10 @@ qeth_default_setassparms_cb(struct qeth_card *, struct qeth_reply *,
                            unsigned long);
 
 static int
+qeth_default_setadapterparms_cb(struct qeth_card *card,
+                                struct qeth_reply *reply,
+                                unsigned long data);
+static int
 qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *,
                      __u16, long,
                      int (*reply_cb)
@@ -5301,8 +5356,7 @@ qeth_free_vlan_addresses4(struct qeth_card *card, unsigned short vid)
        struct qeth_ipaddr *addr;
 
        QETH_DBF_TEXT(trace, 4, "frvaddr4");
-       if (!card->vlangrp)
-               return;
+
        rcu_read_lock();
        in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]);
        if (!in_dev)
@@ -5330,8 +5384,7 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid)
        struct qeth_ipaddr *addr;
 
        QETH_DBF_TEXT(trace, 4, "frvaddr6");
-       if (!card->vlangrp)
-               return;
+
        in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]);
        if (!in6_dev)
                return;
@@ -5351,10 +5404,38 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid)
 }
 
 static void
+qeth_free_vlan_addresses(struct qeth_card *card, unsigned short vid)
+{
+       if (card->options.layer2 || !card->vlangrp)
+               return;
+       qeth_free_vlan_addresses4(card, vid);
+       qeth_free_vlan_addresses6(card, vid);
+}
+
+static int
+qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
+                               struct qeth_reply *reply,
+                               unsigned long data)
+{
+        struct qeth_ipa_cmd *cmd;
+
+        QETH_DBF_TEXT(trace, 2, "L2sdvcb");
+        cmd = (struct qeth_ipa_cmd *) data;
+        if (cmd->hdr.return_code) {
+               PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
+                         "Continuing\n",cmd->data.setdelvlan.vlan_id, 
+                         QETH_CARD_IFNAME(card), cmd->hdr.return_code);
+               QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command);
+               QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
+               QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code);
+       }
+        return 0;
+}
+
+static int
 qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
                            enum qeth_ipa_cmds ipacmd)
 {
-       int rc;
        struct qeth_ipa_cmd *cmd;
        struct qeth_cmd_buffer *iob;
 
@@ -5362,15 +5443,8 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
        iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
         cmd->data.setdelvlan.vlan_id = i;
-
-       rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
-        if (rc) {
-                PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
-                         "Continuing\n",i, QETH_CARD_IFNAME(card), rc);
-               QETH_DBF_TEXT_(trace, 2, "L2VL%4x", ipacmd);
-               QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
-               QETH_DBF_TEXT_(trace, 2, "err%d", rc);
-        }
+       return qeth_send_ipa_cmd(card, iob, 
+                                qeth_layer2_send_setdelvlan_cb, NULL);
 }
 
 static void
@@ -5420,8 +5494,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
        qeth_free_vlan_skbs(card, vid);
        spin_lock_irqsave(&card->vlanlock, flags);
        /* unregister IP addresses of vlan device */
-       qeth_free_vlan_addresses4(card, vid);
-       qeth_free_vlan_addresses6(card, vid);
+       qeth_free_vlan_addresses(card, vid);
        if (card->vlangrp)
                card->vlangrp->vlan_devices[vid] = NULL;
        spin_unlock_irqrestore(&card->vlanlock, flags);
@@ -5430,6 +5503,59 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
        qeth_set_multicast_list(card->dev);
 }
 #endif
+/**
+ * Examine hardware response to SET_PROMISC_MODE
+ */
+static int
+qeth_setadp_promisc_mode_cb(struct qeth_card *card, 
+                           struct qeth_reply *reply,
+                           unsigned long data)
+{
+       struct qeth_ipa_cmd *cmd;
+       struct qeth_ipacmd_setadpparms *setparms;
+
+       QETH_DBF_TEXT(trace,4,"prmadpcb");
+
+       cmd = (struct qeth_ipa_cmd *) data;
+       setparms = &(cmd->data.setadapterparms);
+       
+        qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
+       if (cmd->hdr.return_code) { 
+               QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);      
+               setparms->data.mode = SET_PROMISC_MODE_OFF;
+       }
+       card->info.promisc_mode = setparms->data.mode;
+       return 0;
+}
+/*
+ * Set promiscuous mode (on or off) (SET_PROMISC_MODE command)
+ */
+static void
+qeth_setadp_promisc_mode(struct qeth_card *card)
+{
+       enum qeth_ipa_promisc_modes mode;
+       struct net_device *dev = card->dev;
+       struct qeth_cmd_buffer *iob;
+       struct qeth_ipa_cmd *cmd;
+
+       QETH_DBF_TEXT(trace, 4, "setprom");
+
+       if (((dev->flags & IFF_PROMISC) &&
+            (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
+           (!(dev->flags & IFF_PROMISC) &&
+            (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
+               return;
+       mode = SET_PROMISC_MODE_OFF;
+       if (dev->flags & IFF_PROMISC)
+               mode = SET_PROMISC_MODE_ON;
+       QETH_DBF_TEXT_(trace, 4, "mode:%x", mode);
+
+       iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
+                       sizeof(struct qeth_ipacmd_setadpparms));
+       cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
+       cmd->data.setadapterparms.data.mode = mode;
+       qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
+}
 
 /**
  * set multicast address on card
@@ -5444,12 +5570,22 @@ qeth_set_multicast_list(struct net_device *dev)
         
        QETH_DBF_TEXT(trace,3,"setmulti");
        qeth_delete_mc_addresses(card);
+       if (card->options.layer2) {
+               qeth_layer2_add_multicast(card);
+               goto out;
+       }
        qeth_add_multicast_ipv4(card);
 #ifdef CONFIG_QETH_IPV6
        qeth_add_multicast_ipv6(card);
 #endif
+out:
        if (qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD) == 0)
                schedule_work(&card->kernel_thread_starter);
+       if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
+               return;
+       if (qeth_set_thread_start_bit(card, QETH_SET_PROMISC_MODE_THREAD)==0)
+               schedule_work(&card->kernel_thread_starter);
+
 }
 
 static int
@@ -5657,6 +5793,24 @@ qeth_add_multicast_ipv4(struct qeth_card *card)
        in_dev_put(in4_dev);
 }
 
+static void
+qeth_layer2_add_multicast(struct qeth_card *card)
+{
+       struct qeth_ipaddr *ipm;
+       struct dev_mc_list *dm;
+
+       QETH_DBF_TEXT(trace,4,"L2addmc");
+       for (dm = card->dev->mc_list; dm; dm = dm->next) {
+               ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
+               if (!ipm)
+                       continue;
+               memcpy(ipm->mac,dm->dmi_addr,MAX_ADDR_LEN);
+               ipm->is_multicast = 1;
+               if (!qeth_add_ip(card, ipm))
+                       kfree(ipm);
+       }
+}
+
 #ifdef CONFIG_QETH_IPV6
 static inline void
 qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
@@ -5825,10 +5979,10 @@ qeth_layer2_send_setmac_cb(struct qeth_card *card,
                PRINT_WARN("Error in registering MAC address on " \
                           "device %s: x%x\n", CARD_BUS_ID(card),
                           cmd->hdr.return_code);
-               card->info.layer2_mac_registered = 0;
+               card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
                cmd->hdr.return_code = -EIO;
        } else {
-               card->info.layer2_mac_registered = 1;
+               card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
                memcpy(card->dev->dev_addr,cmd->data.setdelmac.mac,
                       OSA_ADDR_LEN);
                PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
@@ -5866,7 +6020,7 @@ qeth_layer2_send_delmac_cb(struct qeth_card *card,
                cmd->hdr.return_code = -EIO;
                return 0;
        }
-       card->info.layer2_mac_registered = 0;
+       card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 
        return 0;
 }
@@ -5874,7 +6028,7 @@ static int
 qeth_layer2_send_delmac(struct qeth_card *card, __u8 *mac)
 {
        QETH_DBF_TEXT(trace, 2, "L2Delmac");
-       if (!card->info.layer2_mac_registered)
+       if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
                return 0;
        return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
                                          qeth_layer2_send_delmac_cb);
@@ -5896,7 +6050,7 @@ qeth_layer2_set_mac_address(struct net_device *dev, void *p)
        card = (struct qeth_card *) dev->priv;
 
        if (!card->options.layer2) {
-               PRINT_WARN("Setting MAC address on %s is not supported"
+               PRINT_WARN("Setting MAC address on %s is not supported "
                           "in Layer 3 mode.\n", dev->name);
                QETH_DBF_TEXT(trace, 3, "setmcLY3");
                return -EOPNOTSUPP;
@@ -6441,6 +6595,8 @@ qeth_default_setadapterparms_cb(struct qeth_card *card,
        return 0;
 }
 
+
+
 static int
 qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply,
                              unsigned long data)
@@ -6481,8 +6637,13 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
        QETH_DBF_TEXT(trace,4,"chgmaccb");
 
        cmd = (struct qeth_ipa_cmd *) data;
-       memcpy(card->dev->dev_addr,
-              &cmd->data.setadapterparms.data.change_addr.addr,OSA_ADDR_LEN);
+       if (!card->options.layer2 || card->info.guestlan ||
+           !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {    
+               memcpy(card->dev->dev_addr,
+                      &cmd->data.setadapterparms.data.change_addr.addr,
+                      OSA_ADDR_LEN);
+               card->info.mac_bits |= QETH_LAYER2_MAC_READ;
+       }
        qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
        return 0;
 }
@@ -6602,6 +6763,12 @@ qeth_layer2_initialize(struct qeth_card *card)
         QETH_DBF_TEXT(setup, 2, "doL2init");
         QETH_DBF_TEXT_(setup, 2, "doL2%s", CARD_BUS_ID(card));
 
+       rc = qeth_query_setadapterparms(card);
+       if (rc) {
+               PRINT_WARN("could not query adapter parameters on device %s: "
+                          "x%x\n", CARD_BUS_ID(card), rc);
+       }
+
        rc = qeth_setadpparms_change_macaddr(card);
        if (rc) {
                PRINT_WARN("couldn't get MAC address on "
@@ -8548,7 +8715,7 @@ EXPORT_SYMBOL(qeth_osn_deregister);
 EXPORT_SYMBOL(qeth_osn_assist);
 module_init(qeth_init);
 module_exit(qeth_exit);
-MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>");
+MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");
 MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
                                      "Copyright 2000,2003 IBM Corporation\n");
 
index 30e053d3cac2932ef90c679c5d3db4024c8bd660..f0a080a9e5155cdc9cde20731586065a756b7b0c 100644 (file)
@@ -4,7 +4,7 @@
  * Linux on zSeries OSA Express and HiperSockets support
  *
  * Copyright 2000,2003 IBM Corporation
- * Author(s): Frank Pavlic <pavlic@de.ibm.com>
+ * Author(s): Frank Pavlic <fpavlic@de.ibm.com>
  *           Thomas Spatzier <tspat@de.ibm.com>
  *
  */
index 7edc5f1fc0d24da927ac81bc2ebe01fe1b57fc79..5f71486e708cf0ee4cf96e4640aac699ad3aacd7 100644 (file)
@@ -6,7 +6,7 @@
  * Copyright 2000,2003 IBM Corporation
  * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
  *            Thomas Spatzier <tspat@de.ibm.com>
- *            Frank Pavlic <pavlic@de.ibm.com>
+ *            Frank Pavlic <fpavlic@de.ibm.com>
  *
  */
 #ifndef __QETH_MPC_H__
@@ -14,7 +14,7 @@
 
 #include <asm/qeth.h>
 
-#define VERSION_QETH_MPC_H "$Revision: 1.43 $"
+#define VERSION_QETH_MPC_H "$Revision: 1.44 $"
 
 extern const char *VERSION_QETH_MPC_C;
 
@@ -217,7 +217,7 @@ enum qeth_ipa_setadp_cmd {
        IPA_SETADP_SEND_OSA_MESSAGE             = 0x0100,
        IPA_SETADP_SET_SNMP_CONTROL             = 0x0200,
        IPA_SETADP_READ_SNMP_PARMS              = 0x0400,
-       IPA_SETADP_WRITE_SNMP_PARMS             = 0x0800,
+       IPA_SETADP_SET_PROMISC_MODE             = 0x0800,
        IPA_SETADP_QUERY_CARD_INFO              = 0x1000,
 };
 enum qeth_ipa_mac_ops {
@@ -232,9 +232,12 @@ enum qeth_ipa_addr_ops {
        CHANGE_ADDR_ADD_ADDR            = 1,
        CHANGE_ADDR_DEL_ADDR            = 2,
        CHANGE_ADDR_FLUSH_ADDR_TABLE    = 4,
-
-
 };
+enum qeth_ipa_promisc_modes {
+       SET_PROMISC_MODE_OFF            = 0,
+       SET_PROMISC_MODE_ON             = 1,
+};
+
 /* (SET)DELIP(M) IPA stuff ***************************************************/
 struct qeth_ipacmd_setdelip4 {
        __u8   ip_addr[4];
index f91a02db57437b57f0603294d8da9fc9e07eb222..ddd6019ba0926a7272b3b1090147b3c5fca4a678 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.55 $)
+ * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.58 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to sysfs.
@@ -8,7 +8,7 @@
  * Copyright 2000,2003 IBM Corporation
  *
  * Author(s): Thomas Spatzier <tspat@de.ibm.com>
- *           Frank Pavlic <pavlic@de.ibm.com>
+ *           Frank Pavlic <fpavlic@de.ibm.com>
  *
  */
 #include <linux/list.h>
@@ -20,7 +20,7 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_SYS_C = "$Revision: 1.55 $";
+const char *VERSION_QETH_SYS_C = "$Revision: 1.58 $";
 
 /*****************************************************************************/
 /*                                                                           */
@@ -1117,7 +1117,7 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto,
        start = buf;
        /* get address string */
        end = strchr(start, '/');
-       if (!end){
+       if (!end || (end-start >= 49)){
                PRINT_WARN("Invalid format for ipato_addx/delx. "
                           "Use <ip addr>/<mask bits>\n");
                return -EINVAL;
index ad33e6f466f1bd819547f687e5b9e719a6c19f5e..e245af3c4cbdfdb65bf2dfa83c75a801df4da043 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright 2004 IBM Corporation
  *
- *    Author(s): Frank Pavlic <pavlic@de.ibm.com>
+ *    Author(s): Frank Pavlic <fpavlic@de.ibm.com>
  *
  *    $Revision: 1.7 $  $Date: 2005/05/04 20:19:18 $
  *
index 2c86a4b809cd1c8482fcf15aee90e5b707730a9e..c3a51d1fae5de6df86a7270f44540e3cabd07fcb 100644 (file)
@@ -119,7 +119,7 @@ static long d7s_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        __u8 regs = readb(d7s_regs);
        __u8 ireg = 0;
-       int error = 0
+       int error = 0;
 
        if (D7S_MINOR != iminor(file->f_dentry->d_inode))
                return -ENODEV;
index 5774bdd0e26faaa2e70ba1362978251fac2f19ca..9b988baf0b5191304ca00ac042851b055f002bd7 100644 (file)
@@ -210,27 +210,6 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        }
 }
 
-static long rtc_compat_ioctl(struct file *file, unsigned int cmd,
-       unsigned long arg)
-{
-       int rval = -ENOIOCTLCMD;
-
-       switch (cmd) {
-       /*
-        * These two are specific to this driver, the generic rtc ioctls
-        * are hanlded elsewhere.
-        */
-       case RTCGET:
-       case RTCSET:
-               lock_kernel();
-               rval = rtc_ioctl(file->f_dentry->d_inode, file, cmd, arg);
-               unlock_kernel();
-               break;
-       }
-
-       return rval;
-}
-
 static int rtc_open(struct inode *inode, struct file *file)
 {
        int ret;
@@ -258,7 +237,6 @@ static struct file_operations rtc_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        rtc_ioctl,
-       .compat_ioctl = rtc_compat_ioctl,
        .open =         rtc_open,
        .release =      rtc_release,
 };
index 7a33c708f5b3dd0a65d4433e3900d52f64ae42aa..9cb5dd48383fbdde590270a36ac13512dafabb64 100644 (file)
@@ -343,7 +343,7 @@ static void NCR53c7x0_soft_reset (struct Scsi_Host *host);
 /* Size of event list (per host adapter) */
 static int track_events = 0;
 static struct Scsi_Host *first_host = NULL;    /* Head of list of NCR boards */
-static Scsi_Host_Template *the_template = NULL;        
+static struct scsi_host_template *the_template = NULL;
 
 /* NCR53c710 script handling code */
 
@@ -1103,7 +1103,7 @@ NCR53c7x0_init (struct Scsi_Host *host) {
 }
 
 /* 
- * Function : int ncr53c7xx_init(Scsi_Host_Template *tpnt, int board, int chip,
+ * Function : int ncr53c7xx_init(struct scsi_host_template *tpnt, int board, int chip,
  *     unsigned long base, int io_port, int irq, int dma, long long options,
  *     int clock);
  *
@@ -1118,7 +1118,7 @@ NCR53c7x0_init (struct Scsi_Host *host) {
  */
 
 int 
-ncr53c7xx_init (Scsi_Host_Template *tpnt, int board, int chip,
+ncr53c7xx_init (struct scsi_host_template *tpnt, int board, int chip,
     unsigned long base, int io_port, int irq, int dma, 
     long long options, int clock)
 {
index d9098bdace05ed13e06fbf59a28596ce5af0a52e..218f3b901537a8d27bf0a71bb60a5a059ea4b2cd 100644 (file)
@@ -1600,7 +1600,7 @@ struct NCR53c7x0_hostdata {
 /* Paranoid people could use panic() here. */
 #define FATAL(host) shutdown((host));
 
-extern int ncr53c7xx_init(Scsi_Host_Template *tpnt, int board, int chip,
+extern int ncr53c7xx_init(struct scsi_host_template *tpnt, int board, int chip,
                          unsigned long base, int io_port, int irq, int dma,
                          long long options, int clock);
 
index afeca325b4dc8a18884b10544ff53f6537123343..20dd85a77813a03fa9314a7c65f98a4ecd75e7e0 100644 (file)
@@ -497,7 +497,7 @@ config SCSI_ATA_PIIX
          If unsure, say N.
 
 config SCSI_SATA_MV
-       tristate "Marvell SATA support"
+       tristate "Marvell SATA support (HIGHLY EXPERIMENTAL)"
        depends on SCSI_SATA && PCI && EXPERIMENTAL
        help
          This option enables support for the Marvell Serial ATA family.
@@ -1295,27 +1295,6 @@ config SCSI_QLOGIC_FAS
          To compile this driver as a module, choose M here: the
          module will be called qlogicfas.
 
-config SCSI_QLOGIC_ISP
-       tristate "Qlogic ISP SCSI support (old driver)"
-       depends on PCI && SCSI && BROKEN
-       ---help---
-         This driver works for all QLogic PCI SCSI host adapters (IQ-PCI,
-         IQ-PCI-10, IQ_PCI-D) except for the PCI-basic card.  (This latter
-         card is supported by the "AM53/79C974 PCI SCSI" driver.)
-
-         If you say Y here, make sure to choose "BIOS" at the question "PCI
-         access mode".
-
-         Please read the file <file:Documentation/scsi/qlogicisp.txt>.  You
-         should also read the SCSI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called qlogicisp.
-
-         These days the hardware is also supported by the more modern qla1280
-         driver.  In doubt use that one instead of qlogicisp.
-
 config SCSI_QLOGIC_FC
        tristate "Qlogic ISP FC SCSI support"
        depends on PCI && SCSI
@@ -1342,14 +1321,6 @@ config SCSI_QLOGIC_1280
          To compile this driver as a module, choose M here: the
          module will be called qla1280.
 
-config SCSI_QLOGIC_1280_1040
-       bool "Qlogic QLA 1020/1040 SCSI support"
-       depends on SCSI_QLOGIC_1280 && SCSI_QLOGIC_ISP!=y
-       help
-         Say Y here if you have a QLogic ISP1020/1040 SCSI host adapter and
-         do not want to use the old driver.  This option enables support in
-         the qla1280 driver for those host adapters.
-
 config SCSI_QLOGICPTI
        tristate "PTI Qlogic, ISP Driver"
        depends on SBUS && SCSI
index b88b8c455598c60b9049a3678c344d37be8e27e2..f062ea0f813a189d688fc6cfe21ab70e0f3b4c4f 100644 (file)
@@ -78,7 +78,6 @@ obj-$(CONFIG_SCSI_NCR_Q720)   += NCR_Q720_mod.o
 obj-$(CONFIG_SCSI_SYM53C416)   += sym53c416.o
 obj-$(CONFIG_SCSI_QLOGIC_FAS)  += qlogicfas408.o       qlogicfas.o
 obj-$(CONFIG_PCMCIA_QLOGIC)    += qlogicfas408.o
-obj-$(CONFIG_SCSI_QLOGIC_ISP)  += qlogicisp.o 
 obj-$(CONFIG_SCSI_QLOGIC_FC)   += qlogicfc.o 
 obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o 
 obj-$(CONFIG_SCSI_QLA2XXX)     += qla2xxx/
index 26146a4b67b8dd4628f53d68e330aad9064ff799..640590bd014a10c5c1f98c3974bc42be58e447e4 100644 (file)
@@ -529,7 +529,7 @@ void esp_bootup_reset(struct NCR_ESP *esp, struct ESP_regs *eregs)
 /* Allocate structure and insert basic data such as SCSI chip frequency
  * data and a pointer to the device
  */
-struct NCR_ESP* esp_allocate(Scsi_Host_Template *tpnt, void *esp_dev)
+struct NCR_ESP* esp_allocate(struct scsi_host_template *tpnt, void *esp_dev)
 {
        struct NCR_ESP *esp, *elink;
        struct Scsi_Host *esp_host;
@@ -1006,7 +1006,7 @@ static void esp_exec_cmd(struct NCR_ESP *esp)
        struct ESP_regs *eregs = esp->eregs;
        struct esp_device *esp_dev;
        Scsi_Cmnd *SCptr;
-       Scsi_Device *SDptr;
+       struct scsi_device *SDptr;
        volatile unchar *cmdp = esp->esp_command;
        unsigned char the_esp_command;
        int lun, target;
@@ -1687,7 +1687,7 @@ static inline int reconnect_lun(struct NCR_ESP *esp, struct ESP_regs *eregs)
 static inline void esp_connect(struct NCR_ESP *esp, struct ESP_regs *eregs,
                               Scsi_Cmnd *sp)
 {
-       Scsi_Device *dp = sp->device;
+       struct scsi_device *dp = sp->device;
        struct esp_device *esp_dev = dp->hostdata;
 
        if(esp->prev_soff  != esp_dev->sync_max_offset ||
@@ -3605,7 +3605,7 @@ out:
 }
 #endif
 
-int esp_slave_alloc(Scsi_Device *SDptr)
+int esp_slave_alloc(struct scsi_device *SDptr)
 {
        struct esp_device *esp_dev =
                kmalloc(sizeof(struct esp_device), GFP_ATOMIC);
@@ -3617,7 +3617,7 @@ int esp_slave_alloc(Scsi_Device *SDptr)
        return 0;
 }
 
-void esp_slave_destroy(Scsi_Device *SDptr)
+void esp_slave_destroy(struct scsi_device *SDptr)
 {
        struct NCR_ESP *esp = (struct NCR_ESP *) SDptr->host->hostdata;
 
index 06e7edf2332645a60c4547b182e2a386b0275fd8..65a9b377a410d983bd75e3037bf6aec13611f734 100644 (file)
@@ -653,7 +653,7 @@ extern int nesps, esps_in_use, esps_running;
 
 /* External functions */
 extern void esp_bootup_reset(struct NCR_ESP *esp, struct ESP_regs *eregs);
-extern struct NCR_ESP *esp_allocate(Scsi_Host_Template *, void *);
+extern struct NCR_ESP *esp_allocate(struct scsi_host_template *, void *);
 extern void esp_deallocate(struct NCR_ESP *);
 extern void esp_release(void);
 extern void esp_initialize(struct NCR_ESP *);
@@ -664,6 +664,6 @@ extern int esp_abort(Scsi_Cmnd *);
 extern int esp_reset(Scsi_Cmnd *);
 extern int esp_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset, int length,
                         int inout);
-extern int esp_slave_alloc(Scsi_Device *);
-extern void esp_slave_destroy(Scsi_Device *);
+extern int esp_slave_alloc(struct scsi_device *);
+extern void esp_slave_destroy(struct scsi_device *);
 #endif /* !(NCR53C9X_H) */
index 135376992a576c4ea09f9a085ff7e02fb2259afb..ae37d3ab9c4acc2b2864b0445859e1a333e7519d 100644 (file)
@@ -447,7 +447,7 @@ static __inline__ int NCR53c406a_pio_write(unsigned char *request, unsigned int
 }
 #endif                         /* USE_PIO */
 
-static int __init NCR53c406a_detect(Scsi_Host_Template * tpnt)
+static int __init NCR53c406a_detect(struct scsi_host_template * tpnt)
 {
        int present = 0;
        struct Scsi_Host *shpnt = NULL;
@@ -1057,7 +1057,7 @@ MODULE_LICENSE("GPL");
  * Use SG_NONE if DMA mode is enabled!
  */
 
-static Scsi_Host_Template driver_template = 
+static struct scsi_host_template driver_template =
 {
      .proc_name                = "NCR53c406a"          /* proc_name */,        
      .name                     = "NCR53c406a"          /* name */,             
index 30a14ba77a6a3e49925e1aefb268ce90de3f4b1e..54996eaae979a0ff50004cd8f615eceffad65d35 100644 (file)
@@ -172,7 +172,7 @@ static void dma_stop (struct Scsi_Host *instance, Scsi_Cmnd *SCpnt,
     }
 }
 
-int __init a2091_detect(Scsi_Host_Template *tpnt)
+int __init a2091_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     struct Scsi_Host *instance;
@@ -233,7 +233,7 @@ static int a2091_bus_reset(Scsi_Cmnd *cmd)
 
 #define HOSTS_C
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "A2901",
        .name                   = "Commodore A2091/A590 SCSI",
        .detect                 = a2091_detect,
index 54993972dcc6e1a05e004b43ce7d13061774087f..22d6a13dd8be598d7349300e59f1ebbff4a7a888 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <linux/types.h>
 
-int a2091_detect(Scsi_Host_Template *);
+int a2091_detect(struct scsi_host_template *);
 int a2091_release(struct Scsi_Host *);
 const char *wd33c93_info(void);
 int wd33c93_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index 306caf56f3d9eaad59dea2916c42ca406abc5f67..f425d424bf08714e739a8457f3a94be5237bafcc 100644 (file)
@@ -168,7 +168,7 @@ static void dma_stop (struct Scsi_Host *instance, Scsi_Cmnd *SCpnt,
     }
 }
 
-int __init a3000_detect(Scsi_Host_Template *tpnt)
+int __init a3000_detect(struct scsi_host_template *tpnt)
 {
     wd33c93_regs regs;
 
@@ -221,7 +221,7 @@ static int a3000_bus_reset(Scsi_Cmnd *cmd)
 
 #define HOSTS_C
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "A3000",
        .name                   = "Amiga 3000 built-in SCSI",
        .detect                 = a3000_detect,
index b1eda731877df41f23293d695e84e1fb3495416e..5535a65150a454598dedf49dfe31f41a720bc76a 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <linux/types.h>
 
-int a3000_detect(Scsi_Host_Template *);
+int a3000_detect(struct scsi_host_template *);
 int a3000_release(struct Scsi_Host *);
 const char *wd33c93_info(void);
 int wd33c93_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index 2a128a156aa194470b5293217d5ba86269d09415..7139659dd952e4cf36eb971c8491a5dcd4b42136 100644 (file)
@@ -1579,18 +1579,10 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                        break;
        {
                u64 capacity;
-               char cp[12];
-               unsigned int offset = 0;
+               char cp[13];
 
                dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
                capacity = fsa_dev_ptr[cid].size - 1;
-               if (scsicmd->cmnd[13] > 12) {
-                       offset = scsicmd->cmnd[13] - 12;
-                       if (offset > sizeof(cp))
-                               break;
-                       memset(cp, 0, offset);
-                       aac_internal_transfer(scsicmd, cp, 0, offset);
-               }
                cp[0] = (capacity >> 56) & 0xff;
                cp[1] = (capacity >> 48) & 0xff;
                cp[2] = (capacity >> 40) & 0xff;
@@ -1603,7 +1595,18 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                cp[9] = 0;
                cp[10] = 2;
                cp[11] = 0;
-               aac_internal_transfer(scsicmd, cp, offset, sizeof(cp));
+               cp[12] = 0;
+               aac_internal_transfer(scsicmd, cp, 0,
+                 min((unsigned int)scsicmd->cmnd[13], sizeof(cp)));
+               if (sizeof(cp) < scsicmd->cmnd[13]) {
+                       unsigned int len, offset = sizeof(cp);
+
+                       memset(cp, 0, offset);
+                       do {
+                               len = min(scsicmd->cmnd[13]-offset, sizeof(cp));
+                               aac_internal_transfer(scsicmd, cp, offset, len);
+                       } while ((offset += len) < scsicmd->cmnd[13]);
+               }
 
                /* Do not cache partition table for arrays */
                scsicmd->device->removable = 1;
index 723c0cea7c04a4ade79767a22eadc27ed2747c67..38d6d00fb0fcc593ab3931c7e6026e7ddffa8e39 100644 (file)
@@ -820,7 +820,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                                break;
 
                        /*
-                        *      Find the Scsi_Device associated with the SCSI
+                        *      Find the scsi_device associated with the SCSI
                         * address. Make sure we have the right array, and if
                         * so set the flag to initiate a new re-config once we
                         * see an AifEnConfigChange AIF come through.
@@ -987,7 +987,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
 
 
        /*
-        *      Find the Scsi_Device associated with the SCSI address,
+        *      Find the scsi_device associated with the SCSI address,
         * and mark it as changed, invalidating the cache. This deals
         * with changes to existing device IDs.
         */
index f4cfb8f29620f53ba091487c7ac635134299e83e..28b93057b607032ffd6d3cfcd67c5fc5c6e77aa1 100644 (file)
           #include "advansys.h"
           #endif
 
-        and after "static Scsi_Host_Template builtin_scsi_hosts[] =":
+        and after "static struct scsi_host_template builtin_scsi_hosts[] =":
 
           #ifdef CONFIG_SCSI_ADVANSYS
           ADVANSYS,
            --- Driver Structures
            --- Driver Data
            --- Driver Function Prototypes
-           --- Linux 'Scsi_Host_Template' and advansys_setup() Functions
+           --- Linux 'struct scsi_host_template' and advansys_setup() Functions
            --- Loadable Driver Support
            --- Miscellaneous Driver Functions
            --- Functions Required by the Asc Library
@@ -4068,7 +4068,7 @@ STATIC void         asc_prt_hex(char *f, uchar *, int);
 
 
 /*
- * --- Linux 'Scsi_Host_Template' and advansys_setup() Functions
+ * --- Linux 'struct scsi_host_template' and advansys_setup() Functions
  */
 
 #ifdef CONFIG_PROC_FS
index 3f4bde02302e69bee6a3f4288455cf9ceae3536f..8ee7fb16a7257330a91a412b7307e353e605df73 100644 (file)
@@ -19,7 +19,7 @@
 #define _ADVANSYS_H
 
 /*
- * Scsi_Host_Template function prototypes.
+ * struct scsi_host_template function prototypes.
  */
 int advansys_detect(struct scsi_host_template *);
 int advansys_release(struct Scsi_Host *);
index 9b7caf504a56fa6b801da9e8f0c9eddfcdfd7778..9df23b654cec1aa929cb3d7f5eb7ae4b3b089c67 100644 (file)
@@ -424,7 +424,7 @@ MODULE_DEVICE_TABLE(isapnp, id_table);
 
 static int registered_count=0;
 static struct Scsi_Host *aha152x_host[2];
-static Scsi_Host_Template aha152x_driver_template;
+static struct scsi_host_template aha152x_driver_template;
 
 /*
  * internal states of the host
@@ -3464,7 +3464,7 @@ static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start
        return thislength < length ? thislength : length;
 }
 
-static Scsi_Host_Template aha152x_driver_template = {
+static struct scsi_host_template aha152x_driver_template = {
        .module                         = THIS_MODULE,
        .name                           = AHA152X_REVID,
        .proc_name                      = "aha152x",
index 1b1adfb384cb9adaec27941fea08067d7582d2e5..51bad7a1e773235ea0a59fb8085680dbfcb47756 100644 (file)
@@ -1021,7 +1021,7 @@ __setup("aha1542=",do_setup);
 #endif
 
 /* return non-zero on detection */
-static int __init aha1542_detect(Scsi_Host_Template * tpnt)
+static int __init aha1542_detect(struct scsi_host_template * tpnt)
 {
        unsigned char dma_chan;
        unsigned char irq_level;
@@ -1789,7 +1789,7 @@ static int aha1542_biosparam(struct scsi_device *sdev,
 MODULE_LICENSE("GPL");
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "aha1542",
        .name                   = "Adaptec 1542",
        .detect                 = aha1542_detect,
index 3821ee17f47114fe7493fb874b6d534d055a8a56..1db538552d56b59faaf5053a1e93fcd0dff1c167 100644 (file)
@@ -131,7 +131,7 @@ struct ccb {                        /* Command Control Block 5.3 */
                                /* REQUEST SENSE */
 };
 
-static int aha1542_detect(Scsi_Host_Template *);
+static int aha1542_detect(struct scsi_host_template *);
 static int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int aha1542_bus_reset(Scsi_Cmnd * SCpnt);
 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt);
index 8f85dcc0e7fa954ac62bdd47db05e76dea782763..4b8c6a543925c7e236fb2fc09d159023caf58e02 100644 (file)
@@ -570,7 +570,7 @@ static int aha1740_eh_abort_handler (Scsi_Cmnd *dummy)
        return 0;
 }
 
-static Scsi_Host_Template aha1740_template = {
+static struct scsi_host_template aha1740_template = {
        .module           = THIS_MODULE,
        .proc_name        = "aha1740",
        .proc_info        = aha1740_proc_info,
index 10c470e7d316a3a3216ff2a2023930e0eda19583..83467a05dc8e3e31f150ca2e030746a1e854b5a7 100644 (file)
@@ -48,7 +48,7 @@
 #include <asm/io.h>
 
 #define DRV_NAME       "ahci"
-#define DRV_VERSION    "1.01"
+#define DRV_VERSION    "1.2"
 
 
 enum {
@@ -134,6 +134,7 @@ enum {
                                  PORT_IRQ_D2H_REG_FIS,
 
        /* PORT_CMD bits */
+       PORT_CMD_ATAPI          = (1 << 24), /* Device is ATAPI */
        PORT_CMD_LIST_ON        = (1 << 15), /* cmd list DMA engine running */
        PORT_CMD_FIS_ON         = (1 << 14), /* FIS DMA engine running */
        PORT_CMD_FIS_RX         = (1 << 4), /* Enable FIS receive DMA engine */
@@ -255,7 +256,7 @@ static struct ata_port_info ahci_port_info[] = {
        },
 };
 
-static struct pci_device_id ahci_pci_tbl[] = {
+static const struct pci_device_id ahci_pci_tbl[] = {
        { PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci }, /* ICH6 */
        { PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
@@ -441,7 +442,7 @@ static void ahci_phy_reset(struct ata_port *ap)
        void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
        struct ata_taskfile tf;
        struct ata_device *dev = &ap->device[0];
-       u32 tmp;
+       u32 new_tmp, tmp;
 
        __sata_phy_reset(ap);
 
@@ -455,8 +456,21 @@ static void ahci_phy_reset(struct ata_port *ap)
        tf.nsect        = (tmp)         & 0xff;
 
        dev->class = ata_dev_classify(&tf);
-       if (!ata_dev_present(dev))
+       if (!ata_dev_present(dev)) {
                ata_port_disable(ap);
+               return;
+       }
+
+       /* Make sure port's ATAPI bit is set appropriately */
+       new_tmp = tmp = readl(port_mmio + PORT_CMD);
+       if (dev->class == ATA_DEV_ATAPI)
+               new_tmp |= PORT_CMD_ATAPI;
+       else
+               new_tmp &= ~PORT_CMD_ATAPI;
+       if (new_tmp != tmp) {
+               writel(new_tmp, port_mmio + PORT_CMD);
+               readl(port_mmio + PORT_CMD); /* flush */
+       }
 }
 
 static u8 ahci_check_status(struct ata_port *ap)
@@ -474,11 +488,12 @@ static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
        ata_tf_from_fis(d2h_fis, tf);
 }
 
-static void ahci_fill_sg(struct ata_queued_cmd *qc)
+static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc)
 {
        struct ahci_port_priv *pp = qc->ap->private_data;
        struct scatterlist *sg;
        struct ahci_sg *ahci_sg;
+       unsigned int n_sg = 0;
 
        VPRINTK("ENTER\n");
 
@@ -493,8 +508,12 @@ static void ahci_fill_sg(struct ata_queued_cmd *qc)
                ahci_sg->addr = cpu_to_le32(addr & 0xffffffff);
                ahci_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16);
                ahci_sg->flags_size = cpu_to_le32(sg_len - 1);
+
                ahci_sg++;
+               n_sg++;
        }
+
+       return n_sg;
 }
 
 static void ahci_qc_prep(struct ata_queued_cmd *qc)
@@ -503,13 +522,14 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
        struct ahci_port_priv *pp = ap->private_data;
        u32 opts;
        const u32 cmd_fis_len = 5; /* five dwords */
+       unsigned int n_elem;
 
        /*
         * Fill in command slot information (currently only one slot,
         * slot 0, is currently since we don't do queueing)
         */
 
-       opts = (qc->n_elem << 16) | cmd_fis_len;
+       opts = cmd_fis_len;
        if (qc->tf.flags & ATA_TFLAG_WRITE)
                opts |= AHCI_CMD_WRITE;
        if (is_atapi_taskfile(&qc->tf))
@@ -533,16 +553,31 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
        if (!(qc->flags & ATA_QCFLAG_DMAMAP))
                return;
 
-       ahci_fill_sg(qc);
+       n_elem = ahci_fill_sg(qc);
+
+       pp->cmd_slot[0].opts |= cpu_to_le32(n_elem << 16);
 }
 
-static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
+static void ahci_restart_port(struct ata_port *ap, u32 irq_stat)
 {
        void __iomem *mmio = ap->host_set->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        u32 tmp;
        int work;
 
+       if ((ap->device[0].class != ATA_DEV_ATAPI) ||
+           ((irq_stat & PORT_IRQ_TF_ERR) == 0))
+               printk(KERN_WARNING "ata%u: port reset, "
+                      "p_is %x is %x pis %x cmd %x tf %x ss %x se %x\n",
+                       ap->id,
+                       irq_stat,
+                       readl(mmio + HOST_IRQ_STAT),
+                       readl(port_mmio + PORT_IRQ_STAT),
+                       readl(port_mmio + PORT_CMD),
+                       readl(port_mmio + PORT_TFDATA),
+                       readl(port_mmio + PORT_SCR_STAT),
+                       readl(port_mmio + PORT_SCR_ERR));
+
        /* stop DMA */
        tmp = readl(port_mmio + PORT_CMD);
        tmp &= ~PORT_CMD_START;
@@ -580,8 +615,6 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
        tmp |= PORT_CMD_START;
        writel(tmp, port_mmio + PORT_CMD);
        readl(port_mmio + PORT_CMD); /* flush */
-
-       printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->id);
 }
 
 static void ahci_eng_timeout(struct ata_port *ap)
@@ -592,17 +625,17 @@ static void ahci_eng_timeout(struct ata_port *ap)
        struct ata_queued_cmd *qc;
        unsigned long flags;
 
-       DPRINTK("ENTER\n");
+       printk(KERN_WARNING "ata%u: handling error/timeout\n", ap->id);
 
        spin_lock_irqsave(&host_set->lock, flags);
 
-       ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT));
-
        qc = ata_qc_from_tag(ap, ap->active_tag);
        if (!qc) {
                printk(KERN_ERR "ata%u: BUG: timeout without command\n",
                       ap->id);
        } else {
+               ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT));
+
                /* hack alert!  We cannot use the supplied completion
                 * function from inside the ->eh_strategy_handler() thread.
                 * libata is the only user of ->eh_strategy_handler() in
@@ -637,9 +670,19 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
        }
 
        if (status & PORT_IRQ_FATAL) {
-               ahci_intr_error(ap, status);
+               unsigned int err_mask;
+               if (status & PORT_IRQ_TF_ERR)
+                       err_mask = AC_ERR_DEV;
+               else if (status & PORT_IRQ_IF_ERR)
+                       err_mask = AC_ERR_ATA_BUS;
+               else
+                       err_mask = AC_ERR_HOST_BUS;
+
+               /* command processing has stopped due to error; restart */
+               ahci_restart_port(ap, status);
+
                if (qc)
-                       ata_qc_complete(qc, AC_ERR_OTHER);
+                       ata_qc_complete(qc, err_mask);
        }
 
        return 1;
index cfb46c241b38c96f8614be60043a995b82ff38f0..31e9f40e79a2e6d173e3595b909bd85fc9f678f1 100644 (file)
@@ -436,29 +436,20 @@ ahd_linux_queue(struct scsi_cmnd * cmd, void (*scsi_done) (struct scsi_cmnd *))
 {
        struct   ahd_softc *ahd;
        struct   ahd_linux_device *dev = scsi_transport_device_data(cmd->device);
+       int rtn = SCSI_MLQUEUE_HOST_BUSY;
+       unsigned long flags;
 
        ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
 
-       /*
-        * Close the race of a command that was in the process of
-        * being queued to us just as our simq was frozen.  Let
-        * DV commands through so long as we are only frozen to
-        * perform DV.
-        */
-       if (ahd->platform_data->qfrozen != 0) {
-               printf("%s: queue frozen\n", ahd_name(ahd));
+       ahd_lock(ahd, &flags);
+       if (ahd->platform_data->qfrozen == 0) {
+               cmd->scsi_done = scsi_done;
+               cmd->result = CAM_REQ_INPROG << 16;
+               rtn = ahd_linux_run_command(ahd, dev, cmd);
 
-               return SCSI_MLQUEUE_HOST_BUSY;
        }
-
-       /*
-        * Save the callback on completion function.
-        */
-       cmd->scsi_done = scsi_done;
-
-       cmd->result = CAM_REQ_INPROG << 16;
-
-       return ahd_linux_run_command(ahd, dev, cmd);
+       ahd_unlock(ahd, &flags);
+       return rtn;
 }
 
 static inline struct scsi_target **
@@ -1081,7 +1072,6 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
 
        *((struct ahd_softc **)host->hostdata) = ahd;
        ahd_lock(ahd, &s);
-       scsi_assign_lock(host, &ahd->platform_data->spin_lock);
        ahd->platform_data->host = host;
        host->can_queue = AHD_MAX_QUEUE;
        host->cmd_per_lun = 2;
@@ -2062,6 +2052,7 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
        int    wait;
        int    disconnected;
        ahd_mode_state saved_modes;
+       unsigned long flags;
 
        pending_scb = NULL;
        paused = FALSE;
@@ -2077,7 +2068,7 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
                printf(" 0x%x", cmd->cmnd[cdb_byte]);
        printf("\n");
 
-       spin_lock_irq(&ahd->platform_data->spin_lock);
+       ahd_lock(ahd, &flags);
 
        /*
         * First determine if we currently own this command.
@@ -2291,7 +2282,8 @@ done:
                int ret;
 
                ahd->platform_data->flags |= AHD_SCB_UP_EH_SEM;
-               spin_unlock_irq(&ahd->platform_data->spin_lock);
+               ahd_unlock(ahd, &flags);
+
                init_timer(&timer);
                timer.data = (u_long)ahd;
                timer.expires = jiffies + (5 * HZ);
@@ -2305,9 +2297,8 @@ done:
                        printf("Timer Expired\n");
                        retval = FAILED;
                }
-               spin_lock_irq(&ahd->platform_data->spin_lock);
        }
-       spin_unlock_irq(&ahd->platform_data->spin_lock);
+               ahd_unlock(ahd, &flags);
        return (retval);
 }
 
index 1861407422e4a555fae273122e05c77b244054d0..7fc6454068e47a3d6ff9710d57cb968c9163ff1d 100644 (file)
@@ -476,26 +476,20 @@ ahc_linux_queue(struct scsi_cmnd * cmd, void (*scsi_done) (struct scsi_cmnd *))
 {
        struct   ahc_softc *ahc;
        struct   ahc_linux_device *dev = scsi_transport_device_data(cmd->device);
+       int rtn = SCSI_MLQUEUE_HOST_BUSY;
+       unsigned long flags;
 
        ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
 
-       /*
-        * Save the callback on completion function.
-        */
-       cmd->scsi_done = scsi_done;
-
-       /*
-        * Close the race of a command that was in the process of
-        * being queued to us just as our simq was frozen.  Let
-        * DV commands through so long as we are only frozen to
-        * perform DV.
-        */
-       if (ahc->platform_data->qfrozen != 0)
-               return SCSI_MLQUEUE_HOST_BUSY;
-
-       cmd->result = CAM_REQ_INPROG << 16;
+       ahc_lock(ahc, &flags);
+       if (ahc->platform_data->qfrozen == 0) {
+               cmd->scsi_done = scsi_done;
+               cmd->result = CAM_REQ_INPROG << 16;
+               rtn = ahc_linux_run_command(ahc, dev, cmd);
+       }
+       ahc_unlock(ahc, &flags);
 
-       return ahc_linux_run_command(ahc, dev, cmd);
+       return rtn;
 }
 
 static inline struct scsi_target **
@@ -1079,7 +1073,6 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa
 
        *((struct ahc_softc **)host->hostdata) = ahc;
        ahc_lock(ahc, &s);
-       scsi_assign_lock(host, &ahc->platform_data->spin_lock);
        ahc->platform_data->host = host;
        host->can_queue = AHC_MAX_QUEUE;
        host->cmd_per_lun = 2;
@@ -2111,6 +2104,7 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
        int    paused;
        int    wait;
        int    disconnected;
+       unsigned long flags;
 
        pending_scb = NULL;
        paused = FALSE;
@@ -2125,7 +2119,7 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
                printf(" 0x%x", cmd->cmnd[cdb_byte]);
        printf("\n");
 
-       spin_lock_irq(&ahc->platform_data->spin_lock);
+       ahc_lock(ahc, &flags);
 
        /*
         * First determine if we currently own this command.
@@ -2357,7 +2351,8 @@ done:
                int ret;
 
                ahc->platform_data->flags |= AHC_UP_EH_SEMAPHORE;
-               spin_unlock_irq(&ahc->platform_data->spin_lock);
+               ahc_unlock(ahc, &flags);
+
                init_timer(&timer);
                timer.data = (u_long)ahc;
                timer.expires = jiffies + (5 * HZ);
@@ -2371,10 +2366,8 @@ done:
                        printf("Timer Expired\n");
                        retval = FAILED;
                }
-               spin_lock_irq(&ahc->platform_data->spin_lock);
-       }
-
-       spin_unlock_irq(&ahc->platform_data->spin_lock);
+       } else
+               ahc_unlock(ahc, &flags);
        return (retval);
 }
 
index 880e2d9ffe9bde841fec29501f7cdd28c0e4bd56..33d56c34494489c773125dd53ee346a4d55dd69a 100644 (file)
@@ -6514,7 +6514,7 @@ do_aic7xxx_isr(int irq, void *dev_id, struct pt_regs *regs)
 static void
 aic7xxx_init_transinfo(struct aic7xxx_host *p, struct aic_dev_data *aic_dev)
 {
-  Scsi_Device *sdpnt = aic_dev->SDptr;
+  struct scsi_device *sdpnt = aic_dev->SDptr;
   unsigned char tindex;
 
   tindex = sdpnt->id | (sdpnt->channel << 3);
@@ -6581,7 +6581,7 @@ aic7xxx_init_transinfo(struct aic7xxx_host *p, struct aic_dev_data *aic_dev)
  *   Set up the initial aic_dev struct pointers
  *-F*************************************************************************/
 static int
-aic7xxx_slave_alloc(Scsi_Device *SDptr)
+aic7xxx_slave_alloc(struct scsi_device *SDptr)
 {
   struct aic7xxx_host *p = (struct aic7xxx_host *)SDptr->host->hostdata;
   struct aic_dev_data *aic_dev;
@@ -6644,7 +6644,7 @@ aic7xxx_slave_alloc(Scsi_Device *SDptr)
  *   queueing to be [en|dis]abled for a specific adapter.
  *-F*************************************************************************/
 static void
-aic7xxx_device_queue_depth(struct aic7xxx_host *p, Scsi_Device *device)
+aic7xxx_device_queue_depth(struct aic7xxx_host *p, struct scsi_device *device)
 {
   int tag_enabled = FALSE;
   struct aic_dev_data *aic_dev = device->hostdata;
@@ -6734,7 +6734,7 @@ aic7xxx_device_queue_depth(struct aic7xxx_host *p, Scsi_Device *device)
  *   prepare for this device to go away
  *-F*************************************************************************/
 static void
-aic7xxx_slave_destroy(Scsi_Device *SDptr)
+aic7xxx_slave_destroy(struct scsi_device *SDptr)
 {
   struct aic_dev_data *aic_dev = SDptr->hostdata;
 
@@ -6754,7 +6754,7 @@ aic7xxx_slave_destroy(Scsi_Device *SDptr)
  *   depths, allocate command structs, etc.
  *-F*************************************************************************/
 static int
-aic7xxx_slave_configure(Scsi_Device *SDptr)
+aic7xxx_slave_configure(struct scsi_device *SDptr)
 {
   struct aic7xxx_host *p = (struct aic7xxx_host *) SDptr->host->hostdata;
   struct aic_dev_data *aic_dev;
@@ -7865,7 +7865,7 @@ detect_maxscb(struct aic7xxx_host *p)
  *   Register a Adaptec aic7xxx chip SCSI controller with the kernel.
  *-F*************************************************************************/
 static int
-aic7xxx_register(Scsi_Host_Template *template, struct aic7xxx_host *p,
+aic7xxx_register(struct scsi_host_template *template, struct aic7xxx_host *p,
   int reset_delay)
 {
   int i, result;
@@ -8412,7 +8412,7 @@ aic7xxx_chip_reset(struct aic7xxx_host *p)
  *   and a pointer to a aic7xxx_host struct upon success.
  *-F*************************************************************************/
 static struct aic7xxx_host *
-aic7xxx_alloc(Scsi_Host_Template *sht, struct aic7xxx_host *temp)
+aic7xxx_alloc(struct scsi_host_template *sht, struct aic7xxx_host *temp)
 {
   struct aic7xxx_host *p = NULL;
   struct Scsi_Host *host;
@@ -8991,7 +8991,7 @@ aic7xxx_configure_bugs(struct aic7xxx_host *p)
  *       mid-level SCSI code is overhauled.
  *-F*************************************************************************/
 static int
-aic7xxx_detect(Scsi_Host_Template *template)
+aic7xxx_detect(struct scsi_host_template *template)
 {
   struct aic7xxx_host *temp_p = NULL;
   struct aic7xxx_host *current_p = NULL;
@@ -11161,7 +11161,7 @@ MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(AIC7XXX_H_VERSION);
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_info              = aic7xxx_proc_info,
        .detect                 = aic7xxx_detect,
        .release                = aic7xxx_release,
index dea8446f536088957cd9a480446c7a0149f4db76..c0844fa32c5de60aa775216f3352c6e73383411b 100644 (file)
@@ -29,7 +29,7 @@
 #include "amiga7xx.h"
 
 
-static int amiga7xx_register_one(Scsi_Host_Template *tpnt,
+static int amiga7xx_register_one(struct scsi_host_template *tpnt,
                                 unsigned long address)
 {
     long long options;
@@ -65,7 +65,7 @@ static struct {
     { 0 }
 };
 
-static int __init amiga7xx_zorro_detect(Scsi_Host_Template *tpnt)
+static int __init amiga7xx_zorro_detect(struct scsi_host_template *tpnt)
 {
     int num = 0, i;
     struct zorro_dev *z = NULL;
@@ -89,7 +89,7 @@ static int __init amiga7xx_zorro_detect(Scsi_Host_Template *tpnt)
 #endif /* CONFIG_ZORRO */
 
 
-int __init amiga7xx_detect(Scsi_Host_Template *tpnt)
+int __init amiga7xx_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     int num = 0;
@@ -122,7 +122,7 @@ static int amiga7xx_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = "Amiga NCR53c710 SCSI",
        .detect                 = amiga7xx_detect,
        .release                = amiga7xx_release,
index 8cc54a5b889e8963b5ea5d68576028d09d816412..1b637592d5ae23efcda05befb8593b3ab76b680c 100644 (file)
@@ -2,7 +2,7 @@
 
 #include <linux/types.h>
 
-int amiga7xx_detect(Scsi_Host_Template *);
+int amiga7xx_detect(struct scsi_host_template *);
 const char *NCR53c7x0_info(void);
 int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 int NCR53c7xx_abort(Scsi_Cmnd *);
index be2caecbbdd9f99a2ddbf7020f7bf76dbff988ff..b7b20c689c245567026bf60b2b2a6913e1a7e703 100644 (file)
@@ -896,7 +896,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result)
  * Notes    : this will only be one SG entry or less
  */
 static
-void acornscsi_data_updateptr(AS_Host *host, Scsi_Pointer *SCp, unsigned int length)
+void acornscsi_data_updateptr(AS_Host *host, struct scsi_pointer *SCp, unsigned int length)
 {
     SCp->ptr += length;
     SCp->this_residual -= length;
@@ -2862,7 +2862,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
                        int length, int inout)
 {
     int pos, begin = 0, devidx;
-    Scsi_Device *scd;
+    struct scsi_device *scd;
     AS_Host *host;
     char *p = buffer;
 
@@ -2971,7 +2971,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
     return pos;
 }
 
-static Scsi_Host_Template acornscsi_template = {
+static struct scsi_host_template acornscsi_template = {
        .module                 = THIS_MODULE,
        .proc_info              = acornscsi_proc_info,
        .name                   = "AcornSCSI",
index 03881f0916455aedfa559f9491a1fbd33dac9ed8..2142290f84046b42ed89b2ef57774ff7a4ea4151 100644 (file)
@@ -292,7 +292,7 @@ typedef struct acornscsi_hostdata {
            unsigned char       tag;            /* reconnected tag                      */
        } reconnected;
 
-       Scsi_Pointer    SCp;                    /* current commands data pointer        */
+       struct scsi_pointer     SCp;                    /* current commands data pointer        */
 
        MsgQueue_t      msgs;
 
index 29811f5891ee42c1a5bffec259d41212fd3cbc92..804125e35fc3a20e05d6118bf8f9f7e0453d203c 100644 (file)
@@ -65,7 +65,7 @@ struct arxescsi_info {
  * Returns : 0 if we should not set CMD_WITHDMA for transfer info command
  */
 static fasdmatype_t
-arxescsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
+arxescsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
                       fasdmadir_t direction, fasdmatype_t min_type)
 {
        /*
@@ -111,7 +111,7 @@ static void arxescsi_pseudo_dma_write(unsigned char *addr, void __iomem *base)
  *          transfer  - minimum number of bytes we expect to transfer
  */
 static void
-arxescsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
+arxescsi_dma_pseudo(struct Scsi_Host *host, struct scsi_pointer *SCp,
                    fasdmadir_t direction, int transfer)
 {
        struct arxescsi_info *info = (struct arxescsi_info *)host->hostdata;
@@ -197,7 +197,7 @@ arxescsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
  * Params  : host  - host
  *          SCpnt - command
  */
-static void arxescsi_dma_stop(struct Scsi_Host *host, Scsi_Pointer *SCp)
+static void arxescsi_dma_stop(struct Scsi_Host *host, struct scsi_pointer *SCp)
 {
        /*
         * no DMA to stop
@@ -261,7 +261,7 @@ arxescsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t off
        return pos;
 }
 
-static Scsi_Host_Template arxescsi_template = {
+static struct scsi_host_template arxescsi_template = {
        .proc_info                      = arxescsi_proc_info,
        .name                           = "ARXE SCSI card",
        .info                           = arxescsi_info,
index 26498553a7cc52f2b216e1fa7176686aa756f5c1..81e266be26d01ac77906a50f4a5773bd932748e0 100644 (file)
@@ -238,7 +238,7 @@ static void cumanascsi_write(struct Scsi_Host *instance, int reg, int value)
 
 #include "../NCR5380.c"
 
-static Scsi_Host_Template cumanascsi_template = {
+static struct scsi_host_template cumanascsi_template = {
        .module                 = THIS_MODULE,
        .name                   = "Cumana 16-bit SCSI",
        .info                   = cumanascsi_info,
index 0ef0644eeb29138cb74483d7fd951e454be1a13a..3a7a46b0dc41c9a065a7ed8b6ad613568d09024c 100644 (file)
@@ -157,7 +157,7 @@ cumanascsi_2_intr(int irq, void *dev_id, struct pt_regs *regs)
  * Returns  : type of transfer to be performed
  */
 static fasdmatype_t
-cumanascsi_2_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
+cumanascsi_2_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
                       fasdmadir_t direction, fasdmatype_t min_type)
 {
        struct cumanascsi2_info *info = (struct cumanascsi2_info *)host->hostdata;
@@ -209,7 +209,7 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
  *           transfer  - minimum number of bytes we expect to transfer
  */
 static void
-cumanascsi_2_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
+cumanascsi_2_dma_pseudo(struct Scsi_Host *host, struct scsi_pointer *SCp,
                        fasdmadir_t direction, int transfer)
 {
        struct cumanascsi2_info *info = (struct cumanascsi2_info *)host->hostdata;
@@ -283,7 +283,7 @@ cumanascsi_2_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
  *           SCpnt - command
  */
 static void
-cumanascsi_2_dma_stop(struct Scsi_Host *host, Scsi_Pointer *SCp)
+cumanascsi_2_dma_stop(struct Scsi_Host *host, struct scsi_pointer *SCp)
 {
        struct cumanascsi2_info *info = (struct cumanascsi2_info *)host->hostdata;
        if (info->info.scsi.dma != NO_DMA) {
@@ -381,7 +381,7 @@ int cumanascsi_2_proc_info (struct Scsi_Host *host, char *buffer, char **start,
        return pos;
 }
 
-static Scsi_Host_Template cumanascsi2_template = {
+static struct scsi_host_template cumanascsi2_template = {
        .module                         = THIS_MODULE,
        .proc_info                      = cumanascsi_2_proc_info,
        .name                           = "Cumana SCSI II",
index f8a7fdd3c46523b5b69081b5844331f3943aa4b0..6adcccbf444b1a34b5ec0c0f2fa1b2abea6bb20e 100644 (file)
@@ -155,7 +155,7 @@ printk("reading %p len %d\n",addr, len);
 
 #include "../NCR5380.c"
 
-static Scsi_Host_Template ecoscsi_template =  {
+static struct scsi_host_template ecoscsi_template =  {
        .module         = THIS_MODULE,
        .name           = "Serial Port EcoSCSI NCR5380",
        .proc_name      = "ecoscsi",
index ce711f166cfb5a16b58a009e8af5eceba4b6f1ea..4d1e8f52c924ff1cf57eb5ad49def29641ba8803 100644 (file)
@@ -158,7 +158,7 @@ eesoxscsi_intr(int irq, void *dev_id, struct pt_regs *regs)
  * Returns  : type of transfer to be performed
  */
 static fasdmatype_t
-eesoxscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
+eesoxscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
                       fasdmadir_t direction, fasdmatype_t min_type)
 {
        struct eesoxscsi_info *info = (struct eesoxscsi_info *)host->hostdata;
@@ -353,7 +353,7 @@ static void eesoxscsi_buffer_out(void *buf, int length, void __iomem *base)
 }
 
 static void
-eesoxscsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
+eesoxscsi_dma_pseudo(struct Scsi_Host *host, struct scsi_pointer *SCp,
                     fasdmadir_t dir, int transfer_size)
 {
        struct eesoxscsi_info *info = (struct eesoxscsi_info *)host->hostdata;
@@ -370,7 +370,7 @@ eesoxscsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
  *           SCpnt - command
  */
 static void
-eesoxscsi_dma_stop(struct Scsi_Host *host, Scsi_Pointer *SCp)
+eesoxscsi_dma_stop(struct Scsi_Host *host, struct scsi_pointer *SCp)
 {
        struct eesoxscsi_info *info = (struct eesoxscsi_info *)host->hostdata;
        if (info->info.scsi.dma != NO_DMA)
@@ -499,7 +499,7 @@ static ssize_t eesoxscsi_store_term(struct device *dev, struct device_attribute
 static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,
                   eesoxscsi_show_term, eesoxscsi_store_term);
 
-static Scsi_Host_Template eesox_template = {
+static struct scsi_host_template eesox_template = {
        .module                         = THIS_MODULE,
        .proc_info                      = eesoxscsi_proc_info,
        .name                           = "EESOX SCSI",
index 4772fb317f3e5d9aa5f603e7e30d98b09e64a33a..3e1053f111dcd61f849bb240c2a4caee4657f3d5 100644 (file)
@@ -173,7 +173,7 @@ static void fas216_dumpstate(FAS216_Info *info)
                fas216_readb(info, REG_CTCH));
 }
 
-static void print_SCp(Scsi_Pointer *SCp, const char *prefix, const char *suffix)
+static void print_SCp(struct scsi_pointer *SCp, const char *prefix, const char *suffix)
 {
        printk("%sptr %p this_residual 0x%x buffer %p buffers_residual 0x%x%s",
                prefix, SCp->ptr, SCp->this_residual, SCp->buffer,
@@ -628,7 +628,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
  */
 static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
 {
-       Scsi_Pointer *SCp = &info->scsi.SCp;
+       struct scsi_pointer *SCp = &info->scsi.SCp;
 
        fas216_checkmagic(info);
 
@@ -668,7 +668,7 @@ static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
  */
 static void fas216_pio(FAS216_Info *info, fasdmadir_t direction)
 {
-       Scsi_Pointer *SCp = &info->scsi.SCp;
+       struct scsi_pointer *SCp = &info->scsi.SCp;
 
        fas216_checkmagic(info);
 
@@ -2559,7 +2559,7 @@ int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt)
 {
        FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
        unsigned long flags;
-       Scsi_Device *SDpnt;
+       struct scsi_device *SDpnt;
 
        fas216_checkmagic(info);
        fas216_log(info, LOG_ERROR, "resetting bus");
@@ -3000,7 +3000,7 @@ int fas216_print_stats(FAS216_Info *info, char *buffer)
 int fas216_print_devices(FAS216_Info *info, char *buffer)
 {
        struct fas216_device *dev;
-       Scsi_Device *scd;
+       struct scsi_device *scd;
        char *p = buffer;
 
        p += sprintf(p, "Device/Lun TaggedQ       Parity   Sync\n");
index 60a2a120205b99e705429008ba512dc9b6ee6841..540914d6fd32dc3a0ad29fad7c5330e387f4ec7c 100644 (file)
@@ -243,7 +243,7 @@ typedef struct {
                unsigned int    irq;                    /* interrupt                            */
                int             dma;                    /* dma channel                          */
 
-               Scsi_Pointer    SCp;                    /* current commands data pointer        */
+               struct scsi_pointer     SCp;                    /* current commands data pointer        */
 
                MsgQueue_t      msgs;                   /* message queue for connected device   */
 
@@ -304,9 +304,9 @@ typedef struct {
        /* dma */
        struct {
                fasdmatype_t    transfer_type;          /* current type of DMA transfer         */
-               fasdmatype_t    (*setup) (struct Scsi_Host *host, Scsi_Pointer *SCp, fasdmadir_t direction, fasdmatype_t min_dma);
-               void            (*pseudo)(struct Scsi_Host *host, Scsi_Pointer *SCp, fasdmadir_t direction, int transfer);
-               void            (*stop)  (struct Scsi_Host *host, Scsi_Pointer *SCp);
+               fasdmatype_t    (*setup) (struct Scsi_Host *host, struct scsi_pointer *SCp, fasdmadir_t direction, fasdmatype_t min_dma);
+               void            (*pseudo)(struct Scsi_Host *host, struct scsi_pointer *SCp, fasdmadir_t direction, int transfer);
+               void            (*stop)  (struct Scsi_Host *host, struct scsi_pointer *SCp);
        } dma;
 
        /* miscellaneous */
index de24bb991f1d74ff1a50f34c2a6c8dd2a99de11d..d806b024c3bda264126f0b679389c11c91a5a8d9 100644 (file)
@@ -111,7 +111,7 @@ printk("reading %p len %d\n", addr, len);
 
 #include "../NCR5380.c"
 
-static Scsi_Host_Template oakscsi_template = {
+static struct scsi_host_template oakscsi_template = {
        .module                 = THIS_MODULE,
        .proc_info              = oakscsi_proc_info,
        .name                   = "Oak 16-bit SCSI",
index abda216113f1d03c470230b81a2885969d3e0263..3333d7b39139ee36a85b21740fa4134042327dd7 100644 (file)
@@ -132,7 +132,7 @@ powertecscsi_intr(int irq, void *dev_id, struct pt_regs *regs)
  * Returns  : type of transfer to be performed
  */
 static fasdmatype_t
-powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
+powertecscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
                       fasdmadir_t direction, fasdmatype_t min_type)
 {
        struct powertec_info *info = (struct powertec_info *)host->hostdata;
@@ -174,7 +174,7 @@ powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
  *           SCpnt - command
  */
 static void
-powertecscsi_dma_stop(struct Scsi_Host *host, Scsi_Pointer *SCp)
+powertecscsi_dma_stop(struct Scsi_Host *host, struct scsi_pointer *SCp)
 {
        struct powertec_info *info = (struct powertec_info *)host->hostdata;
        if (info->info.scsi.dma != NO_DMA)
@@ -293,7 +293,7 @@ powertecscsi_store_term(struct device *dev, struct device_attribute *attr, const
 static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,
                   powertecscsi_show_term, powertecscsi_store_term);
 
-static Scsi_Host_Template powertecscsi_template = {
+static struct scsi_host_template powertecscsi_template = {
        .module                         = THIS_MODULE,
        .proc_info                      = powertecscsi_proc_info,
        .name                           = "PowerTec SCSI",
index 19937640e2e793da93b15046cb9f06ac0f7d127c..6dd544a5eb56a207f9918f33c1d20ce00e0cd7bd 100644 (file)
@@ -18,7 +18,7 @@
  * The scatter-gather list handling.  This contains all
  * the yucky stuff that needs to be fixed properly.
  */
-static inline int copy_SCp_to_sg(struct scatterlist *sg, Scsi_Pointer *SCp, int max)
+static inline int copy_SCp_to_sg(struct scatterlist *sg, struct scsi_pointer *SCp, int max)
 {
        int bufs = SCp->buffers_residual;
 
@@ -32,7 +32,7 @@ static inline int copy_SCp_to_sg(struct scatterlist *sg, Scsi_Pointer *SCp, int
        return bufs + 1;
 }
 
-static inline int next_SCp(Scsi_Pointer *SCp)
+static inline int next_SCp(struct scsi_pointer *SCp)
 {
        int ret = SCp->buffers_residual;
        if (ret) {
@@ -49,7 +49,7 @@ static inline int next_SCp(Scsi_Pointer *SCp)
        return ret;
 }
 
-static inline unsigned char get_next_SCp_byte(Scsi_Pointer *SCp)
+static inline unsigned char get_next_SCp_byte(struct scsi_pointer *SCp)
 {
        char c = *SCp->ptr;
 
@@ -59,7 +59,7 @@ static inline unsigned char get_next_SCp_byte(Scsi_Pointer *SCp)
        return c;
 }
 
-static inline void put_next_SCp_byte(Scsi_Pointer *SCp, unsigned char c)
+static inline void put_next_SCp_byte(struct scsi_pointer *SCp, unsigned char c)
 {
        *SCp->ptr = c;
        SCp->ptr += 1;
index a1bd8d95623ca6483e9a7bc700d66398091cce47..333d69dd84ef5ad0febfefeb07a30e7153288a72 100644 (file)
@@ -50,7 +50,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "ata_piix"
-#define DRV_VERSION    "1.04"
+#define DRV_VERSION    "1.05"
 
 enum {
        PIIX_IOCFG              = 0x54, /* IDE I/O configuration register */
@@ -95,7 +95,7 @@ static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev);
 
 static unsigned int in_module_init = 1;
 
-static struct pci_device_id piix_pci_tbl[] = {
+static const struct pci_device_id piix_pci_tbl[] = {
 #ifdef ATA_ENABLE_PATA
        { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix4_pata },
        { 0x8086, 0x24db, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_pata },
index 2c12be72c4c6abe0e72048e0b092bd2c6379b9cb..2ae31ceb32a8fc97b11d2d1618ca749a84420d36 100644 (file)
  */
 
 static struct Scsi_Host *first_instance = NULL;
-static Scsi_Host_Template *the_template = NULL;
+static struct scsi_host_template *the_template = NULL;
 
 /* Macros ease life... :-) */
 #define        SETUP_HOSTDATA(in)                              \
index af8adb629b33eba5cbbbb99e000b81710c3731c0..f4c1ca7c1572536452bd059e56d514b2a0180f2d 100644 (file)
@@ -600,7 +600,7 @@ int atari_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
 #endif
 
 
-int atari_scsi_detect (Scsi_Host_Template *host)
+int atari_scsi_detect (struct scsi_host_template *host)
 {
        static int called = 0;
        struct Scsi_Host *instance;
@@ -1141,7 +1141,7 @@ static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value
 
 #include "atari_NCR5380.c"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_info              = atari_scsi_proc_info,
        .name                   = "Atari native SCSI",
        .detect                 = atari_scsi_detect,
index cc1256988841dc2c6e55bc860f6b4c88be36c489..f917bdd09b410f9c4426e1c3f94493118436baa1 100644 (file)
@@ -18,7 +18,7 @@
 /* (I_HAVE_OVERRUNS stuff removed) */
 
 #ifndef ASM
-int atari_scsi_detect (Scsi_Host_Template *);
+int atari_scsi_detect (struct scsi_host_template *);
 const char *atari_scsi_info (struct Scsi_Host *);
 int atari_scsi_reset (Scsi_Cmnd *, unsigned int);
 #ifdef MODULE
index 4cd9fcf4dc505010195763fd87be6042b3794b2d..763e409a1ff37b96684cc9ecd2d6d6a2d17befc6 100644 (file)
@@ -94,7 +94,7 @@ static volatile unsigned char cmd_buffer[16];
                                 */
 
 /***************************************************************** Detection */
-int __init blz1230_esp_detect(Scsi_Host_Template *tpnt)
+int __init blz1230_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -328,7 +328,7 @@ int blz1230_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-blz1230",
        .proc_info              = esp_proc_info,
        .name                   = "Blizzard1230 SCSI IV",
index c5221d0de5caf274c3d28a824f83768ca4f76db8..d72d05fffdfa45747c4abe68d5a3e757ea08a5fb 100644 (file)
@@ -90,7 +90,7 @@ static volatile unsigned char cmd_buffer[16];
                                 */
 
 /***************************************************************** Detection */
-int __init blz2060_esp_detect(Scsi_Host_Template *tpnt)
+int __init blz2060_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -282,7 +282,7 @@ int blz2060_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-blz2060",
        .proc_info              = esp_proc_info,
        .name                   = "Blizzard2060 SCSI",
index 130f30f51a9b5ec847c6a9afdd889010523b643e..2958b8c2bfb7080aff8830f0a705a05bb59043f6 100644 (file)
@@ -23,7 +23,7 @@
 #include<linux/stat.h>
 
 
-int bvme6000_scsi_detect(Scsi_Host_Template *tpnt)
+int bvme6000_scsi_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     int clock;
@@ -59,7 +59,7 @@ static int bvme6000_scsi_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = "BVME6000 NCR53c710 SCSI",
        .detect                 = bvme6000_scsi_detect,
        .release                = bvme6000_scsi_release,
index 49b6bbb0978e811f6a87ef9cb0b5c9505ef91610..7c9c0366cc087e36ab0041764ee1615a7d6444e2 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <linux/types.h>
 
-int bvme6000_scsi_detect(Scsi_Host_Template *);
+int bvme6000_scsi_detect(struct scsi_host_template *);
 const char *NCR53c7x0_info(void);
 int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 int NCR53c7xx_abort(Scsi_Cmnd *);
index bdbca85d16757d9fc74f57a525d6e4f8436fe999..f9b940e56430c432760edc06e53613417f349bc5 100644 (file)
@@ -104,7 +104,7 @@ static volatile unsigned char cmd_buffer[16];
                                 */
 
 /***************************************************************** Detection */
-int __init cyber_esp_detect(Scsi_Host_Template *tpnt)
+int __init cyber_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -353,7 +353,7 @@ int cyber_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-cyberstorm",
        .proc_info              = esp_proc_info,
        .name                   = "CyberStorm SCSI",
index 845d9259821e1e78577e864deea67eca64a96b99..a3caabfd7557ff08e5234b0eea90536970a09b37 100644 (file)
@@ -81,7 +81,7 @@ static volatile unsigned char cmd_buffer[16];
                                 */
 
 /***************************************************************** Detection */
-int __init cyberII_esp_detect(Scsi_Host_Template *tpnt)
+int __init cyberII_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -290,7 +290,7 @@ int cyberII_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-cyberstormII",
        .proc_info              = esp_proc_info,
        .name                   = "CyberStorm Mk II SCSI",
index 256d6baf8df3809fac23729cbd8e0719f8bb84b2..a35ee43a48df78e1b627c63e33e6895035d0fe1a 100644 (file)
@@ -133,7 +133,7 @@ static struct scsi_host_template driver_template = {
 #include "scsi_module.c"
 
 /***************************************************************** Detection */
-static int dec_esp_detect(Scsi_Host_Template * tpnt)
+static int dec_esp_detect(struct scsi_host_template * tpnt)
 {
        struct NCR_ESP *esp;
        struct ConfigDev *esp_dev;
index 489194af43d03229c5f15efe42e4a272fc684f16..2ad2a89b5db4b2d15eaccd91a97d7219be4584fa 100644 (file)
@@ -44,7 +44,7 @@ static int adpt_device_reset(struct scsi_cmnd* cmd);
 
 
 /*
- * Scsi_Host_Template (see hosts.h) 
+ * struct scsi_host_template (see hosts.h)
  */
 
 #define DPT_DRIVER_NAME        "Adaptec I2O RAID"
index 897743b2334244014b10372b2345dc9e75822d4b..310d2f4886682c1dcb9e6de124e82e9cebc21b39 100644 (file)
@@ -199,7 +199,7 @@ static void __init dtc_setup(char *str, int *ints)
 #endif
 
 /* 
- * Function : int dtc_detect(Scsi_Host_Template * tpnt)
+ * Function : int dtc_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : detects and initializes DTC 3180/3280 controllers
  *     that were autoprobed, overridden on the LILO command line, 
@@ -211,7 +211,7 @@ static void __init dtc_setup(char *str, int *ints)
  *
 */
 
-static int __init dtc_detect(Scsi_Host_Template * tpnt)
+static int __init dtc_detect(struct scsi_host_template * tpnt)
 {
        static int current_override = 0, current_base = 0;
        struct Scsi_Host *instance;
@@ -471,7 +471,7 @@ static int dtc_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                           = "DTC 3180/3280 ",
        .detect                         = dtc_detect,
        .release                        = dtc_release,
index 277cd015ee4ec556d5d16c41d1cb098fa35bbb6d..0b205f8c732682583b1d939a408066615b07fa22 100644 (file)
@@ -35,7 +35,7 @@
 static int dtc_abort(Scsi_Cmnd *);
 static int dtc_biosparam(struct scsi_device *, struct block_device *,
                         sector_t, int*);
-static int dtc_detect(Scsi_Host_Template *);
+static int dtc_detect(struct scsi_host_template *);
 static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int dtc_bus_reset(Scsi_Cmnd *);
 
index ae47612b36143c67ad6e1e631af7b0e043735127..ccee68b52f7e8dc53c20cb53c6c87db9e06cbc13 100644 (file)
@@ -125,7 +125,7 @@ static inline void dma_clear(struct NCR_ESP *esp)
 }
 
 /***************************************************************** Detection */
-int __init fastlane_esp_detect(Scsi_Host_Template *tpnt)
+int __init fastlane_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -398,7 +398,7 @@ int fastlane_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-fastlane",
        .proc_info              = esp_proc_info,
        .name                   = "Fastlane SCSI",
index a6f120dcdfc37ae8e5c452d45d6065ff40b9f01d..03416548f20cfc70deb7fcac76faf2710a8fa319 100644 (file)
@@ -70,7 +70,7 @@ static unsigned char target2alpa[] = {
 
 static int fcal_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd);
 
-int fcal_slave_configure(Scsi_Device *device)
+int fcal_slave_configure(struct scsi_device *device)
 {
        int depth_to_use;
        
@@ -89,7 +89,7 @@ int fcal_slave_configure(Scsi_Device *device)
 
 /* Detect all FC Arbitrated Loops attached to the machine.
    fc4 module has done all the work for us... */
-int __init fcal_detect(Scsi_Host_Template *tpnt)
+int __init fcal_detect(struct scsi_host_template *tpnt)
 {
        int nfcals = 0;
        fc_channel *fc;
@@ -244,7 +244,7 @@ int fcal_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t of
                        SPRINTF ("  [AL-PA: %02x, Port WWN: %08x%08x, Node WWN: %08x%08x] Not responded to PRLI\n",
                                 alpa, u1[0], u1[1], u2[0], u2[1]);
                } else {
-                       Scsi_Device *scd;
+                       struct scsi_device *scd;
                        shost_for_each_device(scd, host)
                                if (scd->id == target) {
                                        SPRINTF ("  [AL-PA: %02x, Id: %02d, Port WWN: %08x%08x, Node WWN: %08x%08x]  ",
@@ -297,7 +297,7 @@ static int fcal_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmn
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = "Fibre Channel Arbitrated Loop",
        .detect                 = fcal_detect,
        .release                = fcal_release, 
index 21aa32ef9134436ac699d40e58533e9afdda2f74..7ff2c3494f9ee6a4e56efe8c22b38a0a1d049289 100644 (file)
@@ -20,8 +20,8 @@ struct fcal {
    for a particular channel */
 #define FCAL_CAN_QUEUE         512
 
-int fcal_detect(Scsi_Host_Template *);
+int fcal_detect(struct scsi_host_template *);
 int fcal_release(struct Scsi_Host *);
-int fcal_slave_configure(Scsi_Device *);
+int fcal_slave_configure(struct scsi_device *);
 
 #endif /* !(_FCAL_H) */
index 6d44602aae78fb2fb79a3529eeb9a6254c9626a1..cca485a2b438b87e748f6cdcd7387d53076b2146 100644 (file)
@@ -343,7 +343,7 @@ static void fd_mcs_make_bus_idle(struct Scsi_Host *shpnt)
                outb(0x01 | PARITY_MASK, TMC_Cntl_port);
 }
 
-static int fd_mcs_detect(Scsi_Host_Template * tpnt)
+static int fd_mcs_detect(struct scsi_host_template * tpnt)
 {
        int loop;
        struct Scsi_Host *shpnt;
@@ -1343,7 +1343,7 @@ static int fd_mcs_biosparam(struct scsi_device * disk, struct block_device *bdev
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name                      = "fd_mcs",
        .proc_info                      = fd_mcs_proc_info,
        .detect                         = fd_mcs_detect,
index a3aa729b9d3c4a6eb553bec2124fe2614ad8d064..45756fa907772c94a068064e031bfcb6e4a067c2 100644 (file)
@@ -285,7 +285,7 @@ static int __init do_DTC3181E_setup(char *str)
  *     Locks: none
  */
 
-int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
+int __init generic_NCR5380_detect(struct scsi_host_template * tpnt)
 {
        static int current_override = 0;
        int count, i;
@@ -798,7 +798,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
        Scsi_Cmnd *ptr;
        struct NCR5380_hostdata *hostdata;
 #ifdef NCR5380_STATS
-       Scsi_Device *dev;
+       struct scsi_device *dev;
        extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
 #endif
 
@@ -899,7 +899,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
 #undef PRINTP
 #undef ANDP
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_info              = generic_NCR5380_proc_info,
        .name                   = "Generic NCR5380/NCR53C400 Scsi Driver",
        .detect                 = generic_NCR5380_detect,
index c8adc5a948848381d80931daa396dccc793f4f21..656fbe2f91f663f69b61fed6cca55246bdf9db91 100644 (file)
@@ -45,7 +45,7 @@
 
 #ifndef ASM
 static int generic_NCR5380_abort(Scsi_Cmnd *);
-static int generic_NCR5380_detect(Scsi_Host_Template *);
+static int generic_NCR5380_detect(struct scsi_host_template *);
 static int generic_NCR5380_release_resources(struct Scsi_Host *);
 static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int generic_NCR5380_bus_reset(Scsi_Cmnd *);
index af682301beacb5eb627faef8439d3150d7af4e54..a6deb016584c072aaadc7ebaf6551040b1a0e9e2 100644 (file)
@@ -94,7 +94,7 @@
  * Bugfix free_irq()
  *
  * Revision 1.56  2001/08/09 11:19:39  achim
- * Scsi_Host_Template changes
+ * struct scsi_host_template changes
  *
  * Revision 1.55  2001/08/09 10:11:28  achim
  * Command HOST_UNFREEZE_IO before cache service init.
@@ -4153,7 +4153,7 @@ int __init option_setup(char *str)
     return 1;
 }
 
-static int __init gdth_detect(Scsi_Host_Template *shtp)
+static int __init gdth_detect(struct scsi_host_template *shtp)
 {
     struct Scsi_Host *shp;
     gdth_pci_str pcistr[MAXHA];
@@ -5562,7 +5562,7 @@ static void gdth_flush(int hanum)
 #else
     Scsi_Cmnd       *scp;
 #endif
-    Scsi_Device     *sdev;
+    struct scsi_device     *sdev;
     char            cmnd[MAX_COMMAND_SIZE];   
     memset(cmnd, 0xff, MAX_COMMAND_SIZE);
 
@@ -5624,10 +5624,10 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
     gdth_cmd_str    gdtcmd;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request    *srp;
-    Scsi_Device     *sdev;
+    struct scsi_device     *sdev;
 #else
     Scsi_Cmnd       *scp;
-    Scsi_Device     *sdev;
+    struct scsi_device     *sdev;
 #endif
     char            cmnd[MAX_COMMAND_SIZE];   
 #endif
@@ -5683,7 +5683,7 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
     return NOTIFY_OK;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
         .proc_name              = "gdth", 
         .proc_info              = gdth_proc_info,
         .name                   = "GDT SCSI Disk Array Controller",
index c0f1e34115245f6f41d003faff9a17e8fa0385d1..cc4882fb97ad073c787de7c9a65c09e9107bcd92 100644 (file)
@@ -944,9 +944,9 @@ typedef struct {
     ulong               dma32_cnt, dma64_cnt;   /* statistics: DMA buffer */
 #endif
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-    Scsi_Device         *sdev;
+    struct scsi_device         *sdev;
 #else
-    Scsi_Device         sdev;
+    struct scsi_device         sdev;
 #endif
 } gdth_ha_str;
 
index 1bd02f8d1e6a21542397f1fe021f2bc764975837..5e8657f9cdf68f825b19c6d26346559d24e5e0bd 100644 (file)
@@ -54,10 +54,10 @@ static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host,
     int             ret_val = -EINVAL;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request    *scp;
-    Scsi_Device     *sdev;
+    struct scsi_device     *sdev;
 #else
     Scsi_Cmnd       *scp;
-    Scsi_Device     *sdev;
+    struct scsi_device     *sdev;
 #endif
     TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum));
 
@@ -232,10 +232,10 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
     gdth_evt_str *estr;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request *scp;
-    Scsi_Device *sdev; 
+    struct scsi_device *sdev;
 #else
     Scsi_Cmnd *scp;
-    Scsi_Device *sdev;
+    struct scsi_device *sdev;
 #endif
     char hrec[161];
     struct timeval tv;
@@ -275,7 +275,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
     scp->cmd_len = 12;
     scp->use_sg = 0;
 #else
-    memset(&sdev,0,sizeof(Scsi_Device));
+    memset(&sdev,0,sizeof(struct scsi_device));
     memset(&scp, 0,sizeof(Scsi_Cmnd));
     sdev.host = scp.host = host;
     sdev.id = scp.target = sdev.host->this_id;
index ab22387c9df14b6affeddae3a68bcd6dc7fa9812..5b154498056d5cda154666a14d9e77b6b1cafd9f 100644 (file)
@@ -169,7 +169,7 @@ static void dma_stop (struct Scsi_Host *instance, Scsi_Cmnd *SCpnt,
 
 #define CHECK_WD33C93
 
-int __init gvp11_detect(Scsi_Host_Template *tpnt)
+int __init gvp11_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     struct Scsi_Host *instance;
@@ -361,7 +361,7 @@ static int gvp11_bus_reset(Scsi_Cmnd *cmd)
 
 #include "gvp11.h"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "GVP11",
        .name                   = "GVP Series II SCSI",
        .detect                 = gvp11_detect,
index 5148d9fada19054d668c1276af930d3f14aa71ff..575d219d14ba34191b6cfd34a08521cf87549d1b 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <linux/types.h>
 
-int gvp11_detect(Scsi_Host_Template *);
+int gvp11_detect(struct scsi_host_template *);
 int gvp11_release(struct Scsi_Host *);
 const char *wd33c93_info(void);
 int wd33c93_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index 8d97999db60e8c32bf0e702ae6953a27e44ef02b..b60c1b9270f171358de32efc071b96c4c001d9e8 100644 (file)
@@ -492,7 +492,7 @@ static char *ibmrate(unsigned int, int);
 static int probe_display(int);
 static int probe_bus_mode(int);
 static int device_exists(int, int, int *, int *);
-static struct Scsi_Host *ibmmca_register(Scsi_Host_Template *, int, int, int, char *);
+static struct Scsi_Host *ibmmca_register(struct scsi_host_template *, int, int, int, char *);
 static int option_setup(char *);
 /* local functions needed for proc_info */
 static int ldn_access_load(int, int);
@@ -1483,7 +1483,7 @@ static int ibmmca_getinfo(char *buf, int slot, void *dev_id)
        return len;
 }
 
-int ibmmca_detect(Scsi_Host_Template * scsi_template)
+int ibmmca_detect(struct scsi_host_template * scsi_template)
 {
        struct Scsi_Host *shpnt;
        int port, id, i, j, k, list_size, slot;
@@ -1736,7 +1736,7 @@ int ibmmca_detect(Scsi_Host_Template * scsi_template)
        return found;           /* return the number of found SCSI hosts. Should be 1 or 0. */
 }
 
-static struct Scsi_Host *ibmmca_register(Scsi_Host_Template * scsi_template, int port, int id, int adaptertype, char *hostname)
+static struct Scsi_Host *ibmmca_register(struct scsi_host_template * scsi_template, int port, int id, int adaptertype, char *hostname)
 {
        struct Scsi_Host *shpnt;
        int i, j;
@@ -2494,7 +2494,7 @@ static int option_setup(char *str)
 
 __setup("ibmmcascsi=", option_setup);
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
           .proc_name      = "ibmmca",
          .proc_info      = ibmmca_proc_info,
           .name           = "IBM SCSI-Subsystem",
index 6d68f603e9b8cd51a5e52f579fa442a9721f5731..017ee2fa6d637a187b3fdf42ce1082ab883f2b67 100644 (file)
@@ -11,7 +11,7 @@
 /* Common forward declarations for all Linux-versions: */
 
 /* Interfaces to the midlevel Linux SCSI driver */
-static int ibmmca_detect (Scsi_Host_Template *);
+static int ibmmca_detect (struct scsi_host_template *);
 static int ibmmca_release (struct Scsi_Host *);
 static int ibmmca_queuecommand (Scsi_Cmnd *, void (*done) (Scsi_Cmnd *));
 static int ibmmca_abort (Scsi_Cmnd *);
index 3553da0e1cd5c213fac3466b2e08a51399c5feed..e1960d69fb90dd756eb69b09c532a012259819c3 100644 (file)
@@ -882,7 +882,7 @@ static inline int should_transform(ide_drive_t *drive, struct scsi_cmnd *cmd)
        struct gendisk *disk = cmd->request->rq_disk;
 
        if (disk) {
-               struct Scsi_Device_Template **p = disk->private_data;
+               struct struct scsi_device_Template **p = disk->private_data;
                if (strcmp((*p)->scsi_driverfs_driver.name, "sg") == 0)
                        return test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
        }
index fe387b5ce8bd5bda53d4cff2e18f43da0dd01c9b..34daa3e068deb232b76580588049fcf9b113a9f6 100644 (file)
@@ -1899,7 +1899,7 @@ static int int_tab[] in2000__INITDATA = {
 };
 
 
-static int __init in2000_detect(Scsi_Host_Template * tpnt)
+static int __init in2000_detect(struct scsi_host_template * tpnt)
 {
        struct Scsi_Host *instance;
        struct IN2000_hostdata *hostdata;
@@ -2305,7 +2305,7 @@ static int in2000_proc_info(struct Scsi_Host *instance, char *buf, char **start,
 MODULE_LICENSE("GPL");
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name                      = "in2000",
        .proc_info                      = in2000_proc_info,
        .name                           = "Always IN2000",
index a240b52554d81dc3c9020559d4b9e6909fad5900..0fb8b06b8392cfbbf45ddbef8d291df21ca5414a 100644 (file)
@@ -395,7 +395,7 @@ struct IN2000_hostdata {
 # define CLISPIN_UNLOCK(host,flags) spin_unlock_irqrestore(host->host_lock, \
                                                           flags)
 
-static int in2000_detect(Scsi_Host_Template *) in2000__INIT;
+static int in2000_detect(struct scsi_host_template *) in2000__INIT;
 static int in2000_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int in2000_abort(Scsi_Cmnd *);
 static void in2000_setup(char *, int *) in2000__INIT;
index e0039dfae8e5ef8fc9ae9db1070b2e6ad652ae72..fa2cb3582cfa5a2c1348d974bcfa3566e5e47d73 100644 (file)
@@ -91,11 +91,14 @@ static unsigned int ipr_max_speed = 1;
 static int ipr_testmode = 0;
 static unsigned int ipr_fastfail = 0;
 static unsigned int ipr_transop_timeout = IPR_OPERATIONAL_TIMEOUT;
+static unsigned int ipr_enable_cache = 1;
+static unsigned int ipr_debug = 0;
+static int ipr_auto_create = 1;
 static DEFINE_SPINLOCK(ipr_driver_lock);
 
 /* This table describes the differences between DMA controller chips */
 static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
-       { /* Gemstone and Citrine */
+       { /* Gemstone, Citrine, and Obsidian */
                .mailbox = 0x0042C,
                .cache_line_size = 0x20,
                {
@@ -130,6 +133,8 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
 static const struct ipr_chip_t ipr_chip[] = {
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, &ipr_chip_cfg[0] },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, &ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, &ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, &ipr_chip_cfg[0] },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, &ipr_chip_cfg[1] },
        { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, &ipr_chip_cfg[1] }
 };
@@ -150,6 +155,12 @@ module_param_named(fastfail, ipr_fastfail, int, 0);
 MODULE_PARM_DESC(fastfail, "Reduce timeouts and retries");
 module_param_named(transop_timeout, ipr_transop_timeout, int, 0);
 MODULE_PARM_DESC(transop_timeout, "Time in seconds to wait for adapter to come operational (default: 300)");
+module_param_named(enable_cache, ipr_enable_cache, int, 0);
+MODULE_PARM_DESC(enable_cache, "Enable adapter's non-volatile write cache (default: 1)");
+module_param_named(debug, ipr_debug, int, 0);
+MODULE_PARM_DESC(debug, "Enable device driver debugging logging. Set to 1 to enable. (default: 0)");
+module_param_named(auto_create, ipr_auto_create, int, 0);
+MODULE_PARM_DESC(auto_create, "Auto-create single device RAID 0 arrays when initialized (default: 1)");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(IPR_DRIVER_VERSION);
 
@@ -285,12 +296,18 @@ struct ipr_error_table_t ipr_error_table[] = {
        "3110: Device bus error, message or command phase"},
        {0x04670400, 0, 1,
        "9091: Incorrect hardware configuration change has been detected"},
+       {0x04678000, 0, 1,
+       "9073: Invalid multi-adapter configuration"},
        {0x046E0000, 0, 1,
        "FFF4: Command to logical unit failed"},
        {0x05240000, 1, 0,
        "Illegal request, invalid request type or request packet"},
        {0x05250000, 0, 0,
        "Illegal request, invalid resource handle"},
+       {0x05258000, 0, 0,
+       "Illegal request, commands not allowed to this device"},
+       {0x05258100, 0, 0,
+       "Illegal request, command not allowed to a secondary adapter"},
        {0x05260000, 0, 0,
        "Illegal request, invalid field in parameter list"},
        {0x05260100, 0, 0,
@@ -299,6 +316,8 @@ struct ipr_error_table_t ipr_error_table[] = {
        "Illegal request, parameter value invalid"},
        {0x052C0000, 0, 0,
        "Illegal request, command sequence error"},
+       {0x052C8000, 1, 0,
+       "Illegal request, dual adapter support not enabled"},
        {0x06040500, 0, 1,
        "9031: Array protection temporarily suspended, protection resuming"},
        {0x06040600, 0, 1,
@@ -315,18 +334,26 @@ struct ipr_error_table_t ipr_error_table[] = {
        "3029: A device replacement has occurred"},
        {0x064C8000, 0, 1,
        "9051: IOA cache data exists for a missing or failed device"},
+       {0x064C8100, 0, 1,
+       "9055: Auxiliary cache IOA contains cache data needed by the primary IOA"},
        {0x06670100, 0, 1,
        "9025: Disk unit is not supported at its physical location"},
        {0x06670600, 0, 1,
        "3020: IOA detected a SCSI bus configuration error"},
        {0x06678000, 0, 1,
        "3150: SCSI bus configuration error"},
+       {0x06678100, 0, 1,
+       "9074: Asymmetric advanced function disk configuration"},
        {0x06690200, 0, 1,
        "9041: Array protection temporarily suspended"},
        {0x06698200, 0, 1,
        "9042: Corrupt array parity detected on specified device"},
        {0x066B0200, 0, 1,
        "9030: Array no longer protected due to missing or failed disk unit"},
+       {0x066B8000, 0, 1,
+       "9071: Link operational transition"},
+       {0x066B8100, 0, 1,
+       "9072: Link not operational transition"},
        {0x066B8200, 0, 1,
        "9032: Array exposed but still protected"},
        {0x07270000, 0, 0,
@@ -789,7 +816,7 @@ static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type,
  **/
 static void ipr_init_res_entry(struct ipr_resource_entry *res)
 {
-       res->needs_sync_complete = 1;
+       res->needs_sync_complete = 0;
        res->in_erp = 0;
        res->add_to_ml = 0;
        res->del_from_ml = 0;
@@ -889,28 +916,73 @@ static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
 
 /**
  * ipr_log_vpd - Log the passed VPD to the error log.
- * @vpids:                     vendor/product id struct
- * @serial_num:                serial number string
+ * @vpd:               vendor/product id/sn struct
  *
  * Return value:
  *     none
  **/
-static void ipr_log_vpd(struct ipr_std_inq_vpids *vpids, u8 *serial_num)
+static void ipr_log_vpd(struct ipr_vpd *vpd)
 {
        char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN
                    + IPR_SERIAL_NUM_LEN];
 
-       memcpy(buffer, vpids->vendor_id, IPR_VENDOR_ID_LEN);
-       memcpy(buffer + IPR_VENDOR_ID_LEN, vpids->product_id,
+       memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
+       memcpy(buffer + IPR_VENDOR_ID_LEN, vpd->vpids.product_id,
               IPR_PROD_ID_LEN);
        buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN] = '\0';
        ipr_err("Vendor/Product ID: %s\n", buffer);
 
-       memcpy(buffer, serial_num, IPR_SERIAL_NUM_LEN);
+       memcpy(buffer, vpd->sn, IPR_SERIAL_NUM_LEN);
        buffer[IPR_SERIAL_NUM_LEN] = '\0';
        ipr_err("    Serial Number: %s\n", buffer);
 }
 
+/**
+ * ipr_log_ext_vpd - Log the passed extended VPD to the error log.
+ * @vpd:               vendor/product id/sn/wwn struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_ext_vpd(struct ipr_ext_vpd *vpd)
+{
+       ipr_log_vpd(&vpd->vpd);
+       ipr_err("    WWN: %08X%08X\n", be32_to_cpu(vpd->wwid[0]),
+               be32_to_cpu(vpd->wwid[1]));
+}
+
+/**
+ * ipr_log_enhanced_cache_error - Log a cache error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_enhanced_cache_error(struct ipr_ioa_cfg *ioa_cfg,
+                                        struct ipr_hostrcb *hostrcb)
+{
+       struct ipr_hostrcb_type_12_error *error =
+               &hostrcb->hcam.u.error.u.type_12_error;
+
+       ipr_err("-----Current Configuration-----\n");
+       ipr_err("Cache Directory Card Information:\n");
+       ipr_log_ext_vpd(&error->ioa_vpd);
+       ipr_err("Adapter Card Information:\n");
+       ipr_log_ext_vpd(&error->cfc_vpd);
+
+       ipr_err("-----Expected Configuration-----\n");
+       ipr_err("Cache Directory Card Information:\n");
+       ipr_log_ext_vpd(&error->ioa_last_attached_to_cfc_vpd);
+       ipr_err("Adapter Card Information:\n");
+       ipr_log_ext_vpd(&error->cfc_last_attached_to_ioa_vpd);
+
+       ipr_err("Additional IOA Data: %08X %08X %08X\n",
+                    be32_to_cpu(error->ioa_data[0]),
+                    be32_to_cpu(error->ioa_data[1]),
+                    be32_to_cpu(error->ioa_data[2]));
+}
+
 /**
  * ipr_log_cache_error - Log a cache error.
  * @ioa_cfg:   ioa config struct
@@ -927,17 +999,15 @@ static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg,
 
        ipr_err("-----Current Configuration-----\n");
        ipr_err("Cache Directory Card Information:\n");
-       ipr_log_vpd(&error->ioa_vpids, error->ioa_sn);
+       ipr_log_vpd(&error->ioa_vpd);
        ipr_err("Adapter Card Information:\n");
-       ipr_log_vpd(&error->cfc_vpids, error->cfc_sn);
+       ipr_log_vpd(&error->cfc_vpd);
 
        ipr_err("-----Expected Configuration-----\n");
        ipr_err("Cache Directory Card Information:\n");
-       ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpids,
-                   error->ioa_last_attached_to_cfc_sn);
+       ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpd);
        ipr_err("Adapter Card Information:\n");
-       ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpids,
-                   error->cfc_last_attached_to_ioa_sn);
+       ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpd);
 
        ipr_err("Additional IOA Data: %08X %08X %08X\n",
                     be32_to_cpu(error->ioa_data[0]),
@@ -945,6 +1015,46 @@ static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg,
                     be32_to_cpu(error->ioa_data[2]));
 }
 
+/**
+ * ipr_log_enhanced_config_error - Log a configuration error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_enhanced_config_error(struct ipr_ioa_cfg *ioa_cfg,
+                                         struct ipr_hostrcb *hostrcb)
+{
+       int errors_logged, i;
+       struct ipr_hostrcb_device_data_entry_enhanced *dev_entry;
+       struct ipr_hostrcb_type_13_error *error;
+
+       error = &hostrcb->hcam.u.error.u.type_13_error;
+       errors_logged = be32_to_cpu(error->errors_logged);
+
+       ipr_err("Device Errors Detected/Logged: %d/%d\n",
+               be32_to_cpu(error->errors_detected), errors_logged);
+
+       dev_entry = error->dev;
+
+       for (i = 0; i < errors_logged; i++, dev_entry++) {
+               ipr_err_separator;
+
+               ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1);
+               ipr_log_ext_vpd(&dev_entry->vpd);
+
+               ipr_err("-----New Device Information-----\n");
+               ipr_log_ext_vpd(&dev_entry->new_vpd);
+
+               ipr_err("Cache Directory Card Information:\n");
+               ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd);
+
+               ipr_err("Adapter Card Information:\n");
+               ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd);
+       }
+}
+
 /**
  * ipr_log_config_error - Log a configuration error.
  * @ioa_cfg:   ioa config struct
@@ -966,30 +1076,22 @@ static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg,
        ipr_err("Device Errors Detected/Logged: %d/%d\n",
                be32_to_cpu(error->errors_detected), errors_logged);
 
-       dev_entry = error->dev_entry;
+       dev_entry = error->dev;
 
        for (i = 0; i < errors_logged; i++, dev_entry++) {
                ipr_err_separator;
 
-               if (dev_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
-                       ipr_err("Device %d: missing\n", i + 1);
-               } else {
-                       ipr_err("Device %d: %d:%d:%d:%d\n", i + 1,
-                               ioa_cfg->host->host_no, dev_entry->dev_res_addr.bus,
-                               dev_entry->dev_res_addr.target, dev_entry->dev_res_addr.lun);
-               }
-               ipr_log_vpd(&dev_entry->dev_vpids, dev_entry->dev_sn);
+               ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1);
+               ipr_log_vpd(&dev_entry->vpd);
 
                ipr_err("-----New Device Information-----\n");
-               ipr_log_vpd(&dev_entry->new_dev_vpids, dev_entry->new_dev_sn);
+               ipr_log_vpd(&dev_entry->new_vpd);
 
                ipr_err("Cache Directory Card Information:\n");
-               ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpids,
-                           dev_entry->ioa_last_with_dev_sn);
+               ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpd);
 
                ipr_err("Adapter Card Information:\n");
-               ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpids,
-                           dev_entry->cfc_last_with_dev_sn);
+               ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpd);
 
                ipr_err("Additional IOA Data: %08X %08X %08X %08X %08X\n",
                        be32_to_cpu(dev_entry->ioa_data[0]),
@@ -1000,6 +1102,57 @@ static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg,
        }
 }
 
+/**
+ * ipr_log_enhanced_array_error - Log an array configuration error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_enhanced_array_error(struct ipr_ioa_cfg *ioa_cfg,
+                                        struct ipr_hostrcb *hostrcb)
+{
+       int i, num_entries;
+       struct ipr_hostrcb_type_14_error *error;
+       struct ipr_hostrcb_array_data_entry_enhanced *array_entry;
+       const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' };
+
+       error = &hostrcb->hcam.u.error.u.type_14_error;
+
+       ipr_err_separator;
+
+       ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n",
+               error->protection_level,
+               ioa_cfg->host->host_no,
+               error->last_func_vset_res_addr.bus,
+               error->last_func_vset_res_addr.target,
+               error->last_func_vset_res_addr.lun);
+
+       ipr_err_separator;
+
+       array_entry = error->array_member;
+       num_entries = min_t(u32, be32_to_cpu(error->num_entries),
+                           sizeof(error->array_member));
+
+       for (i = 0; i < num_entries; i++, array_entry++) {
+               if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN))
+                       continue;
+
+               if (be32_to_cpu(error->exposed_mode_adn) == i)
+                       ipr_err("Exposed Array Member %d:\n", i);
+               else
+                       ipr_err("Array Member %d:\n", i);
+
+               ipr_log_ext_vpd(&array_entry->vpd);
+               ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location");
+               ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr,
+                                "Expected Location");
+
+               ipr_err_separator;
+       }
+}
+
 /**
  * ipr_log_array_error - Log an array configuration error.
  * @ioa_cfg:   ioa config struct
@@ -1032,36 +1185,19 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg,
        array_entry = error->array_member;
 
        for (i = 0; i < 18; i++) {
-               if (!memcmp(array_entry->serial_num, zero_sn, IPR_SERIAL_NUM_LEN))
+               if (!memcmp(array_entry->vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN))
                        continue;
 
-               if (be32_to_cpu(error->exposed_mode_adn) == i) {
+               if (be32_to_cpu(error->exposed_mode_adn) == i)
                        ipr_err("Exposed Array Member %d:\n", i);
-               } else {
+               else
                        ipr_err("Array Member %d:\n", i);
-               }
 
-               ipr_log_vpd(&array_entry->vpids, array_entry->serial_num);
-
-               if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
-                       ipr_err("Current Location: unknown\n");
-               } else {
-                       ipr_err("Current Location: %d:%d:%d:%d\n",
-                               ioa_cfg->host->host_no,
-                               array_entry->dev_res_addr.bus,
-                               array_entry->dev_res_addr.target,
-                               array_entry->dev_res_addr.lun);
-               }
+               ipr_log_vpd(&array_entry->vpd);
 
-               if (array_entry->expected_dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
-                       ipr_err("Expected Location: unknown\n");
-               } else {
-                       ipr_err("Expected Location: %d:%d:%d:%d\n",
-                               ioa_cfg->host->host_no,
-                               array_entry->expected_dev_res_addr.bus,
-                               array_entry->expected_dev_res_addr.target,
-                               array_entry->expected_dev_res_addr.lun);
-               }
+               ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location");
+               ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr,
+                                "Expected Location");
 
                ipr_err_separator;
 
@@ -1073,34 +1209,94 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg,
 }
 
 /**
- * ipr_log_generic_error - Log an adapter error.
- * @ioa_cfg:   ioa config struct
- * @hostrcb:   hostrcb struct
+ * ipr_log_hex_data - Log additional hex IOA error data.
+ * @data:              IOA error data
+ * @len:               data length
  *
  * Return value:
  *     none
  **/
-static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg,
-                                 struct ipr_hostrcb *hostrcb)
+static void ipr_log_hex_data(u32 *data, int len)
 {
        int i;
-       int ioa_data_len = be32_to_cpu(hostrcb->hcam.length);
 
-       if (ioa_data_len == 0)
+       if (len == 0)
                return;
 
-       ipr_err("IOA Error Data:\n");
-       ipr_err("Offset    0 1 2 3  4 5 6 7  8 9 A B  C D E F\n");
-
-       for (i = 0; i < ioa_data_len / 4; i += 4) {
+       for (i = 0; i < len / 4; i += 4) {
                ipr_err("%08X: %08X %08X %08X %08X\n", i*4,
-                       be32_to_cpu(hostrcb->hcam.u.raw.data[i]),
-                       be32_to_cpu(hostrcb->hcam.u.raw.data[i+1]),
-                       be32_to_cpu(hostrcb->hcam.u.raw.data[i+2]),
-                       be32_to_cpu(hostrcb->hcam.u.raw.data[i+3]));
+                       be32_to_cpu(data[i]),
+                       be32_to_cpu(data[i+1]),
+                       be32_to_cpu(data[i+2]),
+                       be32_to_cpu(data[i+3]));
        }
 }
 
+/**
+ * ipr_log_enhanced_dual_ioa_error - Log an enhanced dual adapter error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
+                                           struct ipr_hostrcb *hostrcb)
+{
+       struct ipr_hostrcb_type_17_error *error;
+
+       error = &hostrcb->hcam.u.error.u.type_17_error;
+       error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
+
+       ipr_err("%s\n", error->failure_reason);
+       ipr_err("Remote Adapter VPD:\n");
+       ipr_log_ext_vpd(&error->vpd);
+       ipr_log_hex_data(error->data,
+                        be32_to_cpu(hostrcb->hcam.length) -
+                        (offsetof(struct ipr_hostrcb_error, u) +
+                         offsetof(struct ipr_hostrcb_type_17_error, data)));
+}
+
+/**
+ * ipr_log_dual_ioa_error - Log a dual adapter error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
+                                  struct ipr_hostrcb *hostrcb)
+{
+       struct ipr_hostrcb_type_07_error *error;
+
+       error = &hostrcb->hcam.u.error.u.type_07_error;
+       error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
+
+       ipr_err("%s\n", error->failure_reason);
+       ipr_err("Remote Adapter VPD:\n");
+       ipr_log_vpd(&error->vpd);
+       ipr_log_hex_data(error->data,
+                        be32_to_cpu(hostrcb->hcam.length) -
+                        (offsetof(struct ipr_hostrcb_error, u) +
+                         offsetof(struct ipr_hostrcb_type_07_error, data)));
+}
+
+/**
+ * ipr_log_generic_error - Log an adapter error.
+ * @ioa_cfg:   ioa config struct
+ * @hostrcb:   hostrcb struct
+ *
+ * Return value:
+ *     none
+ **/
+static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg,
+                                 struct ipr_hostrcb *hostrcb)
+{
+       ipr_log_hex_data(hostrcb->hcam.u.raw.data,
+                        be32_to_cpu(hostrcb->hcam.length));
+}
+
 /**
  * ipr_get_error - Find the specfied IOASC in the ipr_error_table.
  * @ioasc:     IOASC
@@ -1172,11 +1368,10 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg,
 
        if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL)
                return;
+       if (be32_to_cpu(hostrcb->hcam.length) > sizeof(hostrcb->hcam.u.raw))
+               hostrcb->hcam.length = cpu_to_be32(sizeof(hostrcb->hcam.u.raw));
 
        switch (hostrcb->hcam.overlay_id) {
-       case IPR_HOST_RCB_OVERLAY_ID_1:
-               ipr_log_generic_error(ioa_cfg, hostrcb);
-               break;
        case IPR_HOST_RCB_OVERLAY_ID_2:
                ipr_log_cache_error(ioa_cfg, hostrcb);
                break;
@@ -1187,13 +1382,26 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg,
        case IPR_HOST_RCB_OVERLAY_ID_6:
                ipr_log_array_error(ioa_cfg, hostrcb);
                break;
-       case IPR_HOST_RCB_OVERLAY_ID_DEFAULT:
-               ipr_log_generic_error(ioa_cfg, hostrcb);
+       case IPR_HOST_RCB_OVERLAY_ID_7:
+               ipr_log_dual_ioa_error(ioa_cfg, hostrcb);
+               break;
+       case IPR_HOST_RCB_OVERLAY_ID_12:
+               ipr_log_enhanced_cache_error(ioa_cfg, hostrcb);
+               break;
+       case IPR_HOST_RCB_OVERLAY_ID_13:
+               ipr_log_enhanced_config_error(ioa_cfg, hostrcb);
+               break;
+       case IPR_HOST_RCB_OVERLAY_ID_14:
+       case IPR_HOST_RCB_OVERLAY_ID_16:
+               ipr_log_enhanced_array_error(ioa_cfg, hostrcb);
                break;
+       case IPR_HOST_RCB_OVERLAY_ID_17:
+               ipr_log_enhanced_dual_ioa_error(ioa_cfg, hostrcb);
+               break;
+       case IPR_HOST_RCB_OVERLAY_ID_1:
+       case IPR_HOST_RCB_OVERLAY_ID_DEFAULT:
        default:
-               dev_err(&ioa_cfg->pdev->dev,
-                       "Unknown error received. Overlay ID: %d\n",
-                       hostrcb->hcam.overlay_id);
+               ipr_log_generic_error(ioa_cfg, hostrcb);
                break;
        }
 }
@@ -1972,6 +2180,103 @@ static struct bin_attribute ipr_trace_attr = {
 };
 #endif
 
+static const struct {
+       enum ipr_cache_state state;
+       char *name;
+} cache_state [] = {
+       { CACHE_NONE, "none" },
+       { CACHE_DISABLED, "disabled" },
+       { CACHE_ENABLED, "enabled" }
+};
+
+/**
+ * ipr_show_write_caching - Show the write caching attribute
+ * @class_dev: class device struct
+ * @buf:               buffer
+ *
+ * Return value:
+ *     number of bytes printed to buffer
+ **/
+static ssize_t ipr_show_write_caching(struct class_device *class_dev, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(class_dev);
+       struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
+       unsigned long lock_flags = 0;
+       int i, len = 0;
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+       for (i = 0; i < ARRAY_SIZE(cache_state); i++) {
+               if (cache_state[i].state == ioa_cfg->cache_state) {
+                       len = snprintf(buf, PAGE_SIZE, "%s\n", cache_state[i].name);
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       return len;
+}
+
+
+/**
+ * ipr_store_write_caching - Enable/disable adapter write cache
+ * @class_dev: class_device struct
+ * @buf:               buffer
+ * @count:             buffer size
+ *
+ * This function will enable/disable adapter write cache.
+ *
+ * Return value:
+ *     count on success / other on failure
+ **/
+static ssize_t ipr_store_write_caching(struct class_device *class_dev,
+                                       const char *buf, size_t count)
+{
+       struct Scsi_Host *shost = class_to_shost(class_dev);
+       struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
+       unsigned long lock_flags = 0;
+       enum ipr_cache_state new_state = CACHE_INVALID;
+       int i;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+       if (ioa_cfg->cache_state == CACHE_NONE)
+               return -EINVAL;
+
+       for (i = 0; i < ARRAY_SIZE(cache_state); i++) {
+               if (!strncmp(cache_state[i].name, buf, strlen(cache_state[i].name))) {
+                       new_state = cache_state[i].state;
+                       break;
+               }
+       }
+
+       if (new_state != CACHE_DISABLED && new_state != CACHE_ENABLED)
+               return -EINVAL;
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+       if (ioa_cfg->cache_state == new_state) {
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+               return count;
+       }
+
+       ioa_cfg->cache_state = new_state;
+       dev_info(&ioa_cfg->pdev->dev, "%s adapter write cache.\n",
+                new_state == CACHE_ENABLED ? "Enabling" : "Disabling");
+       if (!ioa_cfg->in_reset_reload)
+               ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
+
+       return count;
+}
+
+static struct class_device_attribute ipr_ioa_cache_attr = {
+       .attr = {
+               .name =         "write_cache",
+               .mode =         S_IRUGO | S_IWUSR,
+       },
+       .show = ipr_show_write_caching,
+       .store = ipr_store_write_caching
+};
+
 /**
  * ipr_show_fw_version - Show the firmware version
  * @class_dev: class device struct
@@ -2111,6 +2416,74 @@ static struct class_device_attribute ipr_diagnostics_attr = {
        .store = ipr_store_diagnostics
 };
 
+/**
+ * ipr_show_adapter_state - Show the adapter's state
+ * @class_dev: class device struct
+ * @buf:               buffer
+ *
+ * Return value:
+ *     number of bytes printed to buffer
+ **/
+static ssize_t ipr_show_adapter_state(struct class_device *class_dev, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(class_dev);
+       struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
+       unsigned long lock_flags = 0;
+       int len;
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+       if (ioa_cfg->ioa_is_dead)
+               len = snprintf(buf, PAGE_SIZE, "offline\n");
+       else
+               len = snprintf(buf, PAGE_SIZE, "online\n");
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       return len;
+}
+
+/**
+ * ipr_store_adapter_state - Change adapter state
+ * @class_dev: class_device struct
+ * @buf:               buffer
+ * @count:             buffer size
+ *
+ * This function will change the adapter's state.
+ *
+ * Return value:
+ *     count on success / other on failure
+ **/
+static ssize_t ipr_store_adapter_state(struct class_device *class_dev,
+                                      const char *buf, size_t count)
+{
+       struct Scsi_Host *shost = class_to_shost(class_dev);
+       struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
+       unsigned long lock_flags;
+       int result = count;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+       if (ioa_cfg->ioa_is_dead && !strncmp(buf, "online", 6)) {
+               ioa_cfg->ioa_is_dead = 0;
+               ioa_cfg->reset_retries = 0;
+               ioa_cfg->in_ioa_bringdown = 0;
+               ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
+       }
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
+
+       return result;
+}
+
+static struct class_device_attribute ipr_ioa_state_attr = {
+       .attr = {
+               .name =         "state",
+               .mode =         S_IRUGO | S_IWUSR,
+       },
+       .show = ipr_show_adapter_state,
+       .store = ipr_store_adapter_state
+};
+
 /**
  * ipr_store_reset_adapter - Reset the adapter
  * @class_dev: class_device struct
@@ -2183,7 +2556,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)
                num_elem = buf_len / bsize_elem;
 
        /* Allocate a scatter/gather list for the DMA */
-       sglist = kmalloc(sizeof(struct ipr_sglist) +
+       sglist = kzalloc(sizeof(struct ipr_sglist) +
                         (sizeof(struct scatterlist) * (num_elem - 1)),
                         GFP_KERNEL);
 
@@ -2192,9 +2565,6 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)
                return NULL;
        }
 
-       memset(sglist, 0, sizeof(struct ipr_sglist) +
-              (sizeof(struct scatterlist) * (num_elem - 1)));
-
        scatterlist = sglist->scatterlist;
 
        sglist->order = order;
@@ -2289,31 +2659,24 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist,
 }
 
 /**
- * ipr_map_ucode_buffer - Map a microcode download buffer
+ * ipr_build_ucode_ioadl - Build a microcode download IOADL
  * @ipr_cmd:   ipr command struct
  * @sglist:            scatter/gather list
- * @len:               total length of download buffer
  *
- * Maps a microcode download scatter/gather list for DMA and
- * builds the IOADL.
+ * Builds a microcode download IOA data list (IOADL).
  *
- * Return value:
- *     0 on success / -EIO on failure
  **/
-static int ipr_map_ucode_buffer(struct ipr_cmnd *ipr_cmd,
-                               struct ipr_sglist *sglist, int len)
+static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd,
+                                 struct ipr_sglist *sglist)
 {
-       struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
        struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
        struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
        struct scatterlist *scatterlist = sglist->scatterlist;
        int i;
 
-       ipr_cmd->dma_use_sg = pci_map_sg(ioa_cfg->pdev, scatterlist,
-                                        sglist->num_sg, DMA_TO_DEVICE);
-
+       ipr_cmd->dma_use_sg = sglist->num_dma_sg;
        ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
-       ioarcb->write_data_transfer_length = cpu_to_be32(len);
+       ioarcb->write_data_transfer_length = cpu_to_be32(sglist->buffer_len);
        ioarcb->write_ioadl_len =
                cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
 
@@ -2324,15 +2687,52 @@ static int ipr_map_ucode_buffer(struct ipr_cmnd *ipr_cmd,
                        cpu_to_be32(sg_dma_address(&scatterlist[i]));
        }
 
-       if (likely(ipr_cmd->dma_use_sg)) {
-               ioadl[i-1].flags_and_data_len |=
-                       cpu_to_be32(IPR_IOADL_FLAGS_LAST);
+       ioadl[i-1].flags_and_data_len |=
+               cpu_to_be32(IPR_IOADL_FLAGS_LAST);
+}
+
+/**
+ * ipr_update_ioa_ucode - Update IOA's microcode
+ * @ioa_cfg:   ioa config struct
+ * @sglist:            scatter/gather list
+ *
+ * Initiate an adapter reset to update the IOA's microcode
+ *
+ * Return value:
+ *     0 on success / -EIO on failure
+ **/
+static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
+                               struct ipr_sglist *sglist)
+{
+       unsigned long lock_flags;
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+
+       if (ioa_cfg->ucode_sglist) {
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+               dev_err(&ioa_cfg->pdev->dev,
+                       "Microcode download already in progress\n");
+               return -EIO;
        }
-       else {
-               dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n");
+
+       sglist->num_dma_sg = pci_map_sg(ioa_cfg->pdev, sglist->scatterlist,
+                                       sglist->num_sg, DMA_TO_DEVICE);
+
+       if (!sglist->num_dma_sg) {
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+               dev_err(&ioa_cfg->pdev->dev,
+                       "Failed to map microcode download buffer!\n");
                return -EIO;
        }
 
+       ioa_cfg->ucode_sglist = sglist;
+       ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
+
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+       ioa_cfg->ucode_sglist = NULL;
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
        return 0;
 }
 
@@ -2355,7 +2755,6 @@ static ssize_t ipr_store_update_fw(struct class_device *class_dev,
        struct ipr_ucode_image_header *image_hdr;
        const struct firmware *fw_entry;
        struct ipr_sglist *sglist;
-       unsigned long lock_flags;
        char fname[100];
        char *src;
        int len, result, dnld_size;
@@ -2396,35 +2795,17 @@ static ssize_t ipr_store_update_fw(struct class_device *class_dev,
        if (result) {
                dev_err(&ioa_cfg->pdev->dev,
                        "Microcode buffer copy to DMA buffer failed\n");
-               ipr_free_ucode_buffer(sglist);
-               release_firmware(fw_entry);
-               return result;
-       }
-
-       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
-
-       if (ioa_cfg->ucode_sglist) {
-               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
-               dev_err(&ioa_cfg->pdev->dev,
-                       "Microcode download already in progress\n");
-               ipr_free_ucode_buffer(sglist);
-               release_firmware(fw_entry);
-               return -EIO;
+               goto out;
        }
 
-       ioa_cfg->ucode_sglist = sglist;
-       ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
-       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
-       wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
-
-       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
-       ioa_cfg->ucode_sglist = NULL;
-       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       result = ipr_update_ioa_ucode(ioa_cfg, sglist);
 
+       if (!result)
+               result = count;
+out:
        ipr_free_ucode_buffer(sglist);
        release_firmware(fw_entry);
-
-       return count;
+       return result;
 }
 
 static struct class_device_attribute ipr_update_fw_attr = {
@@ -2439,8 +2820,10 @@ static struct class_device_attribute *ipr_ioa_attrs[] = {
        &ipr_fw_version_attr,
        &ipr_log_level_attr,
        &ipr_diagnostics_attr,
+       &ipr_ioa_state_attr,
        &ipr_ioa_reset_attr,
        &ipr_update_fw_attr,
+       &ipr_ioa_cache_attr,
        NULL,
 };
 
@@ -2548,14 +2931,13 @@ static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg)
        unsigned long lock_flags = 0;
 
        ENTER;
-       dump = kmalloc(sizeof(struct ipr_dump), GFP_KERNEL);
+       dump = kzalloc(sizeof(struct ipr_dump), GFP_KERNEL);
 
        if (!dump) {
                ipr_err("Dump memory allocation failed\n");
                return -ENOMEM;
        }
 
-       memset(dump, 0, sizeof(struct ipr_dump));
        kref_init(&dump->kref);
        dump->ioa_cfg = ioa_cfg;
 
@@ -2824,8 +3206,10 @@ static int ipr_slave_configure(struct scsi_device *sdev)
        if (res) {
                if (ipr_is_af_dasd_device(res))
                        sdev->type = TYPE_RAID;
-               if (ipr_is_af_dasd_device(res) || ipr_is_ioa_resource(res))
+               if (ipr_is_af_dasd_device(res) || ipr_is_ioa_resource(res)) {
                        sdev->scsi_level = 4;
+                       sdev->no_uld_attach = 1;
+               }
                if (ipr_is_vset_device(res)) {
                        sdev->timeout = IPR_VSET_RW_TIMEOUT;
                        blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS);
@@ -2848,13 +3232,14 @@ static int ipr_slave_configure(struct scsi_device *sdev)
  * handling new commands.
  *
  * Return value:
- *     0 on success
+ *     0 on success / -ENXIO if device does not exist
  **/
 static int ipr_slave_alloc(struct scsi_device *sdev)
 {
        struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
        struct ipr_resource_entry *res;
        unsigned long lock_flags;
+       int rc = -ENXIO;
 
        sdev->hostdata = NULL;
 
@@ -2868,14 +3253,16 @@ static int ipr_slave_alloc(struct scsi_device *sdev)
                        res->add_to_ml = 0;
                        res->in_erp = 0;
                        sdev->hostdata = res;
-                       res->needs_sync_complete = 1;
+                       if (!ipr_is_naca_model(res))
+                               res->needs_sync_complete = 1;
+                       rc = 0;
                        break;
                }
        }
 
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
-       return 0;
+       return rc;
 }
 
 /**
@@ -2939,7 +3326,7 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
        ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
        res = scsi_cmd->device->hostdata;
 
-       if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res)))
+       if (!res)
                return FAILED;
 
        /*
@@ -3131,7 +3518,8 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
        }
 
        list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
-       res->needs_sync_complete = 1;
+       if (!ipr_is_naca_model(res))
+               res->needs_sync_complete = 1;
 
        LEAVE;
        return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS);
@@ -3435,7 +3823,8 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
        }
 
        if (res) {
-               res->needs_sync_complete = 1;
+               if (!ipr_is_naca_model(res))
+                       res->needs_sync_complete = 1;
                res->in_erp = 0;
        }
        ipr_unmap_sglist(ioa_cfg, ipr_cmd);
@@ -3704,6 +4093,30 @@ static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
        }
 }
 
+/**
+ * ipr_get_autosense - Copy autosense data to sense buffer
+ * @ipr_cmd:   ipr command struct
+ *
+ * This function copies the autosense buffer to the buffer
+ * in the scsi_cmd, if there is autosense available.
+ *
+ * Return value:
+ *     1 if autosense was available / 0 if not
+ **/
+static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
+{
+       struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
+
+       if ((be32_to_cpu(ioasa->ioasc_specific) &
+            (IPR_ADDITIONAL_STATUS_FMT | IPR_AUTOSENSE_VALID)) == 0)
+               return 0;
+
+       memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
+              min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len),
+                  SCSI_SENSE_BUFFERSIZE));
+       return 1;
+}
+
 /**
  * ipr_erp_start - Process an error response for a SCSI op
  * @ioa_cfg:   ioa config struct
@@ -3734,14 +4147,19 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
 
        switch (ioasc & IPR_IOASC_IOASC_MASK) {
        case IPR_IOASC_ABORTED_CMD_TERM_BY_HOST:
-               scsi_cmd->result |= (DID_IMM_RETRY << 16);
+               if (ipr_is_naca_model(res))
+                       scsi_cmd->result |= (DID_ABORT << 16);
+               else
+                       scsi_cmd->result |= (DID_IMM_RETRY << 16);
                break;
        case IPR_IOASC_IR_RESOURCE_HANDLE:
+       case IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA:
                scsi_cmd->result |= (DID_NO_CONNECT << 16);
                break;
        case IPR_IOASC_HW_SEL_TIMEOUT:
                scsi_cmd->result |= (DID_NO_CONNECT << 16);
-               res->needs_sync_complete = 1;
+               if (!ipr_is_naca_model(res))
+                       res->needs_sync_complete = 1;
                break;
        case IPR_IOASC_SYNC_REQUIRED:
                if (!res->in_erp)
@@ -3749,6 +4167,7 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
                scsi_cmd->result |= (DID_IMM_RETRY << 16);
                break;
        case IPR_IOASC_MED_DO_NOT_REALLOC: /* prevent retries */
+       case IPR_IOASA_IR_DUAL_IOA_DISABLED:
                scsi_cmd->result |= (DID_PASSTHROUGH << 16);
                break;
        case IPR_IOASC_BUS_WAS_RESET:
@@ -3760,21 +4179,27 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
                if (!res->resetting_device)
                        scsi_report_bus_reset(ioa_cfg->host, scsi_cmd->device->channel);
                scsi_cmd->result |= (DID_ERROR << 16);
-               res->needs_sync_complete = 1;
+               if (!ipr_is_naca_model(res))
+                       res->needs_sync_complete = 1;
                break;
        case IPR_IOASC_HW_DEV_BUS_STATUS:
                scsi_cmd->result |= IPR_IOASC_SENSE_STATUS(ioasc);
                if (IPR_IOASC_SENSE_STATUS(ioasc) == SAM_STAT_CHECK_CONDITION) {
-                       ipr_erp_cancel_all(ipr_cmd);
-                       return;
+                       if (!ipr_get_autosense(ipr_cmd)) {
+                               if (!ipr_is_naca_model(res)) {
+                                       ipr_erp_cancel_all(ipr_cmd);
+                                       return;
+                               }
+                       }
                }
-               res->needs_sync_complete = 1;
+               if (!ipr_is_naca_model(res))
+                       res->needs_sync_complete = 1;
                break;
        case IPR_IOASC_NR_INIT_CMD_REQUIRED:
                break;
        default:
                scsi_cmd->result |= (DID_ERROR << 16);
-               if (!ipr_is_vset_device(res))
+               if (!ipr_is_vset_device(res) && !ipr_is_naca_model(res))
                        res->needs_sync_complete = 1;
                break;
        }
@@ -4073,6 +4498,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
        ioa_cfg->in_reset_reload = 0;
        ioa_cfg->allow_cmds = 1;
        ioa_cfg->reset_cmd = NULL;
+       ioa_cfg->doorbell |= IPR_RUNTIME_RESET;
 
        list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
                if (ioa_cfg->allow_ml_add_del && (res->add_to_ml || res->del_from_ml)) {
@@ -4146,7 +4572,7 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
        ipr_cmd->job_step = ipr_ioa_reset_done;
 
        list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) {
-               if (!ipr_is_af_dasd_device(res))
+               if (!IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data))
                        continue;
 
                ipr_cmd->u.res = res;
@@ -4178,6 +4604,36 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
        return IPR_RC_JOB_CONTINUE;
 }
 
+/**
+ * ipr_setup_write_cache - Disable write cache if needed
+ * @ipr_cmd:   ipr command struct
+ *
+ * This function sets up adapters write cache to desired setting
+ *
+ * Return value:
+ *     IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
+ **/
+static int ipr_setup_write_cache(struct ipr_cmnd *ipr_cmd)
+{
+       struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
+
+       ipr_cmd->job_step = ipr_set_supported_devs;
+       ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
+                                   struct ipr_resource_entry, queue);
+
+       if (ioa_cfg->cache_state != CACHE_DISABLED)
+               return IPR_RC_JOB_CONTINUE;
+
+       ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
+       ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
+       ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
+       ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
+
+       ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
+
+       return IPR_RC_JOB_RETURN;
+}
+
 /**
  * ipr_get_mode_page - Locate specified mode page
  * @mode_pages:        mode page buffer
@@ -4389,10 +4845,7 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
                              ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages),
                              length);
 
-       ipr_cmd->job_step = ipr_set_supported_devs;
-       ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
-                                   struct ipr_resource_entry, queue);
-
+       ipr_cmd->job_step = ipr_setup_write_cache;
        ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
 
        LEAVE;
@@ -4430,6 +4883,51 @@ static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd,
        ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len);
 }
 
+/**
+ * ipr_reset_cmd_failed - Handle failure of IOA reset command
+ * @ipr_cmd:   ipr command struct
+ *
+ * This function handles the failure of an IOA bringup command.
+ *
+ * Return value:
+ *     IPR_RC_JOB_RETURN
+ **/
+static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
+{
+       struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
+       u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
+
+       dev_err(&ioa_cfg->pdev->dev,
+               "0x%02X failed with IOASC: 0x%08X\n",
+               ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
+
+       ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
+       list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
+       return IPR_RC_JOB_RETURN;
+}
+
+/**
+ * ipr_reset_mode_sense_failed - Handle failure of IOAFP mode sense
+ * @ipr_cmd:   ipr command struct
+ *
+ * This function handles the failure of a Mode Sense to the IOAFP.
+ * Some adapters do not handle all mode pages.
+ *
+ * Return value:
+ *     IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
+ **/
+static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
+{
+       u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
+
+       if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) {
+               ipr_cmd->job_step = ipr_setup_write_cache;
+               return IPR_RC_JOB_CONTINUE;
+       }
+
+       return ipr_reset_cmd_failed(ipr_cmd);
+}
+
 /**
  * ipr_ioafp_mode_sense_page28 - Issue Mode Sense Page 28 to IOA
  * @ipr_cmd:   ipr command struct
@@ -4451,6 +4949,7 @@ static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd)
                             sizeof(struct ipr_mode_pages));
 
        ipr_cmd->job_step = ipr_ioafp_mode_select_page28;
+       ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed;
 
        ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
 
@@ -4611,6 +5110,27 @@ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
        LEAVE;
 }
 
+/**
+ * ipr_inquiry_page_supported - Is the given inquiry page supported
+ * @page0:             inquiry page 0 buffer
+ * @page:              page code.
+ *
+ * This function determines if the specified inquiry page is supported.
+ *
+ * Return value:
+ *     1 if page is supported / 0 if not
+ **/
+static int ipr_inquiry_page_supported(struct ipr_inquiry_page0 *page0, u8 page)
+{
+       int i;
+
+       for (i = 0; i < min_t(u8, page0->len, IPR_INQUIRY_PAGE0_ENTRIES); i++)
+               if (page0->page[i] == page)
+                       return 1;
+
+       return 0;
+}
+
 /**
  * ipr_ioafp_page3_inquiry - Send a Page 3 Inquiry to the adapter.
  * @ipr_cmd:   ipr command struct
@@ -4622,6 +5142,36 @@ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
  *     IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
  **/
 static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
+{
+       struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
+       struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data;
+
+       ENTER;
+
+       if (!ipr_inquiry_page_supported(page0, 1))
+               ioa_cfg->cache_state = CACHE_NONE;
+
+       ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
+
+       ipr_ioafp_inquiry(ipr_cmd, 1, 3,
+                         ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data),
+                         sizeof(struct ipr_inquiry_page3));
+
+       LEAVE;
+       return IPR_RC_JOB_RETURN;
+}
+
+/**
+ * ipr_ioafp_page0_inquiry - Send a Page 0 Inquiry to the adapter.
+ * @ipr_cmd:   ipr command struct
+ *
+ * This function sends a Page 0 inquiry to the adapter
+ * to retrieve supported inquiry pages.
+ *
+ * Return value:
+ *     IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
+ **/
+static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd)
 {
        struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
        char type[5];
@@ -4633,11 +5183,11 @@ static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
        type[4] = '\0';
        ioa_cfg->type = simple_strtoul((char *)type, NULL, 16);
 
-       ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
+       ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
 
-       ipr_ioafp_inquiry(ipr_cmd, 1, 3,
-                         ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data),
-                         sizeof(struct ipr_inquiry_page3));
+       ipr_ioafp_inquiry(ipr_cmd, 1, 0,
+                         ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page0_data),
+                         sizeof(struct ipr_inquiry_page0));
 
        LEAVE;
        return IPR_RC_JOB_RETURN;
@@ -4657,7 +5207,7 @@ static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd)
        struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
 
        ENTER;
-       ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
+       ipr_cmd->job_step = ipr_ioafp_page0_inquiry;
 
        ipr_ioafp_inquiry(ipr_cmd, 0, 0,
                          ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, ioa_vpd),
@@ -4815,7 +5365,7 @@ static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
        }
 
        /* Enable destructive diagnostics on IOA */
-       writel(IPR_DOORBELL, ioa_cfg->regs.set_uproc_interrupt_reg);
+       writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg);
 
        writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg);
        int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
@@ -5147,12 +5697,7 @@ static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd)
        ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8;
        ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff;
 
-       if (ipr_map_ucode_buffer(ipr_cmd, sglist, sglist->buffer_len)) {
-               dev_err(&ioa_cfg->pdev->dev,
-                       "Failed to map microcode download buffer\n");
-               return IPR_RC_JOB_CONTINUE;
-       }
-
+       ipr_build_ucode_ioadl(ipr_cmd, sglist);
        ipr_cmd->job_step = ipr_reset_ucode_download_done;
 
        ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
@@ -5217,7 +5762,6 @@ static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
 {
        u32 rc, ioasc;
-       unsigned long scratch = ipr_cmd->u.scratch;
        struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
 
        do {
@@ -5233,17 +5777,13 @@ static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
                }
 
                if (IPR_IOASC_SENSE_KEY(ioasc)) {
-                       dev_err(&ioa_cfg->pdev->dev,
-                               "0x%02X failed with IOASC: 0x%08X\n",
-                               ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
-
-                       ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
-                       list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
-                       return;
+                       rc = ipr_cmd->job_step_failed(ipr_cmd);
+                       if (rc == IPR_RC_JOB_RETURN)
+                               return;
                }
 
                ipr_reinit_ipr_cmnd(ipr_cmd);
-               ipr_cmd->u.scratch = scratch;
+               ipr_cmd->job_step_failed = ipr_reset_cmd_failed;
                rc = ipr_cmd->job_step(ipr_cmd);
        } while(rc == IPR_RC_JOB_CONTINUE);
 }
@@ -5517,15 +6057,12 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
        int i, rc = -ENOMEM;
 
        ENTER;
-       ioa_cfg->res_entries = kmalloc(sizeof(struct ipr_resource_entry) *
+       ioa_cfg->res_entries = kzalloc(sizeof(struct ipr_resource_entry) *
                                       IPR_MAX_PHYSICAL_DEVS, GFP_KERNEL);
 
        if (!ioa_cfg->res_entries)
                goto out;
 
-       memset(ioa_cfg->res_entries, 0,
-              sizeof(struct ipr_resource_entry) * IPR_MAX_PHYSICAL_DEVS);
-
        for (i = 0; i < IPR_MAX_PHYSICAL_DEVS; i++)
                list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q);
 
@@ -5566,15 +6103,12 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
                list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q);
        }
 
-       ioa_cfg->trace = kmalloc(sizeof(struct ipr_trace_entry) *
+       ioa_cfg->trace = kzalloc(sizeof(struct ipr_trace_entry) *
                                 IPR_NUM_TRACE_ENTRIES, GFP_KERNEL);
 
        if (!ioa_cfg->trace)
                goto out_free_hostrcb_dma;
 
-       memset(ioa_cfg->trace, 0,
-              sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES);
-
        rc = 0;
 out:
        LEAVE;
@@ -5642,6 +6176,9 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
        ioa_cfg->host = host;
        ioa_cfg->pdev = pdev;
        ioa_cfg->log_level = ipr_log_level;
+       ioa_cfg->doorbell = IPR_DOORBELL;
+       if (!ipr_auto_create)
+               ioa_cfg->doorbell |= IPR_RUNTIME_RESET;
        sprintf(ioa_cfg->eye_catcher, IPR_EYECATCHER);
        sprintf(ioa_cfg->trace_start, IPR_TRACE_START_LABEL);
        sprintf(ioa_cfg->ipr_free_label, IPR_FREEQ_LABEL);
@@ -5660,6 +6197,10 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
        INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread, ioa_cfg);
        init_waitqueue_head(&ioa_cfg->reset_wait_q);
        ioa_cfg->sdt_state = INACTIVE;
+       if (ipr_enable_cache)
+               ioa_cfg->cache_state = CACHE_ENABLED;
+       else
+               ioa_cfg->cache_state = CACHE_DISABLED;
 
        ipr_initialize_bus_attr(ioa_cfg);
 
@@ -6008,6 +6549,7 @@ static int __devinit ipr_probe(struct pci_dev *pdev,
        ipr_scan_vsets(ioa_cfg);
        scsi_add_device(ioa_cfg->host, IPR_IOA_BUS, IPR_IOA_TARGET, IPR_IOA_LUN);
        ioa_cfg->allow_ml_add_del = 1;
+       ioa_cfg->host->max_channel = IPR_VSET_BUS;
        schedule_work(&ioa_cfg->work_q);
        return 0;
 }
@@ -6055,12 +6597,30 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = {
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
                PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571A,
              0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575B,
+               0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A,
+             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B,
+             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A,
+             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+       { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B,
+             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE,
                PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_2780,
                0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] },
        { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
                PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571E,
                0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] },
+       { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571F,
+               0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] },
        { }
 };
 MODULE_DEVICE_TABLE(pci, ipr_pci_table);
index 8cf9671085004a2b31fd26a4f98d397706c12967..6bec673c925c20e0efb9d68010e016b91ddbde66 100644 (file)
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.0.14"
-#define IPR_DRIVER_DATE "(May 2, 2005)"
-
-/*
- * IPR_DBG_TRACE: Setting this to 1 will turn on some general function tracing
- *                     resulting in a bunch of extra debugging printks to the console
- *
- * IPR_DEBUG:  Setting this to 1 will turn on some error path tracing.
- *                     Enables the ipr_trace macro.
- */
-#ifdef IPR_DEBUG_ALL
-#define IPR_DEBUG                              1
-#define IPR_DBG_TRACE                  1
-#else
-#define IPR_DEBUG                              0
-#define IPR_DBG_TRACE                  0
-#endif
+#define IPR_DRIVER_VERSION "2.1.0"
+#define IPR_DRIVER_DATE "(October 31, 2005)"
 
 /*
  * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
 #define IPR_SUBS_DEV_ID_571A   0x02C0
 #define IPR_SUBS_DEV_ID_571B   0x02BE
 #define IPR_SUBS_DEV_ID_571E  0x02BF
+#define IPR_SUBS_DEV_ID_571F   0x02D5
+#define IPR_SUBS_DEV_ID_572A   0x02C1
+#define IPR_SUBS_DEV_ID_572B   0x02C2
+#define IPR_SUBS_DEV_ID_575B   0x030D
 
 #define IPR_NAME                               "ipr"
 
 #define IPR_IOASC_HW_DEV_BUS_STATUS                    0x04448500
 #define        IPR_IOASC_IOASC_MASK                    0xFFFFFF00
 #define        IPR_IOASC_SCSI_STATUS_MASK              0x000000FF
+#define IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT   0x05240000
 #define IPR_IOASC_IR_RESOURCE_HANDLE           0x05250000
+#define IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA                0x05258100
+#define IPR_IOASA_IR_DUAL_IOA_DISABLED         0x052C8000
 #define IPR_IOASC_BUS_WAS_RESET                        0x06290000
 #define IPR_IOASC_BUS_WAS_RESET_BY_OTHER               0x06298000
 #define IPR_IOASC_ABORTED_CMD_TERM_BY_HOST     0x0B5A0000
 #define IPR_NUM_LOG_HCAMS                              2
 #define IPR_NUM_CFG_CHG_HCAMS                          2
 #define IPR_NUM_HCAMS  (IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS)
-#define IPR_MAX_NUM_TARGETS_PER_BUS                    0x10
+#define IPR_MAX_NUM_TARGETS_PER_BUS                    256
 #define IPR_MAX_NUM_LUNS_PER_TARGET                    256
 #define IPR_MAX_NUM_VSET_LUNS_PER_TARGET       8
 #define IPR_VSET_BUS                                   0xff
 #define IPR_IOA_BUS                                            0xff
 #define IPR_IOA_TARGET                                 0xff
 #define IPR_IOA_LUN                                            0xff
-#define IPR_MAX_NUM_BUSES                              4
+#define IPR_MAX_NUM_BUSES                              8
 #define IPR_MAX_BUS_TO_SCAN                            IPR_MAX_NUM_BUSES
 
 #define IPR_NUM_RESET_RELOAD_RETRIES           3
 #define IPR_SDT_FMT2_EXP_ROM_SEL                       0x8
 #define IPR_FMT2_SDT_READY_TO_USE                      0xC4D4E3F2
 #define IPR_DOORBELL                                   0x82800000
+#define IPR_RUNTIME_RESET                              0x40000000
 
 #define IPR_PCII_IOA_TRANS_TO_OPER                     (0x80000000 >> 0)
 #define IPR_PCII_IOARCB_XFER_FAILED                    (0x80000000 >> 3)
@@ -261,6 +254,16 @@ struct ipr_std_inq_vpids {
        u8 product_id[IPR_PROD_ID_LEN];
 }__attribute__((packed));
 
+struct ipr_vpd {
+       struct ipr_std_inq_vpids vpids;
+       u8 sn[IPR_SERIAL_NUM_LEN];
+}__attribute__((packed));
+
+struct ipr_ext_vpd {
+       struct ipr_vpd vpd;
+       __be32 wwid[2];
+}__attribute__((packed));
+
 struct ipr_std_inq_data {
        u8 peri_qual_dev_type;
 #define IPR_STD_INQ_PERI_QUAL(peri) ((peri) >> 5)
@@ -304,6 +307,10 @@ struct ipr_config_table_entry {
 #define IPR_SUBTYPE_GENERIC_SCSI       1
 #define IPR_SUBTYPE_VOLUME_SET         2
 
+#define IPR_QUEUEING_MODEL(res)        ((((res)->cfgte.flags) & 0x70) >> 4)
+#define IPR_QUEUE_FROZEN_MODEL 0
+#define IPR_QUEUE_NACA_MODEL           1
+
        struct ipr_res_addr res_addr;
        __be32 res_handle;
        __be32 reserved4[2];
@@ -410,23 +417,26 @@ struct ipr_ioadl_desc {
 struct ipr_ioasa_vset {
        __be32 failing_lba_hi;
        __be32 failing_lba_lo;
-       __be32 ioa_data[22];
+       __be32 reserved;
 }__attribute__((packed, aligned (4)));
 
 struct ipr_ioasa_af_dasd {
        __be32 failing_lba;
+       __be32 reserved[2];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_ioasa_gpdd {
        u8 end_state;
        u8 bus_phase;
        __be16 reserved;
-       __be32 ioa_data[23];
+       __be32 ioa_data[2];
 }__attribute__((packed, aligned (4)));
 
-struct ipr_ioasa_raw {
-       __be32 ioa_data[24];
-}__attribute__((packed, aligned (4)));
+struct ipr_auto_sense {
+       __be16 auto_sense_len;
+       __be16 ioa_data_len;
+       __be32 data[SCSI_SENSE_BUFFERSIZE/sizeof(__be32)];
+};
 
 struct ipr_ioasa {
        __be32 ioasc;
@@ -453,6 +463,8 @@ struct ipr_ioasa {
        __be32 fd_res_handle;
 
        __be32 ioasc_specific;  /* status code specific field */
+#define IPR_ADDITIONAL_STATUS_FMT              0x80000000
+#define IPR_AUTOSENSE_VALID                    0x40000000
 #define IPR_IOASC_SPECIFIC_MASK                0x00ffffff
 #define IPR_FIELD_POINTER_VALID                (0x80000000 >> 8)
 #define IPR_FIELD_POINTER_MASK         0x0000ffff
@@ -461,8 +473,9 @@ struct ipr_ioasa {
                struct ipr_ioasa_vset vset;
                struct ipr_ioasa_af_dasd dasd;
                struct ipr_ioasa_gpdd gpdd;
-               struct ipr_ioasa_raw raw;
        } u;
+
+       struct ipr_auto_sense auto_sense;
 }__attribute__((packed, aligned (4)));
 
 struct ipr_mode_parm_hdr {
@@ -536,28 +549,49 @@ struct ipr_inquiry_page3 {
        u8 patch_number[4];
 }__attribute__((packed));
 
+#define IPR_INQUIRY_PAGE0_ENTRIES 20
+struct ipr_inquiry_page0 {
+       u8 peri_qual_dev_type;
+       u8 page_code;
+       u8 reserved1;
+       u8 len;
+       u8 page[IPR_INQUIRY_PAGE0_ENTRIES];
+}__attribute__((packed));
+
 struct ipr_hostrcb_device_data_entry {
-       struct ipr_std_inq_vpids dev_vpids;
-       u8 dev_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd vpd;
        struct ipr_res_addr dev_res_addr;
-       struct ipr_std_inq_vpids new_dev_vpids;
-       u8 new_dev_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids ioa_last_with_dev_vpids;
-       u8 ioa_last_with_dev_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids cfc_last_with_dev_vpids;
-       u8 cfc_last_with_dev_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd new_vpd;
+       struct ipr_vpd ioa_last_with_dev_vpd;
+       struct ipr_vpd cfc_last_with_dev_vpd;
        __be32 ioa_data[5];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_device_data_entry_enhanced {
+       struct ipr_ext_vpd vpd;
+       u8 ccin[4];
+       struct ipr_res_addr dev_res_addr;
+       struct ipr_ext_vpd new_vpd;
+       u8 new_ccin[4];
+       struct ipr_ext_vpd ioa_last_with_dev_vpd;
+       struct ipr_ext_vpd cfc_last_with_dev_vpd;
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_array_data_entry {
-       struct ipr_std_inq_vpids vpids;
-       u8 serial_num[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd vpd;
+       struct ipr_res_addr expected_dev_res_addr;
+       struct ipr_res_addr dev_res_addr;
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_array_data_entry_enhanced {
+       struct ipr_ext_vpd vpd;
+       u8 ccin[4];
        struct ipr_res_addr expected_dev_res_addr;
        struct ipr_res_addr dev_res_addr;
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_ff_error {
-       __be32 ioa_data[246];
+       __be32 ioa_data[502];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_01_error {
@@ -568,47 +602,75 @@ struct ipr_hostrcb_type_01_error {
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_02_error {
-       struct ipr_std_inq_vpids ioa_vpids;
-       u8 ioa_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids cfc_vpids;
-       u8 cfc_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids ioa_last_attached_to_cfc_vpids;
-       u8 ioa_last_attached_to_cfc_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids cfc_last_attached_to_ioa_vpids;
-       u8 cfc_last_attached_to_ioa_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd ioa_vpd;
+       struct ipr_vpd cfc_vpd;
+       struct ipr_vpd ioa_last_attached_to_cfc_vpd;
+       struct ipr_vpd cfc_last_attached_to_ioa_vpd;
+       __be32 ioa_data[3];
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_type_12_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       struct ipr_ext_vpd ioa_last_attached_to_cfc_vpd;
+       struct ipr_ext_vpd cfc_last_attached_to_ioa_vpd;
        __be32 ioa_data[3];
-       u8 reserved[844];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_03_error {
-       struct ipr_std_inq_vpids ioa_vpids;
-       u8 ioa_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids cfc_vpids;
-       u8 cfc_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd ioa_vpd;
+       struct ipr_vpd cfc_vpd;
        __be32 errors_detected;
        __be32 errors_logged;
        u8 ioa_data[12];
-       struct ipr_hostrcb_device_data_entry dev_entry[3];
-       u8 reserved[444];
+       struct ipr_hostrcb_device_data_entry dev[3];
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_type_13_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       __be32 errors_detected;
+       __be32 errors_logged;
+       struct ipr_hostrcb_device_data_entry_enhanced dev[3];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_04_error {
-       struct ipr_std_inq_vpids ioa_vpids;
-       u8 ioa_sn[IPR_SERIAL_NUM_LEN];
-       struct ipr_std_inq_vpids cfc_vpids;
-       u8 cfc_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd ioa_vpd;
+       struct ipr_vpd cfc_vpd;
        u8 ioa_data[12];
        struct ipr_hostrcb_array_data_entry array_member[10];
        __be32 exposed_mode_adn;
        __be32 array_id;
-       struct ipr_std_inq_vpids incomp_dev_vpids;
-       u8 incomp_dev_sn[IPR_SERIAL_NUM_LEN];
+       struct ipr_vpd incomp_dev_vpd;
        __be32 ioa_data2;
        struct ipr_hostrcb_array_data_entry array_member2[8];
        struct ipr_res_addr last_func_vset_res_addr;
        u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
        u8 protection_level[8];
-       u8 reserved[124];
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_type_14_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       __be32 exposed_mode_adn;
+       __be32 array_id;
+       struct ipr_res_addr last_func_vset_res_addr;
+       u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
+       u8 protection_level[8];
+       __be32 num_entries;
+       struct ipr_hostrcb_array_data_entry_enhanced array_member[18];
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_type_07_error {
+       u8 failure_reason[64];
+       struct ipr_vpd vpd;
+       u32 data[222];
+}__attribute__((packed, aligned (4)));
+
+struct ipr_hostrcb_type_17_error {
+       u8 failure_reason[64];
+       struct ipr_ext_vpd vpd;
+       u32 data[476];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_error {
@@ -622,6 +684,11 @@ struct ipr_hostrcb_error {
                struct ipr_hostrcb_type_02_error type_02_error;
                struct ipr_hostrcb_type_03_error type_03_error;
                struct ipr_hostrcb_type_04_error type_04_error;
+               struct ipr_hostrcb_type_07_error type_07_error;
+               struct ipr_hostrcb_type_12_error type_12_error;
+               struct ipr_hostrcb_type_13_error type_13_error;
+               struct ipr_hostrcb_type_14_error type_14_error;
+               struct ipr_hostrcb_type_17_error type_17_error;
        } u;
 }__attribute__((packed, aligned (4)));
 
@@ -655,6 +722,12 @@ struct ipr_hcam {
 #define IPR_HOST_RCB_OVERLAY_ID_3                              0x03
 #define IPR_HOST_RCB_OVERLAY_ID_4                              0x04
 #define IPR_HOST_RCB_OVERLAY_ID_6                              0x06
+#define IPR_HOST_RCB_OVERLAY_ID_7                              0x07
+#define IPR_HOST_RCB_OVERLAY_ID_12                             0x12
+#define IPR_HOST_RCB_OVERLAY_ID_13                             0x13
+#define IPR_HOST_RCB_OVERLAY_ID_14                             0x14
+#define IPR_HOST_RCB_OVERLAY_ID_16                             0x16
+#define IPR_HOST_RCB_OVERLAY_ID_17                             0x17
 #define IPR_HOST_RCB_OVERLAY_ID_DEFAULT                        0xFF
 
        u8 reserved1[3];
@@ -743,6 +816,7 @@ struct ipr_resource_table {
 
 struct ipr_misc_cbs {
        struct ipr_ioa_vpd ioa_vpd;
+       struct ipr_inquiry_page0 page0_data;
        struct ipr_inquiry_page3 page3_data;
        struct ipr_mode_pages mode_pages;
        struct ipr_supported_device supp_dev;
@@ -813,6 +887,7 @@ struct ipr_trace_entry {
 struct ipr_sglist {
        u32 order;
        u32 num_sg;
+       u32 num_dma_sg;
        u32 buffer_len;
        struct scatterlist scatterlist[1];
 };
@@ -825,6 +900,13 @@ enum ipr_sdt_state {
        DUMP_OBTAINED
 };
 
+enum ipr_cache_state {
+       CACHE_NONE,
+       CACHE_DISABLED,
+       CACHE_ENABLED,
+       CACHE_INVALID
+};
+
 /* Per-controller data */
 struct ipr_ioa_cfg {
        char eye_catcher[8];
@@ -841,6 +923,7 @@ struct ipr_ioa_cfg {
        u8 allow_cmds:1;
        u8 allow_ml_add_del:1;
 
+       enum ipr_cache_state cache_state;
        u16 type; /* CCIN of the card */
 
        u8 log_level;
@@ -911,6 +994,7 @@ struct ipr_ioa_cfg {
        u16 reset_retries;
 
        u32 errors_logged;
+       u32 doorbell;
 
        struct Scsi_Host *host;
        struct pci_dev *pdev;
@@ -948,6 +1032,7 @@ struct ipr_cmnd {
        struct timer_list timer;
        void (*done) (struct ipr_cmnd *);
        int (*job_step) (struct ipr_cmnd *);
+       int (*job_step_failed) (struct ipr_cmnd *);
        u16 cmd_index;
        u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
        dma_addr_t sense_buffer_dma;
@@ -1083,11 +1168,7 @@ struct ipr_ucode_image_header {
 /*
  * Macros
  */
-#if IPR_DEBUG
-#define IPR_DBG_CMD(CMD) do { CMD; } while (0)
-#else
-#define IPR_DBG_CMD(CMD)
-#endif
+#define IPR_DBG_CMD(CMD) if (ipr_debug) { CMD; }
 
 #ifdef CONFIG_SCSI_IPR_TRACE
 #define ipr_create_trace_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
@@ -1135,16 +1216,22 @@ struct ipr_ucode_image_header {
 #define ipr_res_dbg(ioa_cfg, res, fmt, ...) \
        IPR_DBG_CMD(ipr_res_printk(KERN_INFO, ioa_cfg, res, fmt, ##__VA_ARGS__))
 
+#define ipr_phys_res_err(ioa_cfg, res, fmt, ...)                       \
+{                                                                      \
+       if ((res).bus >= IPR_MAX_NUM_BUSES) {                           \
+               ipr_err(fmt": unknown\n", ##__VA_ARGS__);               \
+       } else {                                                        \
+               ipr_err(fmt": %d:%d:%d:%d\n",                           \
+                       ##__VA_ARGS__, (ioa_cfg)->host->host_no,        \
+                       (res).bus, (res).target, (res).lun);            \
+       }                                                               \
+}
+
 #define ipr_trace ipr_dbg("%s: %s: Line: %d\n",\
        __FILE__, __FUNCTION__, __LINE__)
 
-#if IPR_DBG_TRACE
-#define ENTER printk(KERN_INFO IPR_NAME": Entering %s\n", __FUNCTION__)
-#define LEAVE printk(KERN_INFO IPR_NAME": Leaving %s\n", __FUNCTION__)
-#else
-#define ENTER
-#define LEAVE
-#endif
+#define ENTER IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Entering %s\n", __FUNCTION__))
+#define LEAVE IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Leaving %s\n", __FUNCTION__))
 
 #define ipr_err_separator \
 ipr_err("----------------------------------------------------------\n")
@@ -1216,6 +1303,20 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res)
                return 0;
 }
 
+/**
+ * ipr_is_naca_model - Determine if a resource is using NACA queueing model
+ * @res:       resource entry struct
+ *
+ * Return value:
+ *     1 if NACA queueing model / 0 if not NACA queueing model
+ **/
+static inline int ipr_is_naca_model(struct ipr_resource_entry *res)
+{
+       if (ipr_is_gscsi(res) && IPR_QUEUEING_MODEL(res) == IPR_QUEUE_NACA_MODEL)
+               return 1;
+       return 0;
+}
+
 /**
  * ipr_is_device - Determine if resource address is that of a device
  * @res_addr:  resource address struct
@@ -1226,7 +1327,7 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res)
 static inline int ipr_is_device(struct ipr_res_addr *res_addr)
 {
        if ((res_addr->bus < IPR_MAX_NUM_BUSES) &&
-           (res_addr->target < IPR_MAX_NUM_TARGETS_PER_BUS))
+           (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1)))
                return 1;
 
        return 0;
index cd9b95db5a7d419ba29f82d6fd8aa45233d2b146..3882d48a42bf5c5e9fa739b529059bcb3211e007 100644 (file)
 /*          - Remove 3 unused "inline" functions                             */
 /* 7.12.xx  - Use STATIC functions whereever possible                        */
 /*          - Clean up deprecated MODULE_PARM calls                          */
+/* 7.12.05  - Remove Version Matching per IBM request                        */
 /*****************************************************************************/
 
 /*
@@ -210,7 +211,7 @@ module_param(ips, charp, 0);
  * DRIVER_VER
  */
 #define IPS_VERSION_HIGH        "7.12"
-#define IPS_VERSION_LOW         ".02 "
+#define IPS_VERSION_LOW         ".05 "
 
 #if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
 #warning "This driver has only been tested on the x86/ia64/x86_64 platforms"
@@ -247,7 +248,7 @@ module_param(ips, charp, 0);
 /*
  * Function prototypes
  */
-static int ips_detect(Scsi_Host_Template *);
+static int ips_detect(struct scsi_host_template *);
 static int ips_release(struct Scsi_Host *);
 static int ips_eh_abort(Scsi_Cmnd *);
 static int ips_eh_reset(Scsi_Cmnd *);
@@ -347,8 +348,6 @@ static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
 static int ips_host_info(ips_ha_t *, char *, off_t, int);
 static void copy_mem_info(IPS_INFOSTR *, char *, int);
 static int copy_info(IPS_INFOSTR *, char *, ...);
-static int ips_get_version_info(ips_ha_t * ha, dma_addr_t, int intr);
-static void ips_version_check(ips_ha_t * ha, int intr);
 static int ips_abort_init(ips_ha_t * ha, int index);
 static int ips_init_phase2(int index);
 
@@ -378,7 +377,7 @@ static char *ips_FlashData = NULL;  /* CD Boot - Flash Data Buffer      */
 static dma_addr_t ips_flashbusaddr;
 static long ips_FlashDataInUse;                /* CD Boot - Flash Data In Use Flag */
 static uint32_t MaxLiteCmds = 32;      /* Max Active Cmds for a Lite Adapter */
-static Scsi_Host_Template ips_driver_template = {
+static struct scsi_host_template ips_driver_template = {
        .detect                 = ips_detect,
        .release                = ips_release,
        .info                   = ips_info,
@@ -406,8 +405,6 @@ static Scsi_Host_Template ips_driver_template = {
 #endif
 };
 
-static IPS_DEFINE_COMPAT_TABLE( Compatable );  /* Version Compatability Table      */
-
 
 /* This table describes all ServeRAID Adapters */
 static struct  pci_device_id  ips_pci_table[] = {
@@ -590,7 +587,7 @@ __setup("ips=", ips_setup);
 /*                                                                          */
 /****************************************************************************/
 static int
-ips_detect(Scsi_Host_Template * SHT)
+ips_detect(struct scsi_host_template * SHT)
 {
        int i;
 
@@ -1265,9 +1262,9 @@ ips_proc24_info(char *buffer, char **start, off_t offset, int length,
 /*                                                                          */
 /****************************************************************************/
 static void
-ips_select_queue_depth(struct Scsi_Host *host, Scsi_Device * scsi_devs)
+ips_select_queue_depth(struct Scsi_Host *host, struct scsi_device * scsi_devs)
 {
-       Scsi_Device *device;
+       struct scsi_device *device;
        ips_ha_t *ha;
        int count = 0;
        int min;
@@ -1310,7 +1307,7 @@ ips_select_queue_depth(struct Scsi_Host *host, Scsi_Device * scsi_devs)
 /*                                                                          */
 /****************************************************************************/
 static int
-ips_slave_configure(Scsi_Device * SDptr)
+ips_slave_configure(struct scsi_device * SDptr)
 {
        ips_ha_t *ha;
        int min;
@@ -5930,7 +5927,7 @@ ips_write_driver_status(ips_ha_t * ha, int intr)
        strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
        strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
 
-       ips_version_check(ha, intr);    /* Check BIOS/FW/Driver Versions */
+       ha->nvram->versioning = 0;      /* Indicate the Driver Does Not Support Versioning */
 
        /* now update the page */
        if (!ips_readwrite_page5(ha, TRUE, intr)) {
@@ -6847,135 +6844,6 @@ ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
                return (0);
 }
 
-/*---------------------------------------------------------------------------*/
-/*   Routine Name: ips_version_check                                         */
-/*                                                                           */
-/*   Dependencies:                                                           */
-/*     Assumes that ips_read_adapter_status() is called first filling in     */
-/*     the data for SubSystem Parameters.                                    */
-/*     Called from ips_write_driver_status() so it also assumes NVRAM Page 5 */
-/*     Data is available.                                                    */
-/*                                                                           */
-/*---------------------------------------------------------------------------*/
-static void
-ips_version_check(ips_ha_t * ha, int intr)
-{
-       IPS_VERSION_DATA *VersionInfo;
-       uint8_t FirmwareVersion[IPS_COMPAT_ID_LENGTH + 1];
-       uint8_t BiosVersion[IPS_COMPAT_ID_LENGTH + 1];
-       int MatchError;
-       int rc;
-       char BiosString[10];
-       char FirmwareString[10];
-
-       METHOD_TRACE("ips_version_check", 1);
-
-       VersionInfo = ( IPS_VERSION_DATA * ) ha->ioctl_data;
-
-       memset(FirmwareVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
-       memset(BiosVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
-
-       /* Get the Compatible BIOS Version from NVRAM Page 5 */
-       memcpy(BiosVersion, ha->nvram->BiosCompatibilityID,
-              IPS_COMPAT_ID_LENGTH);
-
-       rc = IPS_FAILURE;
-       if (ha->subsys->param[4] & IPS_GET_VERSION_SUPPORT) {   /* If Versioning is Supported */
-               /* Get the Version Info with a Get Version Command */
-               memset( VersionInfo, 0, sizeof (IPS_VERSION_DATA));
-               rc = ips_get_version_info(ha, ha->ioctl_busaddr, intr);
-               if (rc == IPS_SUCCESS)
-                       memcpy(FirmwareVersion, VersionInfo->compatibilityId,
-                              IPS_COMPAT_ID_LENGTH);
-       }
-
-       if (rc != IPS_SUCCESS) {        /* If Data Not Obtainable from a GetVersion Command */
-               /* Get the Firmware Version from Enquiry Data */
-               memcpy(FirmwareVersion, ha->enq->CodeBlkVersion,
-                      IPS_COMPAT_ID_LENGTH);
-       }
-
-       /* printk(KERN_WARNING "Adapter's BIOS Version  = %s\n", BiosVersion);          */
-       /* printk(KERN_WARNING "BIOS Compatible Version = %s\n", IPS_COMPAT_BIOS);      */
-       /* printk(KERN_WARNING "Adapter's Firmware Version  = %s\n", FirmwareVersion);  */
-       /* printk(KERN_WARNING "Firmware Compatible Version = %s \n", Compatable[ ha->nvram->adapter_type ]); */
-
-       MatchError = 0;
-
-       if (strncmp
-           (FirmwareVersion, Compatable[ha->nvram->adapter_type],
-            IPS_COMPAT_ID_LENGTH) != 0)
-               MatchError = 1;
-
-       if (strncmp(BiosVersion, IPS_COMPAT_BIOS, IPS_COMPAT_ID_LENGTH) != 0)
-               MatchError = 1;
-
-       ha->nvram->versioning = 1;      /* Indicate the Driver Supports Versioning */
-
-       if (MatchError) {
-               ha->nvram->version_mismatch = 1;
-               if (ips_cd_boot == 0) {
-                       strncpy(&BiosString[0], ha->nvram->bios_high, 4);
-                       strncpy(&BiosString[4], ha->nvram->bios_low, 4);
-                       BiosString[8] = 0;
-
-                       strncpy(&FirmwareString[0], ha->enq->CodeBlkVersion, 8);
-                       FirmwareString[8] = 0;
-
-                       IPS_PRINTK(KERN_WARNING, ha->pcidev,
-                                  "Warning ! ! ! ServeRAID Version Mismatch\n");
-                       IPS_PRINTK(KERN_WARNING, ha->pcidev,
-                                  "Bios = %s, Firmware = %s, Device Driver = %s%s\n",
-                                  BiosString, FirmwareString, IPS_VERSION_HIGH,
-                                  IPS_VERSION_LOW);
-                       IPS_PRINTK(KERN_WARNING, ha->pcidev,
-                                  "These levels should match to avoid possible compatibility problems.\n");
-               }
-       } else {
-               ha->nvram->version_mismatch = 0;
-       }
-
-       return;
-}
-
-/*---------------------------------------------------------------------------*/
-/*   Routine Name: ips_get_version_info                                      */
-/*                                                                           */
-/*   Routine Description:                                                    */
-/*     Issue an internal GETVERSION Command                                  */
-/*                                                                           */
-/*   Return Value:                                                           */
-/*     0 if Successful, else non-zero                                        */
-/*---------------------------------------------------------------------------*/
-static int
-ips_get_version_info(ips_ha_t * ha, dma_addr_t Buffer, int intr)
-{
-       ips_scb_t *scb;
-       int rc;
-
-       METHOD_TRACE("ips_get_version_info", 1);
-
-       scb = &ha->scbs[ha->max_cmds - 1];
-
-       ips_init_scb(ha, scb);
-
-       scb->timeout = ips_cmd_timeout;
-       scb->cdb[0] = IPS_CMD_GET_VERSION_INFO;
-       scb->cmd.version_info.op_code = IPS_CMD_GET_VERSION_INFO;
-       scb->cmd.version_info.command_id = IPS_COMMAND_ID(ha, scb);
-       scb->cmd.version_info.reserved = 0;
-       scb->cmd.version_info.count = sizeof (IPS_VERSION_DATA);
-       scb->cmd.version_info.reserved2 = 0;
-       scb->data_len = sizeof (IPS_VERSION_DATA);
-       scb->data_busaddr = Buffer;
-       scb->cmd.version_info.buffer_addr = Buffer;
-       scb->flags = 0;
-
-       /* issue command */
-       rc = ips_send_wait(ha, scb, ips_cmd_timeout, intr);
-       return (rc);
-}
-
 /****************************************************************************/
 /*                                                                          */
 /* Routine Name: ips_abort_init                                             */
index adc6eabbf610459e32259a097696b71287356c37..f46c382e5599aa022c87631a55f81dcdef17fb6c 100644 (file)
     */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
    static int ips_proc24_info(char *, char **, off_t, int, int, int);
-   static void ips_select_queue_depth(struct Scsi_Host *, Scsi_Device *);
+   static void ips_select_queue_depth(struct Scsi_Host *, struct scsi_device *);
    static int ips_biosparam(Disk *disk, kdev_t dev, int geom[]);
 #else
    static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
    static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
                sector_t capacity, int geom[]);
-   static int ips_slave_configure(Scsi_Device *SDptr);
+   static int ips_slave_configure(struct scsi_device *SDptr);
 #endif
 
 /*
index a642f736cf852364d4baea31b92b511ae82394a3..23728d1c980c1cbc2b74b3be225cda3f4e9b78a8 100644 (file)
@@ -52,7 +52,7 @@ static volatile unsigned char cmd_buffer[16];
                                 * via PIO.
                                 */
 
-int jazz_esp_detect(Scsi_Host_Template *tpnt);
+int jazz_esp_detect(struct scsi_host_template *tpnt);
 static int jazz_esp_release(struct Scsi_Host *shost)
 {
        if (shost->irq)
@@ -65,7 +65,7 @@ static int jazz_esp_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "jazz_esp",
        .proc_info              = &esp_proc_info,
        .name                   = "ESP 100/100a/200",
index a74b4071a662f6169debc3123cf86b7a6808e3be..665ae79e1fd6739b76fa44e3f4f004587e041e60 100644 (file)
@@ -532,8 +532,7 @@ void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp)
  *     @fis: Buffer from which data will be input
  *     @tf: Taskfile to output
  *
- *     Converts a standard ATA taskfile to a Serial ATA
- *     FIS structure (Register - Host to Device).
+ *     Converts a serial ATA FIS structure to a standard ATA taskfile.
  *
  *     LOCKING:
  *     Inherited from caller.
@@ -1047,6 +1046,30 @@ static unsigned int ata_pio_modes(const struct ata_device *adev)
        return modes;
 }
 
+static int ata_qc_wait_err(struct ata_queued_cmd *qc,
+                          struct completion *wait)
+{
+       int rc = 0;
+
+       if (wait_for_completion_timeout(wait, 30 * HZ) < 1) {
+               /* timeout handling */
+               unsigned int err_mask = ac_err_mask(ata_chk_status(qc->ap));
+
+               if (!err_mask) {
+                       printk(KERN_WARNING "ata%u: slow completion (cmd %x)\n",
+                              qc->ap->id, qc->tf.command);
+               } else {
+                       printk(KERN_WARNING "ata%u: qc timeout (cmd %x)\n",
+                              qc->ap->id, qc->tf.command);
+                       rc = -EIO;
+               }
+
+               ata_qc_complete(qc, err_mask);
+       }
+
+       return rc;
+}
+
 /**
  *     ata_dev_identify - obtain IDENTIFY x DEVICE page
  *     @ap: port on which device we wish to probe resides
@@ -1126,7 +1149,7 @@ retry:
        if (rc)
                goto err_out;
        else
-               wait_for_completion(&wait);
+               ata_qc_wait_err(qc, &wait);
 
        spin_lock_irqsave(&ap->host_set->lock, flags);
        ap->ops->tf_read(ap, &qc->tf);
@@ -1264,7 +1287,7 @@ retry:
        }
 
        /* ATAPI-specific feature tests */
-       else {
+       else if (dev->class == ATA_DEV_ATAPI) {
                if (ata_id_is_ata(dev->id))             /* sanity check */
                        goto err_out_nosup;
 
@@ -1571,11 +1594,13 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed,
 
        /*
         * Find the mode. 
-       */
+        */
 
        if (!(s = ata_timing_find_mode(speed)))
                return -EINVAL;
 
+       memcpy(t, s, sizeof(*s));
+
        /*
         * If the drive is an EIDE drive, it can tell us it needs extended
         * PIO/MW_DMA cycle timing.
@@ -1596,7 +1621,7 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed,
         * Convert the timing to bus clock counts.
         */
 
-       ata_timing_quantize(s, t, T, UT);
+       ata_timing_quantize(t, t, T, UT);
 
        /*
         * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T
@@ -2268,7 +2293,7 @@ static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev)
        if (rc)
                ata_port_disable(ap);
        else
-               wait_for_completion(&wait);
+               ata_qc_wait_err(qc, &wait);
 
        DPRINTK("EXIT\n");
 }
@@ -2316,7 +2341,7 @@ static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev)
        if (rc)
                goto err_out;
 
-       wait_for_completion(&wait);
+       ata_qc_wait_err(qc, &wait);
 
        swap_buf_le16(dev->id, ATA_ID_WORDS);
 
@@ -2372,7 +2397,7 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev)
        if (rc)
                ata_port_disable(ap);
        else
-               wait_for_completion(&wait);
+               ata_qc_wait_err(qc, &wait);
 
        DPRINTK("EXIT\n");
 }
@@ -2400,7 +2425,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
        if (qc->flags & ATA_QCFLAG_SINGLE)
                assert(qc->n_elem == 1);
 
-       DPRINTK("unmapping %u sg elements\n", qc->n_elem);
+       VPRINTK("unmapping %u sg elements\n", qc->n_elem);
 
        /* if we padded the buffer out to 32-bit bound, and data
         * xfer direction is from-device, we must copy from the
@@ -2410,7 +2435,8 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
                pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
 
        if (qc->flags & ATA_QCFLAG_SG) {
-               dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir);
+               if (qc->n_elem)
+                       dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir);
                /* restore last sg */
                sg[qc->orig_n_elem - 1].length += qc->pad_len;
                if (pad_buf) {
@@ -2420,8 +2446,10 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
                        kunmap_atomic(psg->page, KM_IRQ0);
                }
        } else {
-               dma_unmap_single(ap->host_set->dev, sg_dma_address(&sg[0]),
-                                sg_dma_len(&sg[0]), dir);
+               if (sg_dma_len(&sg[0]) > 0)
+                       dma_unmap_single(ap->host_set->dev,
+                               sg_dma_address(&sg[0]), sg_dma_len(&sg[0]),
+                               dir);
                /* restore sg */
                sg->length += qc->pad_len;
                if (pad_buf)
@@ -2620,6 +2648,11 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
                        sg->length, qc->pad_len);
        }
 
+       if (!sg->length) {
+               sg_dma_address(sg) = 0;
+               goto skip_map;
+       }
+
        dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt,
                                     sg->length, dir);
        if (dma_mapping_error(dma_address)) {
@@ -2629,6 +2662,7 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
        }
 
        sg_dma_address(sg) = dma_address;
+skip_map:
        sg_dma_len(sg) = sg->length;
 
        DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg),
@@ -2656,7 +2690,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
        struct ata_port *ap = qc->ap;
        struct scatterlist *sg = qc->__sg;
        struct scatterlist *lsg = &sg[qc->n_elem - 1];
-       int n_elem, dir;
+       int n_elem, pre_n_elem, dir, trim_sg = 0;
 
        VPRINTK("ENTER, ata%u\n", ap->id);
        assert(qc->flags & ATA_QCFLAG_SG);
@@ -2690,13 +2724,24 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
                sg_dma_len(psg) = ATA_DMA_PAD_SZ;
                /* trim last sg */
                lsg->length -= qc->pad_len;
+               if (lsg->length == 0)
+                       trim_sg = 1;
 
                DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n",
                        qc->n_elem - 1, lsg->length, qc->pad_len);
        }
 
+       pre_n_elem = qc->n_elem;
+       if (trim_sg && pre_n_elem)
+               pre_n_elem--;
+
+       if (!pre_n_elem) {
+               n_elem = 0;
+               goto skip_map;
+       }
+
        dir = qc->dma_dir;
-       n_elem = dma_map_sg(ap->host_set->dev, sg, qc->n_elem, dir);
+       n_elem = dma_map_sg(ap->host_set->dev, sg, pre_n_elem, dir);
        if (n_elem < 1) {
                /* restore last sg */
                lsg->length += qc->pad_len;
@@ -2705,6 +2750,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
 
        DPRINTK("%d sg elements mapped\n", n_elem);
 
+skip_map:
        qc->n_elem = n_elem;
 
        return 0;
@@ -3264,32 +3310,11 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct ata_host_set *host_set = ap->host_set;
-       struct ata_device *dev = qc->dev;
        u8 host_stat = 0, drv_stat;
        unsigned long flags;
 
        DPRINTK("ENTER\n");
 
-       /* FIXME: doesn't this conflict with timeout handling? */
-       if (qc->dev->class == ATA_DEV_ATAPI && qc->scsicmd) {
-               struct scsi_cmnd *cmd = qc->scsicmd;
-
-               if (!(cmd->eh_eflags & SCSI_EH_CANCEL_CMD)) {
-
-                       /* finish completing original command */
-                       spin_lock_irqsave(&host_set->lock, flags);
-                       __ata_qc_complete(qc);
-                       spin_unlock_irqrestore(&host_set->lock, flags);
-
-                       atapi_request_sense(ap, dev, cmd);
-
-                       cmd->result = (CHECK_CONDITION << 1) | (DID_OK << 16);
-                       scsi_finish_command(cmd);
-
-                       goto out;
-               }
-       }
-
        spin_lock_irqsave(&host_set->lock, flags);
 
        /* hack alert!  We cannot use the supplied completion
@@ -3328,7 +3353,6 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
 
        spin_unlock_irqrestore(&host_set->lock, flags);
 
-out:
        DPRINTK("EXIT\n");
 }
 
@@ -3412,16 +3436,11 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
 
        qc = ata_qc_new(ap);
        if (qc) {
-               qc->__sg = NULL;
-               qc->flags = 0;
                qc->scsicmd = NULL;
                qc->ap = ap;
                qc->dev = dev;
-               qc->cursect = qc->cursg = qc->cursg_ofs = 0;
-               qc->nsect = 0;
-               qc->nbytes = qc->curbytes = 0;
 
-               ata_tf_init(ap, &qc->tf, dev->devno);
+               ata_qc_reinit(qc);
        }
 
        return qc;
@@ -4563,6 +4582,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = SA_SHIRQ;
+       probe_ent->private_data = port[0]->private_data;
 
        if (ports & ATA_PORT_PRIMARY) {
                probe_ent->port[p].cmd_addr = pci_resource_start(pdev, 0);
@@ -4599,6 +4619,7 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, stru
        probe_ent->legacy_mode = 1;
        probe_ent->n_ports = 1;
        probe_ent->hard_port_no = port_num;
+       probe_ent->private_data = port->private_data;
 
        switch(port_num)
        {
index bb30fcdc929763d767ad369267207dff7a624a53..3b4ca55a3332eb02c33a6c4afda97bfa7b4f46fc 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/spinlock.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_eh.h>
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_request.h>
 #include <linux/libata.h>
@@ -147,7 +148,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
        u8 scsi_cmd[MAX_COMMAND_SIZE];
        u8 args[4], *argbuf = NULL;
        int argsize = 0;
-       struct scsi_request *sreq;
+       struct scsi_sense_hdr sshdr;
+       enum dma_data_direction data_dir;
 
        if (NULL == (void *)arg)
                return -EINVAL;
@@ -155,10 +157,6 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
        if (copy_from_user(args, arg, sizeof(args)))
                return -EFAULT;
 
-       sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
-       if (!sreq)
-               return -EINTR;
-
        memset(scsi_cmd, 0, sizeof(scsi_cmd));
 
        if (args[3]) {
@@ -172,11 +170,11 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
                scsi_cmd[1]  = (4 << 1); /* PIO Data-in */
                scsi_cmd[2]  = 0x0e;     /* no off.line or cc, read from dev,
                                            block count in sector count field */
-               sreq->sr_data_direction = DMA_FROM_DEVICE;
+               data_dir = DMA_FROM_DEVICE;
        } else {
                scsi_cmd[1]  = (3 << 1); /* Non-data */
                /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
-               sreq->sr_data_direction = DMA_NONE;
+               data_dir = DMA_NONE;
        }
 
        scsi_cmd[0] = ATA_16;
@@ -194,9 +192,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
 
        /* Good values for timeout and retries?  Values below
           from scsi_ioctl_send_command() for default case... */
-       scsi_wait_req(sreq, scsi_cmd, argbuf, argsize, (10*HZ), 5);
-
-       if (sreq->sr_result) {
+       if (scsi_execute_req(scsidev, scsi_cmd, data_dir, argbuf, argsize,
+                            &sshdr, (10*HZ), 5)) {
                rc = -EIO;
                goto error;
        }
@@ -207,8 +204,6 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
         && copy_to_user((void *)(arg + sizeof(args)), argbuf, argsize))
                rc = -EFAULT;
 error:
-       scsi_release_request(sreq);
-
        if (argbuf)
                kfree(argbuf);
 
@@ -231,7 +226,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
        int rc = 0;
        u8 scsi_cmd[MAX_COMMAND_SIZE];
        u8 args[7];
-       struct scsi_request *sreq;
+       struct scsi_sense_hdr sshdr;
 
        if (NULL == (void *)arg)
                return -EINVAL;
@@ -250,26 +245,13 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
        scsi_cmd[12] = args[5];
        scsi_cmd[14] = args[0];
 
-       sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
-       if (!sreq) {
-               rc = -EINTR;
-               goto error;
-       }
-
-       sreq->sr_data_direction = DMA_NONE;
        /* Good values for timeout and retries?  Values below
-          from scsi_ioctl_send_command() for default case... */
-       scsi_wait_req(sreq, scsi_cmd, NULL, 0, (10*HZ), 5);
-
-       if (sreq->sr_result) {
+          from scsi_ioctl_send_command() for default case... */        
+       if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
+                            (10*HZ), 5))
                rc = -EIO;
-               goto error;
-       }
 
        /* Need code to retrieve data from check condition? */
-
-error:
-       scsi_release_request(sreq);
        return rc;
 }
 
@@ -1129,6 +1111,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm
                 * length 0 means transfer 0 block of data.
                 * However, for ATA R/W commands, sector count 0 means
                 * 256 or 65536 sectors, not 0 sectors as in SCSI.
+                *
+                * WARNING: one or two older ATA drives treat 0 as 0...
                 */
                goto nothing_to_do;
 
@@ -1971,22 +1955,44 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8
        done(cmd);
 }
 
-void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
-                        struct scsi_cmnd *cmd)
+static int atapi_sense_complete(struct ata_queued_cmd *qc,unsigned int err_mask)
 {
-       DECLARE_COMPLETION(wait);
-       struct ata_queued_cmd *qc;
-       unsigned long flags;
-       int rc;
+       if (err_mask && ((err_mask & AC_ERR_DEV) == 0))
+               /* FIXME: not quite right; we don't want the
+                * translation of taskfile registers into
+                * a sense descriptors, since that's only
+                * correct for ATA, not ATAPI
+                */
+               ata_gen_ata_desc_sense(qc);
 
-       DPRINTK("ATAPI request sense\n");
+       qc->scsidone(qc->scsicmd);
+       return 0;
+}
 
-       qc = ata_qc_new_init(ap, dev);
-       BUG_ON(qc == NULL);
+/* is it pointless to prefer PIO for "safety reasons"? */
+static inline int ata_pio_use_silly(struct ata_port *ap)
+{
+       return (ap->flags & ATA_FLAG_PIO_DMA);
+}
+
+static void atapi_request_sense(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       struct scsi_cmnd *cmd = qc->scsicmd;
+
+       DPRINTK("ATAPI request sense\n");
 
        /* FIXME: is this needed? */
        memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
 
+       ap->ops->tf_read(ap, &qc->tf);
+
+       /* fill these in, for the case where they are -not- overwritten */
+       cmd->sense_buffer[0] = 0x70;
+       cmd->sense_buffer[2] = qc->tf.feature >> 4;
+
+       ata_qc_reinit(qc);
+
        ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer));
        qc->dma_dir = DMA_FROM_DEVICE;
 
@@ -1997,22 +2003,20 @@ void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
        qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
        qc->tf.command = ATA_CMD_PACKET;
 
-       qc->tf.protocol = ATA_PROT_ATAPI;
-       qc->tf.lbam = (8 * 1024) & 0xff;
-       qc->tf.lbah = (8 * 1024) >> 8;
+       if (ata_pio_use_silly(ap)) {
+               qc->tf.protocol = ATA_PROT_ATAPI_DMA;
+               qc->tf.feature |= ATAPI_PKT_DMA;
+       } else {
+               qc->tf.protocol = ATA_PROT_ATAPI;
+               qc->tf.lbam = (8 * 1024) & 0xff;
+               qc->tf.lbah = (8 * 1024) >> 8;
+       }
        qc->nbytes = SCSI_SENSE_BUFFERSIZE;
 
-       qc->waiting = &wait;
-       qc->complete_fn = ata_qc_complete_noop;
-
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       rc = ata_qc_issue(qc);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       qc->complete_fn = atapi_sense_complete;
 
-       if (rc)
-               ata_port_disable(ap);
-       else
-               wait_for_completion(&wait);
+       if (ata_qc_issue(qc))
+               ata_qc_complete(qc, AC_ERR_OTHER);
 
        DPRINTK("EXIT\n");
 }
@@ -2024,19 +2028,8 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
        VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
 
        if (unlikely(err_mask & AC_ERR_DEV)) {
-               DPRINTK("request check condition\n");
-
-               /* FIXME: command completion with check condition
-                * but no sense causes the error handler to run,
-                * which then issues REQUEST SENSE, fills in the sense 
-                * buffer, and completes the command (for the second
-                * time).  We need to issue REQUEST SENSE some other
-                * way, to avoid completing the command twice.
-                */
                cmd->result = SAM_STAT_CHECK_CONDITION;
-
-               qc->scsidone(cmd);
-
+               atapi_request_sense(qc);
                return 1;
        }
 
@@ -2292,6 +2285,12 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
                tf->device = scsicmd[8];
                tf->command = scsicmd[9];
        }
+       /*
+        * If slave is possible, enforce correct master/slave bit
+       */
+       if (qc->ap->flags & ATA_FLAG_SLAVE_POSS)
+               tf->device = qc->dev->devno ?
+                       tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
 
        /*
         * Filter SET_FEATURES - XFER MODE command -- otherwise,
index fad051ca4672bf0daf6ed710cf4155f977bb7662..8ebaa694d18e423ba88545127f806d71b781da34 100644 (file)
@@ -29,7 +29,7 @@
 #define __LIBATA_H__
 
 #define DRV_NAME       "libata"
-#define DRV_VERSION    "1.12"  /* must be exactly four chars */
+#define DRV_VERSION    "1.20"  /* must be exactly four chars */
 
 struct ata_scsi_args {
        u16                     *id;
@@ -54,8 +54,6 @@ extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
 
 
 /* libata-scsi.c */
-extern void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
-                        struct scsi_cmnd *cmd);
 extern void ata_scsi_scan_host(struct ata_port *ap);
 extern int ata_scsi_error(struct Scsi_Host *host);
 extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
index c90723860a049e15232452b60921909645c81bde..07498118359de9f7a02beadc177af154ce4acc07 100644 (file)
@@ -1704,7 +1704,6 @@ MODULE_DEVICE_TABLE(pci, lpfc_id_table);
 
 static struct pci_driver lpfc_driver = {
        .name           = LPFC_DRIVER_NAME,
-       .owner          = THIS_MODULE,
        .id_table       = lpfc_id_table,
        .probe          = lpfc_pci_probe_one,
        .remove         = __devexit_p(lpfc_pci_remove_one),
index c94c8db8465138d51f7b9a98ea7413b4a4221f97..e31fadd619044ed11b095caacebde9f407492890 100644 (file)
@@ -300,7 +300,7 @@ unsigned long get_base(int chip_num)
  * Model dependent ESP setup
  */
 
-int mac_esp_detect(Scsi_Host_Template * tpnt)
+int mac_esp_detect(struct scsi_host_template * tpnt)
 {
        int quick = 0;
        int chipnum, chipspresent = 0;
@@ -730,7 +730,7 @@ static void dma_setup_quick(struct NCR_ESP * esp, __u32 addr, int count, int wri
 #endif
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "mac_esp",
        .name                   = "Mac 53C9x SCSI",
        .detect                 = mac_esp_detect,
index 92d2c8379abf529989afd58f10976aedb901d325..777f9bcd117932af31742e90b46d20b398309a13 100644 (file)
@@ -222,7 +222,7 @@ static struct Scsi_Host *default_instance;
 #endif
 
 /*
- * Function : int macscsi_detect(Scsi_Host_Template * tpnt)
+ * Function : int macscsi_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : initializes mac NCR5380 driver based on the
  *     command line / compile time port and irq definitions.
@@ -233,7 +233,7 @@ static struct Scsi_Host *default_instance;
  *
  */
  
-int macscsi_detect(Scsi_Host_Template * tpnt)
+int macscsi_detect(struct scsi_host_template * tpnt)
 {
     static int called = 0;
     int flags = 0;
@@ -581,7 +581,7 @@ static int macscsi_pwrite (struct Scsi_Host *instance,
 
 #include "NCR5380.c"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name                      = "Mac5380",
        .proc_info                      = macscsi_proc_info,
        .name                           = "Macintosh NCR5380 SCSI",
index 194c75451faff8b00fc7e8385fc93fd175d3ec5f..998a8bbc1a4b748962f9787967bfebb647212883 100644 (file)
@@ -103,7 +103,7 @@ static volatile unsigned char cmd_buffer[16];
 static struct ESP_regs eregs;
 
 /***************************************************************** Detection */
-static int mca_esp_detect(Scsi_Host_Template *tpnt)
+static int mca_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        static int io_port_by_pos[] = MCA_53C9X_IO_PORTS;
@@ -444,7 +444,7 @@ static void dma_led_off(struct NCR_ESP *esp)
        outb(inb(PS2_SYS_CTR) & 0x3f, PS2_SYS_CTR);
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "mca_53c9x",
        .name                   = "NCR 53c9x SCSI",
        .detect                 = mca_esp_detect,
index 61a6fd810bb4bedfb24a13b57265e7af87a56966..dfea346b00a559975cc83853bafbf4f59dbcebd9 100644 (file)
@@ -362,6 +362,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
        adapter_t       *adapter;
        scb_t   *scb;
        int     busy=0;
+       unsigned long flags;
 
        adapter = (adapter_t *)scmd->device->host->hostdata;
 
@@ -377,6 +378,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
         * return 0 in that case.
         */
 
+       spin_lock_irqsave(&adapter->lock, flags);
        scb = mega_build_cmd(adapter, scmd, &busy);
 
        if(scb) {
@@ -393,6 +395,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
                }
                return 0;
        }
+       spin_unlock_irqrestore(&adapter->lock, flags);
 
        return busy;
 }
@@ -1683,7 +1686,7 @@ mega_rundoneq (adapter_t *adapter)
 
        list_for_each(pos, &adapter->completed_list) {
 
-               Scsi_Pointer* spos = (Scsi_Pointer *)pos;
+               struct scsi_pointer* spos = (struct scsi_pointer *)pos;
 
                cmd = list_entry(spos, Scsi_Cmnd, SCp);
                cmd->scsi_done(cmd);
@@ -1981,7 +1984,7 @@ megaraid_reset(struct scsi_cmnd *cmd)
        mc.cmd = MEGA_CLUSTER_CMD;
        mc.opcode = MEGA_RESET_RESERVATIONS;
 
-       if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
+       if( mega_internal_command(adapter, &mc, NULL) != 0 ) {
                printk(KERN_WARNING
                                "megaraid: reservation reset failed.\n");
        }
@@ -3011,7 +3014,7 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
                mc.cmd = FC_NEW_CONFIG;
                mc.opcode = OP_DCMD_READ_CONFIG;
 
-               if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {
+               if( mega_internal_command(adapter, &mc, NULL) ) {
 
                        len = sprintf(page, "40LD read config failed.\n");
 
@@ -3029,11 +3032,11 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
        else {
                mc.cmd = NEW_READ_CONFIG_8LD;
 
-               if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {
+               if( mega_internal_command(adapter, &mc, NULL) ) {
 
                        mc.cmd = READ_CONFIG_8LD;
 
-                       if( mega_internal_command(adapter, LOCK_INT, &mc,
+                       if( mega_internal_command(adapter, &mc,
                                                NULL) ){
 
                                len = sprintf(page,
@@ -3632,7 +3635,7 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
                        /*
                         * Issue the command
                         */
-                       mega_internal_command(adapter, LOCK_INT, &mc, pthru);
+                       mega_internal_command(adapter, &mc, pthru);
 
                        rval = mega_n_to_m((void __user *)arg, &mc);
 
@@ -3715,7 +3718,7 @@ freemem_and_return:
                        /*
                         * Issue the command
                         */
-                       mega_internal_command(adapter, LOCK_INT, &mc, NULL);
+                       mega_internal_command(adapter, &mc, NULL);
 
                        rval = mega_n_to_m((void __user *)arg, &mc);
 
@@ -4234,7 +4237,7 @@ mega_do_del_logdrv(adapter_t *adapter, int logdrv)
        mc.opcode = OP_DEL_LOGDRV;
        mc.subopcode = logdrv;
 
-       rval = mega_internal_command(adapter, LOCK_INT, &mc, NULL);
+       rval = mega_internal_command(adapter, &mc, NULL);
 
        /* log this event */
        if(rval) {
@@ -4367,7 +4370,7 @@ mega_adapinq(adapter_t *adapter, dma_addr_t dma_handle)
 
        mc.xferaddr = (u32)dma_handle;
 
-       if ( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
+       if ( mega_internal_command(adapter, &mc, NULL) != 0 ) {
                return -1;
        }
 
@@ -4435,7 +4438,7 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
        mc.cmd = MEGA_MBOXCMD_PASSTHRU;
        mc.xferaddr = (u32)pthru_dma_handle;
 
-       rval = mega_internal_command(adapter, LOCK_INT, &mc, pthru);
+       rval = mega_internal_command(adapter, &mc, pthru);
 
        pci_free_consistent(pdev, sizeof(mega_passthru), pthru,
                        pthru_dma_handle);
@@ -4449,7 +4452,6 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
 /**
  * mega_internal_command()
  * @adapter - pointer to our soft state
- * @ls - the scope of the exclusion lock.
  * @mc - the mailbox command
  * @pthru - Passthru structure for DCDB commands
  *
@@ -4463,8 +4465,7 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
  * Note: parameter 'pthru' is null for non-passthru commands.
  */
 static int
-mega_internal_command(adapter_t *adapter, lockscope_t ls, megacmd_t *mc,
-               mega_passthru *pthru )
+mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
 {
        Scsi_Cmnd       *scmd;
        struct  scsi_device *sdev;
@@ -4508,15 +4509,8 @@ mega_internal_command(adapter_t *adapter, lockscope_t ls, megacmd_t *mc,
 
        scb->idx = CMDID_INT_CMDS;
 
-       /*
-        * Get the lock only if the caller has not acquired it already
-        */
-       if( ls == LOCK_INT ) spin_lock_irqsave(&adapter->lock, flags);
-
        megaraid_queue(scmd, mega_internal_done);
 
-       if( ls == LOCK_INT ) spin_unlock_irqrestore(&adapter->lock, flags);
-
        wait_for_completion(&adapter->int_waitq);
 
        rval = scmd->result;
index 4facf557cd1951d403d233e9808d6b33f65d7377..6f9078025748dcf681b4caf5a3aa59a4459c6430 100644 (file)
@@ -925,13 +925,6 @@ struct mega_hbas {
 #define MEGA_BULK_DATA                 0x0001
 #define MEGA_SGLIST                    0x0002
 
-/*
- * lockscope definitions, callers can specify the lock scope with this data
- * type. LOCK_INT would mean the caller has not acquired the lock before
- * making the call and LOCK_EXT would mean otherwise.
- */
-typedef enum { LOCK_INT, LOCK_EXT } lockscope_t;
-
 /*
  * Parameters for the io-mapped controllers
  */
@@ -1062,8 +1055,7 @@ static int mega_support_random_del(adapter_t *);
 static int mega_del_logdrv(adapter_t *, int);
 static int mega_do_del_logdrv(adapter_t *, int);
 static void mega_get_max_sgl(adapter_t *);
-static int mega_internal_command(adapter_t *, lockscope_t, megacmd_t *,
-               mega_passthru *);
+static int mega_internal_command(adapter_t *, megacmd_t *, mega_passthru *);
 static void mega_internal_done(Scsi_Cmnd *);
 static int mega_support_cluster(adapter_t *);
 #endif
index 8e547130e97d1fad4a30f7be5431eb82eeff9ebf..4675343228adf05bba7cbea570746e1452c2a4f7 100644 (file)
@@ -96,7 +96,6 @@ typedef struct {
  * @param dpc_h                        : tasklet handle
  * @param pdev                 : pci configuration pointer for kernel
  * @param host                 : pointer to host structure of mid-layer
- * @param host_lock            : pointer to appropriate lock
  * @param lock                 : synchronization lock for mid-layer and driver
  * @param quiescent            : driver is quiescent for now.
  * @param outstanding_cmds     : number of commands pending in the driver
@@ -151,7 +150,6 @@ typedef struct {
        struct tasklet_struct   dpc_h;
        struct pci_dev          *pdev;
        struct Scsi_Host        *host;
-       spinlock_t              *host_lock;
        spinlock_t              lock;
        uint8_t                 quiescent;
        int                     outstanding_cmds;
index 1a3d195a2d366d3994a39bc525bf5a0e5b69fe20..4b5d420d2f4d36c017e01a3541d7d277c890f67b 100644 (file)
@@ -533,8 +533,6 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Initialize the synchronization lock for kernel and LLD
        spin_lock_init(&adapter->lock);
-       adapter->host_lock = &adapter->lock;
-
 
        // Initialize the command queues: the list of free SCBs and the list
        // of pending SCBs.
@@ -715,9 +713,6 @@ megaraid_io_attach(adapter_t *adapter)
        SCSIHOST2ADAP(host)     = (caddr_t)adapter;
        adapter->host           = host;
 
-       // export the parameters required by the mid-layer
-       scsi_assign_lock(host, adapter->host_lock);
-
        host->irq               = adapter->irq;
        host->unique_id         = adapter->unique_id;
        host->can_queue         = adapter->max_cmds;
@@ -1560,10 +1555,6 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
        scp->scsi_done  = done;
        scp->result     = 0;
 
-       assert_spin_locked(adapter->host_lock);
-
-       spin_unlock(adapter->host_lock);
-
        /*
         * Allocate and build a SCB request
         * if_busy flag will be set if megaraid_mbox_build_cmd() command could
@@ -1573,23 +1564,16 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
         * return 0 in that case, and we would do the callback right away.
         */
        if_busy = 0;
-       scb     = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
-
-       if (scb) {
-               megaraid_mbox_runpendq(adapter, scb);
-       }
-
-       spin_lock(adapter->host_lock);
-
+       scb = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
        if (!scb) {     // command already completed
                done(scp);
                return 0;
        }
 
+       megaraid_mbox_runpendq(adapter, scb);
        return if_busy;
 }
 
-
 /**
  * megaraid_mbox_build_cmd - transform the mid-layer scsi command to megaraid
  * firmware lingua
@@ -2546,9 +2530,7 @@ megaraid_mbox_dpc(unsigned long devp)
                megaraid_dealloc_scb(adapter, scb);
 
                // send the scsi packet back to kernel
-               spin_lock(adapter->host_lock);
                scp->scsi_done(scp);
-               spin_unlock(adapter->host_lock);
        }
 
        return;
@@ -2563,7 +2545,7 @@ megaraid_mbox_dpc(unsigned long devp)
  * aborted. All the commands issued to the F/W must complete.
  **/
 static int
-__megaraid_abort_handler(struct scsi_cmnd *scp)
+megaraid_abort_handler(struct scsi_cmnd *scp)
 {
        adapter_t               *adapter;
        mraid_device_t          *raid_dev;
@@ -2577,8 +2559,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
        con_log(CL_ANN, (KERN_WARNING
                "megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
                scp->serial_number, scp->cmnd[0], SCP2CHANNEL(scp),
@@ -2658,6 +2638,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        // traverse through the list of all SCB, since driver does not
        // maintain these SCBs on any list
        found = 0;
+       spin_lock_irq(&adapter->lock);
        for (i = 0; i < MBOX_MAX_SCSI_CMDS; i++) {
                scb = adapter->kscb_list + i;
 
@@ -2680,6 +2661,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
                        }
                }
        }
+       spin_unlock_irq(&adapter->lock);
 
        if (!found) {
                con_log(CL_ANN, (KERN_WARNING
@@ -2696,22 +2678,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        return FAILED;
 }
 
-static int
-megaraid_abort_handler(struct scsi_cmnd *scp)
-{
-       adapter_t       *adapter;
-       int rc;
-
-       adapter         = SCP2ADAPTER(scp);
-
-       spin_lock_irq(adapter->host_lock);
-       rc = __megaraid_abort_handler(scp);
-       spin_unlock_irq(adapter->host_lock);
-
-       return rc;
-}
-
-
 /**
  * megaraid_reset_handler - device reset hadler for mailbox based driver
  * @scp                : reference command
@@ -2723,7 +2689,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
  * host
  **/
 static int
-__megaraid_reset_handler(struct scsi_cmnd *scp)
+megaraid_reset_handler(struct scsi_cmnd *scp)
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -2739,10 +2705,6 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
-       con_log(CL_ANN, (KERN_WARNING "megaraid: reseting the host...\n"));
-
        // return failure if adapter is not responding
        if (raid_dev->hw_error) {
                con_log(CL_ANN, (KERN_NOTICE
@@ -2779,8 +2741,6 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                        adapter->outstanding_cmds, MBOX_RESET_WAIT));
        }
 
-       spin_unlock(adapter->host_lock);
-
        recovery_window = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
 
        recovering = adapter->outstanding_cmds;
@@ -2806,7 +2766,7 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                msleep(1000);
        }
 
-       spin_lock(adapter->host_lock);
+       spin_lock(&adapter->lock);
 
        // If still outstanding commands, bail out
        if (adapter->outstanding_cmds) {
@@ -2815,7 +2775,8 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
 
                raid_dev->hw_error = 1;
 
-               return FAILED;
+               rval = FAILED;
+               goto out;
        }
        else {
                con_log(CL_ANN, (KERN_NOTICE
@@ -2824,7 +2785,10 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
 
 
        // If the controller supports clustering, reset reservations
-       if (!adapter->ha) return SUCCESS;
+       if (!adapter->ha) {
+               rval = SUCCESS;
+               goto out;
+       }
 
        // clear reservations if any
        raw_mbox[0] = CLUSTER_CMD;
@@ -2841,22 +2805,11 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                                "megaraid: reservation reset failed\n"));
        }
 
+ out:
+       spin_unlock_irq(&adapter->lock);
        return rval;
 }
 
-static int
-megaraid_reset_handler(struct scsi_cmnd *cmd)
-{
-       int rc;
-
-       spin_lock_irq(cmd->device->host->host_lock);
-       rc = __megaraid_reset_handler(cmd);
-       spin_unlock_irq(cmd->device->host->host_lock);
-
-       return rc;
-}
-
-
 /*
  * START: internal commands library
  *
@@ -3776,9 +3729,9 @@ wait_till_fw_empty(adapter_t *adapter)
        /*
         * Set the quiescent flag to stop issuing cmds to FW.
         */
-       spin_lock_irqsave(adapter->host_lock, flags);
+       spin_lock_irqsave(&adapter->lock, flags);
        adapter->quiescent++;
-       spin_unlock_irqrestore(adapter->host_lock, flags);
+       spin_unlock_irqrestore(&adapter->lock, flags);
 
        /*
         * Wait till there are no more cmds outstanding at FW. Try for at most
index 801a63bea8a5e64648318be99b51d37ac75bcc4e..3c32e69afcd9e0dc691c2e76de94cd661b737b92 100644 (file)
@@ -766,17 +766,12 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd)
                return FAILED;
        }
 
-       spin_unlock(scmd->device->host->host_lock);
-
        ret_val = megasas_wait_for_outstanding(instance);
-
        if (ret_val == SUCCESS)
                printk(KERN_NOTICE "megasas: reset successful \n");
        else
                printk(KERN_ERR "megasas: failed to do reset\n");
 
-       spin_lock(scmd->device->host->host_lock);
-
        return ret_val;
 }
 
index 33380cee9b77817ec12747a27f170494944449e9..cb367c2c5c78aa38d376928c4aa07e8d21c88a39 100644 (file)
@@ -63,7 +63,7 @@ static void dma_stop (struct Scsi_Host *instance, Scsi_Cmnd *SCpnt,
     m147_pcc->dma_cntrl = 0;
 }
 
-int mvme147_detect(Scsi_Host_Template *tpnt)
+int mvme147_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     wd33c93_regs regs;
@@ -130,7 +130,7 @@ static int mvme147_bus_reset(Scsi_Cmnd *cmd)
 
 #include "mvme147.h"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "MVME147",
        .name                   = "MVME147 built-in SCSI",
        .detect                 = mvme147_detect,
index d8903f09618284adb2c8b41bc779c3eff6df1316..2f56d69bd18020519139ef61450b5b9abab67e2a 100644 (file)
@@ -10,7 +10,7 @@
 
 #include <linux/types.h>
 
-int mvme147_detect(Scsi_Host_Template *);
+int mvme147_detect(struct scsi_host_template *);
 int mvme147_release(struct Scsi_Host *);
 const char *wd33c93_info(void);
 int wd33c93_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index 29ec699e0e4d5637caf174b04b6f0f2a941bdd5c..890e9e232dab9afba81463f0cbe3b04cfbafc406 100644 (file)
@@ -21,7 +21,7 @@
 #include<linux/stat.h>
 
 
-int mvme16x_scsi_detect(Scsi_Host_Template *tpnt)
+int mvme16x_scsi_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     int clock;
@@ -61,7 +61,7 @@ static int mvme16x_scsi_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = "MVME16x NCR53c710 SCSI",
        .detect                 = mvme16x_scsi_detect,
        .release                = mvme16x_scsi_release,
index 25173c891d3cfa4b5d07e25b957bdafe3e67203b..c7a12533fb2c454b644b060075be7fa011f43a18 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <linux/types.h>
 
-int mvme16x_scsi_detect(Scsi_Host_Template *);
+int mvme16x_scsi_detect(struct scsi_host_template *);
 const char *NCR53c7x0_info(void);
 int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 int NCR53c7xx_abort(Scsi_Cmnd *);
index e4ff4f00676d7635a3a744d272ff1b2d4d5f79fb..a279ebb61447cab8cc6b096240f686836857c71c 100644 (file)
@@ -198,7 +198,7 @@ static void __devexit nsp32_remove(struct pci_dev *);
 static int  __init    init_nsp32  (void);
 static void __exit    exit_nsp32  (void);
 
-/* struct Scsi_Host_Template */
+/* struct struct scsi_host_template */
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
 static int         nsp32_proc_info   (struct Scsi_Host *, char *, char **, off_t, int, int);
 #else
@@ -208,7 +208,7 @@ static int         nsp32_proc_info   (char *, char **, off_t, int, int, int);
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
 static int         nsp32_detect      (struct pci_dev *pdev);
 #else
-static int         nsp32_detect      (Scsi_Host_Template *);
+static int         nsp32_detect      (struct scsi_host_template *);
 #endif
 static int         nsp32_queuecommand(struct scsi_cmnd *,
                void (*done)(struct scsi_cmnd *));
@@ -2683,7 +2683,7 @@ static int nsp32_detect(struct pci_dev *pdev)
 #define DETECT_OK 1
 #define DETECT_NG 0
 #define PCIDEV    (data->Pci)
-static int nsp32_detect(Scsi_Host_Template *sht)
+static int nsp32_detect(struct scsi_host_template *sht)
 #endif
 {
        struct Scsi_Host *host; /* registered host structure */
index 573d7ef93f08dce06d0a3cb283d3a57ad6afca59..5d9c9ada814f16c653e062530d717168283734d2 100644 (file)
@@ -114,7 +114,7 @@ static volatile unsigned char cmd_buffer[16];
                                 */
 
 /***************************************************************** Detection */
-int oktagon_esp_detect(Scsi_Host_Template *tpnt)
+int oktagon_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct zorro_dev *z = NULL;
@@ -585,7 +585,7 @@ int oktagon_esp_release(struct Scsi_Host *instance)
 }
 
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "esp-oktagon",
        .proc_info              = &esp_proc_info,
        .name                   = "BSC Oktagon SCSI",
index 72bc947e45b6481a1d7e21361a72f9914c5519e1..f09e94af9ade6b7d2cfe4843412301f3c0e47573 100644 (file)
@@ -369,7 +369,7 @@ void __init pas16_setup(char *str, int *ints)
 }
 
 /* 
- * Function : int pas16_detect(Scsi_Host_Template * tpnt)
+ * Function : int pas16_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : detects and initializes PAS16 controllers
  *     that were autoprobed, overridden on the LILO command line, 
@@ -381,7 +381,7 @@ void __init pas16_setup(char *str, int *ints)
  *
  */
 
-int __init pas16_detect(Scsi_Host_Template * tpnt)
+int __init pas16_detect(struct scsi_host_template * tpnt)
 {
     static int current_override = 0;
     static unsigned short current_base = 0;
@@ -615,7 +615,7 @@ static int pas16_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name           = "Pro Audio Spectrum-16 SCSI",
        .detect         = pas16_detect,
        .release        = pas16_release,
index 65ce1cc40d9a362723fdedf139763ee4e0b9a720..8dc5b1a5f5da7ebacdbedbdbc9a8b5b9a135d42b 100644 (file)
 static int pas16_abort(Scsi_Cmnd *);
 static int pas16_biosparam(struct scsi_device *, struct block_device *,
                           sector_t, int*);
-static int pas16_detect(Scsi_Host_Template *);
+static int pas16_detect(struct scsi_host_template *);
 static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int pas16_bus_reset(Scsi_Cmnd *);
 
index 6c962d7dca47ac30a22c063b03e6b4ada1edc622..0ebd8ce9e1dec408dca4e8dfb5cca66bed15acd4 100644 (file)
@@ -184,7 +184,7 @@ typedef struct _INQUIRYDATA
 #endif
 
 // function prototypes
-int Pci2000_Detect                     (Scsi_Host_Template *tpnt);
+int Pci2000_Detect                     (struct scsi_host_template *tpnt);
 int Pci2000_Command                    (Scsi_Cmnd *SCpnt);
 int Pci2000_QueueCommand       (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 int Pci2000_Abort                      (Scsi_Cmnd *SCpnt);
index 3d2f71051fe53313e1d6f0f946106bcb5c7c5a90..050ea13ff80b3d4ef86bd9e238cf62478ed65f53 100644 (file)
@@ -81,7 +81,7 @@ module_param(free_ports, bool, 0);
 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
 
 /* /usr/src/linux/drivers/scsi/hosts.h */
-static Scsi_Host_Template nsp_driver_template = {
+static struct scsi_host_template nsp_driver_template = {
        .proc_name               = "nsp_cs",
        .proc_info               = nsp_proc_info,
        .name                    = "WorkBit NinjaSCSI-3/32Bi(16bit)",
@@ -1310,7 +1310,7 @@ timer_out:
 /*----------------------------------------------------------------*/
 /* look for ninja3 card and init if found                        */
 /*----------------------------------------------------------------*/
-static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht)
+static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
 {
        struct Scsi_Host *host; /* registered host structure */
        nsp_hw_data *data_b = &nsp_data_base, *data;
@@ -1358,7 +1358,7 @@ static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht)
 }
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-static int nsp_detect_old(Scsi_Host_Template *sht)
+static int nsp_detect_old(struct scsi_host_template *sht)
 {
        if (nsp_detect(sht) == NULL) {
                return 0;
@@ -1717,7 +1717,7 @@ static void nsp_cs_config(dev_link_t *link)
        struct Scsi_Host *host;
        nsp_hw_data      *data = &nsp_data_base;
 #if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
-       Scsi_Device      *dev;
+       struct scsi_device       *dev;
        dev_node_t      **tail, *node;
 #endif
 
index c201b52e063a612f6298408fcd562e9150b65fcb..f8b943082717dad8fb9b18af328e3f82a9903ffb 100644 (file)
@@ -303,9 +303,9 @@ static void        nsp_cs_config (dev_link_t *link);
 static int         nsp_cs_event  (event_t event, int priority, event_callback_args_t *args);
 
 /* Linux SCSI subsystem specific functions */
-static struct Scsi_Host *nsp_detect     (Scsi_Host_Template *sht);
+static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-static        int        nsp_detect_old (Scsi_Host_Template *sht);
+static        int        nsp_detect_old (struct scsi_host_template *sht);
 static        int        nsp_release_old(struct Scsi_Host *shpnt);
 #endif
 static const  char      *nsp_info       (struct Scsi_Host *shpnt);
@@ -345,7 +345,7 @@ static int  nsp_expect_signal    (Scsi_Cmnd *SCpnt, unsigned char current_phase,
 static int  nsp_xfer             (Scsi_Cmnd *SCpnt, int phase);
 static int  nsp_dataphase_bypass (Scsi_Cmnd *SCpnt);
 static int  nsp_reselected       (Scsi_Cmnd *SCpnt);
-static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht);
+static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
 
 /* Interrupt handler */
 //static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs);
index 7a516f35834ef109c5ff6a0343af06ba6b0028d3..bb091a45a880064488b0c687b7c842b018bb89ce 100644 (file)
@@ -72,7 +72,7 @@ static char *version = "qlogic_cs.c 1.79-ac 2002/10/26 (David Hinds)";
 #define DEBUG(n, args...)
 #endif
 
-static Scsi_Host_Template qlogicfas_driver_template = {
+static struct scsi_host_template qlogicfas_driver_template = {
        .module                 = THIS_MODULE,
        .name                   = qlogic_name,
        .proc_name              = qlogic_name,
@@ -108,7 +108,7 @@ static dev_link_t *dev_list = NULL;
 
 static dev_info_t dev_info = "qlogic_cs";
 
-static struct Scsi_Host *qlogic_detect(Scsi_Host_Template *host,
+static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host,
                                dev_link_t *link, int qbase, int qlirq)
 {
        int qltyp;              /* type of chip */
index 78b4ff117af65b1229875d94257a9566ba79ad5c..f557f17ca00ce76fba678a9ba7028310a31edfa9 100644 (file)
@@ -190,7 +190,7 @@ static struct ata_port_info adma_port_info[] = {
        },
 };
 
-static struct pci_device_id adma_ata_pci_tbl[] = {
+static const struct pci_device_id adma_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PDC, 0x1841, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_1841_idx },
 
index c89da7d5b6dffb49cf9994c7a59540abf8eea5bc..46624ab9c3d2e35b79fca2f8e868eb4b96c4cd48 100644 (file)
@@ -71,7 +71,7 @@ static void __init pluto_detect_scsi_done(Scsi_Cmnd *SCpnt)
                up(&fc_sem);
 }
 
-int pluto_slave_configure(Scsi_Device *device)
+int pluto_slave_configure(struct scsi_device *device)
 {
        int depth_to_use;
 
@@ -90,11 +90,11 @@ int pluto_slave_configure(Scsi_Device *device)
 
 /* Detect all SSAs attached to the machine.
    To be fast, do it on all online FC channels at the same time. */
-int __init pluto_detect(Scsi_Host_Template *tpnt)
+int __init pluto_detect(struct scsi_host_template *tpnt)
 {
        int i, retry, nplutos;
        fc_channel *fc;
-       Scsi_Device dev;
+       struct scsi_device dev;
        DEFINE_TIMER(fc_timer, pluto_detect_timeout, 0, 0);
 
        tpnt->proc_name = "pluto";
@@ -339,7 +339,7 @@ static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cm
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = "Sparc Storage Array 100/200",
        .detect                 = pluto_detect,
        .release                = pluto_release,
index beb844aafccddb8b6ac8846f64ac6bf4b0f79e2a..5da20616ac36c092ee0e0cf64a9d004a7f2de487 100644 (file)
@@ -38,10 +38,10 @@ struct pluto_inquiry {
 /* This is the max number of outstanding SCSI commands per pluto */
 #define PLUTO_CAN_QUEUE                254
 
-int pluto_detect(Scsi_Host_Template *);
+int pluto_detect(struct scsi_host_template *);
 int pluto_release(struct Scsi_Host *);
 const char * pluto_info(struct Scsi_Host *);
-int pluto_slave_configure(Scsi_Device *);
+int pluto_slave_configure(struct scsi_device *);
 
 #endif /* !(_PLUTO_H) */
 
index 4322c95c995c66888235b7a77f066769db4ab58d..5c2cdf523c3ba35baba4f4b16880ff71111dcade 100644 (file)
@@ -538,7 +538,7 @@ static void ReadChipMemory (void *pdata, USHORT base, USHORT length, USHORT port
  *     Returns:                Number of adapters found.
  *
  ****************************************************************/
-static int Psi240i_Detect (Scsi_Host_Template *tpnt)
+static int Psi240i_Detect (struct scsi_host_template *tpnt)
        {
        int                                     board;
        int                                     count = 0;
@@ -669,7 +669,7 @@ static int Psi240i_BiosParam (struct scsi_device *sdev, struct block_device *dev
 
 MODULE_LICENSE("GPL");
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "psi240i", 
        .name                   = "PSI-240I EIDE Disk Controller",
        .detect                 = Psi240i_Detect,
index 637fb6565d2845dc32a81606f93d09f263b01921..0878f95b54499fc0c26a807624c3cb1345821b0a 100644 (file)
@@ -465,7 +465,7 @@ scsi_adjust_queue_depth(struct scsi_device *device, int tag, int depth)
        }
        device->queue_depth = depth;
 }
-static inline struct Scsi_Host *scsi_host_alloc(Scsi_Host_Template *t, size_t s)
+static inline struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *t, size_t s)
 {
        return scsi_register(t, s);
 }
@@ -639,10 +639,8 @@ struct qla_boards {
 static struct pci_device_id qla1280_pci_tbl[] = {
        {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP12160,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-#ifdef CONFIG_SCSI_QLOGIC_1280_1040
        {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1020,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
-#endif
        {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1080,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
        {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1240,
@@ -1177,7 +1175,7 @@ qla1280_biosparam(struct scsi_device *sdev, struct block_device *bdev,
 
 #if LINUX_VERSION_CODE < 0x020600
 static int
-qla1280_detect(Scsi_Host_Template *template)
+qla1280_detect(struct scsi_host_template *template)
 {
        struct pci_device_id *id = &qla1280_pci_tbl[0];
        struct pci_dev *pdev = NULL;
@@ -4507,7 +4505,7 @@ static struct scsi_host_template qla1280_driver_template = {
        .use_clustering         = ENABLE_CLUSTERING,
 };
 #else
-static Scsi_Host_Template qla1280_driver_template = {
+static struct scsi_host_template qla1280_driver_template = {
        .proc_name              = "qla1280",
        .name                   = "Qlogic ISP 1280/12160",
        .detect                 = qla1280_detect,
index 89793c1c06b1e8569da9e53b2fa90a5090a6ca7a..5c5d2315cfab2073b0fdaf892e83e4f477b9bfc2 100644 (file)
@@ -970,7 +970,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        int             rval;
        uint32_t        cnt, timer;
        uint32_t        risc_address;
-       uint16_t        mb[4];
+       uint16_t        mb[4], wd;
 
        uint32_t        stat;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
@@ -1514,10 +1514,10 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
 
                WRT_REG_DWORD(&reg->ctrl_status,
                    CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
-               RD_REG_DWORD(&reg->ctrl_status);
+               pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
 
+               udelay(100);
                /* Wait for firmware to complete NVRAM accesses. */
-               udelay(5);
                mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
                for (cnt = 10000 ; cnt && mb[0]; cnt--) {
                        udelay(5);
@@ -1525,7 +1525,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
                        barrier();
                }
 
-               udelay(20);
+               /* Wait for soft-reset to complete. */
                for (cnt = 0; cnt < 30000; cnt++) {
                        if ((RD_REG_DWORD(&reg->ctrl_status) &
                            CSRX_ISP_SOFT_RESET) == 0)
index 72d9090df3dff8e8863204183b938c854392ce38..2d720121a0d36fea181edc21dbc701349dab6731 100644 (file)
@@ -147,8 +147,8 @@ check_fw_ready_again:
                                         * LIP to complete
                                         */
 
-                                       if (atomic_read(&ha->loop_state) ==
-                                           LOOP_DOWN && retry--) {
+                                       if (atomic_read(&ha->loop_state) !=
+                                           LOOP_READY && retry--) {
                                                goto check_fw_ready_again;
                                        }
                                        wait_time--;
@@ -567,6 +567,7 @@ qla24xx_reset_risc(scsi_qla_host_t *ha)
        unsigned long flags = 0;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
        uint32_t cnt, d2;
+       uint16_t wd;
 
        spin_lock_irqsave(&ha->hardware_lock, flags);
 
@@ -581,10 +582,10 @@ qla24xx_reset_risc(scsi_qla_host_t *ha)
 
        WRT_REG_DWORD(&reg->ctrl_status,
            CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
-       RD_REG_DWORD(&reg->ctrl_status);
+       pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
 
+       udelay(100);
        /* Wait for firmware to complete NVRAM accesses. */
-       udelay(5);
        d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
        for (cnt = 10000 ; cnt && d2; cnt--) {
                udelay(5);
@@ -592,7 +593,7 @@ qla24xx_reset_risc(scsi_qla_host_t *ha)
                barrier();
        }
 
-       udelay(20);
+       /* Wait for soft-reset to complete. */
        d2 = RD_REG_DWORD(&reg->ctrl_status);
        for (cnt = 6000000 ; cnt && (d2 & CSRX_ISP_SOFT_RESET); cnt--) {
                udelay(5);
@@ -1258,9 +1259,15 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
        rval = qla2x00_get_adapter_id(ha,
            &loop_id, &al_pa, &area, &domain, &topo);
        if (rval != QLA_SUCCESS) {
-               qla_printk(KERN_WARNING, ha,
-                   "ERROR -- Unable to get host loop ID.\n");
-               set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+               if (LOOP_NOT_READY(ha) || atomic_read(&ha->loop_down_timer) ||
+                   (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
+                       DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
+                           __func__, ha->host_no));
+               } else {
+                       qla_printk(KERN_WARNING, ha,
+                           "ERROR -- Unable to get host loop ID.\n");
+                       set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+               }
                return (rval);
        }
 
@@ -1789,7 +1796,7 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
        }
 
        if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
-               if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
+               if (LOOP_NOT_READY(ha)) {
                        rval = QLA_FUNCTION_FAILED;
                } else {
                        rval = qla2x00_configure_fabric(ha);
@@ -2362,8 +2369,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports)
                if (qla2x00_is_reserved_id(ha, loop_id))
                        continue;
 
-               if (atomic_read(&ha->loop_down_timer) ||
-                   test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
+               if (atomic_read(&ha->loop_down_timer) || LOOP_NOT_READY(ha))
                        break;
 
                if (swl != NULL) {
index ad3cacb9192d608e67f757edad61a945b978949a..9746cd1e664bd70429021ba77d68d5f071dd5c50 100644 (file)
@@ -868,10 +868,6 @@ qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
        DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);)
 
        fcport = sp->fcport;
-       if (atomic_read(&ha->loop_state) == LOOP_DOWN ||
-           atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
-               return 1;
-       }
 
        spin_lock_irqsave(&ha->hardware_lock, flags);
        for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
@@ -1008,6 +1004,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
        mcp->tov = 30;
        mcp->flags = 0;
        rval = qla2x00_mailbox_command(ha, mcp);
+       if (mcp->mb[0] == MBS_COMMAND_ERROR)
+               rval = QLA_COMMAND_ERROR;
 
        /* Return data. */
        *id = mcp->mb[1];
@@ -2179,10 +2177,6 @@ qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp)
        DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
 
        fcport = sp->fcport;
-       if (atomic_read(&ha->loop_state) == LOOP_DOWN ||
-           atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
-               return QLA_FUNCTION_FAILED;
-       }
 
        spin_lock_irqsave(&ha->hardware_lock, flags);
        for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
index 4bec0b4fb6b462cfc5bfe975763cff3f0f74cca3..d54d2a99c3d353545da80de30d4ad4705c1aebdb 100644 (file)
@@ -126,6 +126,7 @@ qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint32_t addr, uint16_t data)
 
        /* Wait for NVRAM to become ready */
        WRT_REG_WORD(&reg->nvram, NVR_SELECT);
+       RD_REG_WORD(&reg->nvram);               /* PCI Posting. */
        do {
                NVRAM_DELAY();
                word = RD_REG_WORD(&reg->nvram);
@@ -178,6 +179,7 @@ qla2x00_write_nvram_word_tmo(scsi_qla_host_t *ha, uint32_t addr, uint16_t data,
 
        /* Wait for NVRAM to become ready */
        WRT_REG_WORD(&reg->nvram, NVR_SELECT);
+       RD_REG_WORD(&reg->nvram);               /* PCI Posting. */
        do {
                NVRAM_DELAY();
                word = RD_REG_WORD(&reg->nvram);
@@ -235,6 +237,7 @@ qla2x00_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd)
        /* Read data from NVRAM. */
        for (cnt = 0; cnt < 16; cnt++) {
                WRT_REG_WORD(&reg->nvram, NVR_SELECT | NVR_CLOCK);
+               RD_REG_WORD(&reg->nvram);       /* PCI Posting. */
                NVRAM_DELAY();
                data <<= 1;
                reg_data = RD_REG_WORD(&reg->nvram);
@@ -337,6 +340,7 @@ qla2x00_clear_nvram_protection(scsi_qla_host_t *ha)
 
                /* Wait for NVRAM to become ready. */
                WRT_REG_WORD(&reg->nvram, NVR_SELECT);
+               RD_REG_WORD(&reg->nvram);       /* PCI Posting. */
                do {
                        NVRAM_DELAY();
                        word = RD_REG_WORD(&reg->nvram);
@@ -388,6 +392,7 @@ qla2x00_set_nvram_protection(scsi_qla_host_t *ha, int stat)
 
        /* Wait for NVRAM to become ready. */
        WRT_REG_WORD(&reg->nvram, NVR_SELECT);
+       RD_REG_WORD(&reg->nvram);               /* PCI Posting. */
        do {
                NVRAM_DELAY();
                word = RD_REG_WORD(&reg->nvram);
index 0d5472f2f59b384e6cfd9fb38284b3cdc0e3ed36..f7937f7f9c680cf4d373cc08aea9d915f3aa82f8 100644 (file)
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION      "8.01.00-k"
+#define QLA2XXX_VERSION      "8.01.03-k"
 
 #define QLA_DRIVER_MAJOR_VER   8
 #define QLA_DRIVER_MINOR_VER   1
-#define QLA_DRIVER_PATCH_VER   0
+#define QLA_DRIVER_PATCH_VER   3
 #define QLA_DRIVER_BETA_VER    0
index 55e698b651d694364c6f99ed9d109da5ba47ab27..94baca840efe45308070d964c4fb8612c9208198 100644 (file)
@@ -47,7 +47,7 @@ static char qlogicfas_name[] = "qlogicfas";
  *     Look for qlogic card and init if found 
  */
  
-static struct Scsi_Host *__qlogicfas_detect(Scsi_Host_Template *host,
+static struct Scsi_Host *__qlogicfas_detect(struct scsi_host_template *host,
                                                                int qbase,
                                                                int qlirq)
 {
@@ -142,7 +142,7 @@ module_param_array(irq, int, NULL, 0);
 MODULE_PARM_DESC(iobase, "I/O address");
 MODULE_PARM_DESC(irq, "IRQ");
 
-static int __devinit qlogicfas_detect(Scsi_Host_Template *sht)
+static int __devinit qlogicfas_detect(struct scsi_host_template *sht)
 {
        struct Scsi_Host *shost;
        struct qlogicfas408_priv *priv;
@@ -183,7 +183,7 @@ static int qlogicfas_release(struct Scsi_Host *shost)
 /*
  *     The driver template is also needed for PCMCIA
  */
-static Scsi_Host_Template qlogicfas_driver_template = {
+static struct scsi_host_template qlogicfas_driver_template = {
        .module                 = THIS_MODULE,
        .name                   = qlogicfas_name,
        .proc_name              = qlogicfas_name,
index a4b3b3fd4815df4c35b9d5149b0605f511ddd730..94ef3f08d378b895d7329373404b08fd04e73ad5 100644 (file)
@@ -711,7 +711,7 @@ static inline void isp2x00_disable_irqs(struct Scsi_Host *host)
 }
 
 
-static int isp2x00_detect(Scsi_Host_Template * tmpt)
+static int isp2x00_detect(struct scsi_host_template * tmpt)
 {
        int hosts = 0;
        unsigned long wait_time;
@@ -2210,7 +2210,7 @@ void isp2x00_print_scsi_cmd(Scsi_Cmnd * cmd)
 
 MODULE_LICENSE("GPL");
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
         .detect                 = isp2x00_detect,
         .release                = isp2x00_release,
         .info                   = isp2x00_info,
diff --git a/drivers/scsi/qlogicisp.c b/drivers/scsi/qlogicisp.c
deleted file mode 100644 (file)
index 6c9266b..0000000
+++ /dev/null
@@ -1,1934 +0,0 @@
-/*
- * QLogic ISP1020 Intelligent SCSI Processor Driver (PCI)
- * Written by Erik H. Moe, ehm@cris.com
- * Copyright 1995, Erik H. Moe
- * Copyright 1996, 1997  Michael A. Griffith <grif@acm.org>
- * Copyright 2000, Jayson C. Vantuyl <vantuyl@csc.smsu.edu>
- *             and Bryon W. Roche    <bryon@csc.smsu.edu>
- *
- * 64-bit addressing added by Kanoj Sarcar <kanoj@sgi.com>
- *                        and Leo Dagum    <dagum@sgi.com>
- *
- * 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, or (at your option) any
- * later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- */
-
-#include <linux/blkdev.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/delay.h>
-#include <linux/unistd.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/byteorder.h>
-#include "scsi.h"
-#include <scsi/scsi_host.h>
-
-/*
- * With the qlogic interface, every queue slot can hold a SCSI
- * command with up to 4 scatter/gather entries.  If we need more
- * than 4 entries, continuation entries can be used that hold
- * another 7 entries each.  Unlike for other drivers, this means
- * that the maximum number of scatter/gather entries we can
- * support at any given time is a function of the number of queue
- * slots available.  That is, host->can_queue and host->sg_tablesize
- * are dynamic and _not_ independent.  This all works fine because
- * requests are queued serially and the scatter/gather limit is
- * determined for each queue request anew.
- */
-#define QLOGICISP_REQ_QUEUE_LEN        63      /* must be power of two - 1 */
-#define QLOGICISP_MAX_SG(ql)   (4 + ((ql) > 0) ? 7*((ql) - 1) : 0)
-
-/* Configuration section *****************************************************/
-
-/* Set the following macro to 1 to reload the ISP1020's firmware.  This is
-   the latest firmware provided by QLogic.  This may be an earlier/later
-   revision than supplied by your board. */
-
-#define RELOAD_FIRMWARE                1
-
-/* Set the following macro to 1 to reload the ISP1020's defaults from nvram.
-   If you are not sure of your settings, leave this alone, the driver will
-   use a set of 'safe' defaults */
-
-#define USE_NVRAM_DEFAULTS     0
-
-/*  Macros used for debugging */
-
-#define DEBUG_ISP1020          0
-#define DEBUG_ISP1020_INTR     0
-#define DEBUG_ISP1020_SETUP    0
-#define TRACE_ISP              0
-
-#define DEFAULT_LOOP_COUNT     1000000
-
-/* End Configuration section *************************************************/
-
-#include <linux/module.h>
-
-#if TRACE_ISP
-
-# define TRACE_BUF_LEN (32*1024)
-
-struct {
-       u_long          next;
-       struct {
-               u_long          time;
-               u_int           index;
-               u_int           addr;
-               u_char *        name;
-       } buf[TRACE_BUF_LEN];
-} trace;
-
-#define TRACE(w, i, a)                                         \
-{                                                              \
-       unsigned long flags;                                    \
-                                                               \
-       trace.buf[trace.next].name  = (w);                      \
-       trace.buf[trace.next].time  = jiffies;                  \
-       trace.buf[trace.next].index = (i);                      \
-       trace.buf[trace.next].addr  = (long) (a);               \
-       trace.next = (trace.next + 1) & (TRACE_BUF_LEN - 1);    \
-}
-
-#else
-# define TRACE(w, i, a)
-#endif
-
-#if DEBUG_ISP1020
-#define ENTER(x)       printk("isp1020 : entering %s()\n", x);
-#define LEAVE(x)       printk("isp1020 : leaving %s()\n", x);
-#define DEBUG(x)       x
-#else
-#define ENTER(x)
-#define LEAVE(x)
-#define DEBUG(x)
-#endif /* DEBUG_ISP1020 */
-
-#if DEBUG_ISP1020_INTR
-#define ENTER_INTR(x)  printk("isp1020 : entering %s()\n", x);
-#define LEAVE_INTR(x)  printk("isp1020 : leaving %s()\n", x);
-#define DEBUG_INTR(x)  x
-#else
-#define ENTER_INTR(x)
-#define LEAVE_INTR(x)
-#define DEBUG_INTR(x)
-#endif /* DEBUG ISP1020_INTR */
-
-#define ISP1020_REV_ID 1
-
-#define MAX_TARGETS    16
-#define MAX_LUNS       8
-
-/* host configuration and control registers */
-#define HOST_HCCR      0xc0    /* host command and control */
-
-/* pci bus interface registers */
-#define PCI_ID_LOW     0x00    /* vendor id */
-#define PCI_ID_HIGH    0x02    /* device id */
-#define ISP_CFG0       0x04    /* configuration register #0 */
-#define  ISP_CFG0_HWMSK  0x000f        /* Hardware revision mask */
-#define  ISP_CFG0_1020  0x0001 /* ISP1020 */
-#define  ISP_CFG0_1020A         0x0002 /* ISP1020A */
-#define  ISP_CFG0_1040  0x0003 /* ISP1040 */
-#define  ISP_CFG0_1040A         0x0004 /* ISP1040A */
-#define  ISP_CFG0_1040B         0x0005 /* ISP1040B */
-#define  ISP_CFG0_1040C         0x0006 /* ISP1040C */
-#define ISP_CFG1       0x06    /* configuration register #1 */
-#define  ISP_CFG1_F128  0x0040 /* 128-byte FIFO threshold */
-#define  ISP_CFG1_F64   0x0030 /* 128-byte FIFO threshold */
-#define  ISP_CFG1_F32   0x0020 /* 128-byte FIFO threshold */
-#define  ISP_CFG1_F16   0x0010 /* 128-byte FIFO threshold */
-#define  ISP_CFG1_BENAB         0x0004 /* Global Bus burst enable */
-#define  ISP_CFG1_SXP   0x0001 /* SXP register select */
-#define PCI_INTF_CTL   0x08    /* pci interface control */
-#define PCI_INTF_STS   0x0a    /* pci interface status */
-#define PCI_SEMAPHORE  0x0c    /* pci semaphore */
-#define PCI_NVRAM      0x0e    /* pci nvram interface */
-#define CDMA_CONF      0x20    /* Command DMA Config */
-#define DDMA_CONF      0x40    /* Data DMA Config */
-#define  DMA_CONF_SENAB         0x0008 /* SXP to DMA Data enable */
-#define  DMA_CONF_RIRQ  0x0004 /* RISC interrupt enable */
-#define  DMA_CONF_BENAB         0x0002 /* Bus burst enable */
-#define  DMA_CONF_DIR   0x0001 /* DMA direction (0=fifo->host 1=host->fifo) */
-
-/* mailbox registers */
-#define MBOX0          0x70    /* mailbox 0 */
-#define MBOX1          0x72    /* mailbox 1 */
-#define MBOX2          0x74    /* mailbox 2 */
-#define MBOX3          0x76    /* mailbox 3 */
-#define MBOX4          0x78    /* mailbox 4 */
-#define MBOX5          0x7a    /* mailbox 5 */
-#define MBOX6           0x7c    /* mailbox 6 */
-#define MBOX7           0x7e    /* mailbox 7 */
-
-/* mailbox command complete status codes */
-#define MBOX_COMMAND_COMPLETE          0x4000
-#define INVALID_COMMAND                        0x4001
-#define HOST_INTERFACE_ERROR           0x4002
-#define TEST_FAILED                    0x4003
-#define COMMAND_ERROR                  0x4005
-#define COMMAND_PARAM_ERROR            0x4006
-
-/* async event status codes */
-#define ASYNC_SCSI_BUS_RESET           0x8001
-#define SYSTEM_ERROR                   0x8002
-#define REQUEST_TRANSFER_ERROR         0x8003
-#define RESPONSE_TRANSFER_ERROR                0x8004
-#define REQUEST_QUEUE_WAKEUP           0x8005
-#define EXECUTION_TIMEOUT_RESET                0x8006
-
-#ifdef CONFIG_QL_ISP_A64
-#define IOCB_SEGS                       2
-#define CONTINUATION_SEGS               5
-#define MAX_CONTINUATION_ENTRIES        254
-#else
-#define IOCB_SEGS                       4
-#define CONTINUATION_SEGS               7
-#endif /* CONFIG_QL_ISP_A64 */
-
-struct Entry_header {
-       u_char  entry_type;
-       u_char  entry_cnt;
-       u_char  sys_def_1;
-       u_char  flags;
-};
-
-/* entry header type commands */
-#ifdef CONFIG_QL_ISP_A64
-#define ENTRY_COMMAND           9
-#define ENTRY_CONTINUATION      0xa
-#else
-#define ENTRY_COMMAND          1
-#define ENTRY_CONTINUATION     2
-#endif /* CONFIG_QL_ISP_A64 */
-
-#define ENTRY_STATUS           3
-#define ENTRY_MARKER           4
-#define ENTRY_EXTENDED_COMMAND 5
-
-/* entry header flag definitions */
-#define EFLAG_CONTINUATION     1
-#define EFLAG_BUSY             2
-#define EFLAG_BAD_HEADER       4
-#define EFLAG_BAD_PAYLOAD      8
-
-struct dataseg {
-       u_int                   d_base;
-#ifdef CONFIG_QL_ISP_A64
-       u_int                   d_base_hi;
-#endif
-       u_int                   d_count;
-};
-
-struct Command_Entry {
-       struct Entry_header     hdr;
-       u_int                   handle;
-       u_char                  target_lun;
-       u_char                  target_id;
-       u_short                 cdb_length;
-       u_short                 control_flags;
-       u_short                 rsvd;
-       u_short                 time_out;
-       u_short                 segment_cnt;
-       u_char                  cdb[12];
-#ifdef CONFIG_QL_ISP_A64
-       u_int                   rsvd1;
-       u_int                   rsvd2;
-#endif
-       struct dataseg          dataseg[IOCB_SEGS];
-};
-
-/* command entry control flag definitions */
-#define CFLAG_NODISC           0x01
-#define CFLAG_HEAD_TAG         0x02
-#define CFLAG_ORDERED_TAG      0x04
-#define CFLAG_SIMPLE_TAG       0x08
-#define CFLAG_TAR_RTN          0x10
-#define CFLAG_READ             0x20
-#define CFLAG_WRITE            0x40
-
-struct Ext_Command_Entry {
-       struct Entry_header     hdr;
-       u_int                   handle;
-       u_char                  target_lun;
-       u_char                  target_id;
-       u_short                 cdb_length;
-       u_short                 control_flags;
-       u_short                 rsvd;
-       u_short                 time_out;
-       u_short                 segment_cnt;
-       u_char                  cdb[44];
-};
-
-struct Continuation_Entry {
-       struct Entry_header     hdr;
-#ifndef CONFIG_QL_ISP_A64
-       u_int                   reserved;
-#endif
-       struct dataseg          dataseg[CONTINUATION_SEGS];
-};
-
-struct Marker_Entry {
-       struct Entry_header     hdr;
-       u_int                   reserved;
-       u_char                  target_lun;
-       u_char                  target_id;
-       u_char                  modifier;
-       u_char                  rsvd;
-       u_char                  rsvds[52];
-};
-
-/* marker entry modifier definitions */
-#define SYNC_DEVICE    0
-#define SYNC_TARGET    1
-#define SYNC_ALL       2
-
-struct Status_Entry {
-       struct Entry_header     hdr;
-       u_int                   handle;
-       u_short                 scsi_status;
-       u_short                 completion_status;
-       u_short                 state_flags;
-       u_short                 status_flags;
-       u_short                 time;
-       u_short                 req_sense_len;
-       u_int                   residual;
-       u_char                  rsvd[8];
-       u_char                  req_sense_data[32];
-};
-
-/* status entry completion status definitions */
-#define CS_COMPLETE                    0x0000
-#define CS_INCOMPLETE                  0x0001
-#define CS_DMA_ERROR                   0x0002
-#define CS_TRANSPORT_ERROR             0x0003
-#define CS_RESET_OCCURRED              0x0004
-#define CS_ABORTED                     0x0005
-#define CS_TIMEOUT                     0x0006
-#define CS_DATA_OVERRUN                        0x0007
-#define CS_COMMAND_OVERRUN             0x0008
-#define CS_STATUS_OVERRUN              0x0009
-#define CS_BAD_MESSAGE                 0x000a
-#define CS_NO_MESSAGE_OUT              0x000b
-#define CS_EXT_ID_FAILED               0x000c
-#define CS_IDE_MSG_FAILED              0x000d
-#define CS_ABORT_MSG_FAILED            0x000e
-#define CS_REJECT_MSG_FAILED           0x000f
-#define CS_NOP_MSG_FAILED              0x0010
-#define CS_PARITY_ERROR_MSG_FAILED     0x0011
-#define CS_DEVICE_RESET_MSG_FAILED     0x0012
-#define CS_ID_MSG_FAILED               0x0013
-#define CS_UNEXP_BUS_FREE              0x0014
-#define CS_DATA_UNDERRUN               0x0015
-
-/* status entry state flag definitions */
-#define SF_GOT_BUS                     0x0100
-#define SF_GOT_TARGET                  0x0200
-#define SF_SENT_CDB                    0x0400
-#define SF_TRANSFERRED_DATA            0x0800
-#define SF_GOT_STATUS                  0x1000
-#define SF_GOT_SENSE                   0x2000
-
-/* status entry status flag definitions */
-#define STF_DISCONNECT                 0x0001
-#define STF_SYNCHRONOUS                        0x0002
-#define STF_PARITY_ERROR               0x0004
-#define STF_BUS_RESET                  0x0008
-#define STF_DEVICE_RESET               0x0010
-#define STF_ABORTED                    0x0020
-#define STF_TIMEOUT                    0x0040
-#define STF_NEGOTIATION                        0x0080
-
-/* interface control commands */
-#define ISP_RESET                      0x0001
-#define ISP_EN_INT                     0x0002
-#define ISP_EN_RISC                    0x0004
-
-/* host control commands */
-#define HCCR_NOP                       0x0000
-#define HCCR_RESET                     0x1000
-#define HCCR_PAUSE                     0x2000
-#define HCCR_RELEASE                   0x3000
-#define HCCR_SINGLE_STEP               0x4000
-#define HCCR_SET_HOST_INTR             0x5000
-#define HCCR_CLEAR_HOST_INTR           0x6000
-#define HCCR_CLEAR_RISC_INTR           0x7000
-#define HCCR_BP_ENABLE                 0x8000
-#define HCCR_BIOS_DISABLE              0x9000
-#define HCCR_TEST_MODE                 0xf000
-
-#define RISC_BUSY                      0x0004
-
-/* mailbox commands */
-#define MBOX_NO_OP                     0x0000
-#define MBOX_LOAD_RAM                  0x0001
-#define MBOX_EXEC_FIRMWARE             0x0002
-#define MBOX_DUMP_RAM                  0x0003
-#define MBOX_WRITE_RAM_WORD            0x0004
-#define MBOX_READ_RAM_WORD             0x0005
-#define MBOX_MAILBOX_REG_TEST          0x0006
-#define MBOX_VERIFY_CHECKSUM           0x0007
-#define MBOX_ABOUT_FIRMWARE            0x0008
-#define MBOX_CHECK_FIRMWARE            0x000e
-#define MBOX_INIT_REQ_QUEUE            0x0010
-#define MBOX_INIT_RES_QUEUE            0x0011
-#define MBOX_EXECUTE_IOCB              0x0012
-#define MBOX_WAKE_UP                   0x0013
-#define MBOX_STOP_FIRMWARE             0x0014
-#define MBOX_ABORT                     0x0015
-#define MBOX_ABORT_DEVICE              0x0016
-#define MBOX_ABORT_TARGET              0x0017
-#define MBOX_BUS_RESET                 0x0018
-#define MBOX_STOP_QUEUE                        0x0019
-#define MBOX_START_QUEUE               0x001a
-#define MBOX_SINGLE_STEP_QUEUE         0x001b
-#define MBOX_ABORT_QUEUE               0x001c
-#define MBOX_GET_DEV_QUEUE_STATUS      0x001d
-#define MBOX_GET_FIRMWARE_STATUS       0x001f
-#define MBOX_GET_INIT_SCSI_ID          0x0020
-#define MBOX_GET_SELECT_TIMEOUT                0x0021
-#define MBOX_GET_RETRY_COUNT           0x0022
-#define MBOX_GET_TAG_AGE_LIMIT         0x0023
-#define MBOX_GET_CLOCK_RATE            0x0024
-#define MBOX_GET_ACT_NEG_STATE         0x0025
-#define MBOX_GET_ASYNC_DATA_SETUP_TIME 0x0026
-#define MBOX_GET_PCI_PARAMS            0x0027
-#define MBOX_GET_TARGET_PARAMS         0x0028
-#define MBOX_GET_DEV_QUEUE_PARAMS      0x0029
-#define MBOX_SET_INIT_SCSI_ID          0x0030
-#define MBOX_SET_SELECT_TIMEOUT                0x0031
-#define MBOX_SET_RETRY_COUNT           0x0032
-#define MBOX_SET_TAG_AGE_LIMIT         0x0033
-#define MBOX_SET_CLOCK_RATE            0x0034
-#define MBOX_SET_ACTIVE_NEG_STATE      0x0035
-#define MBOX_SET_ASYNC_DATA_SETUP_TIME 0x0036
-#define MBOX_SET_PCI_CONTROL_PARAMS    0x0037
-#define MBOX_SET_TARGET_PARAMS         0x0038
-#define MBOX_SET_DEV_QUEUE_PARAMS      0x0039
-#define MBOX_RETURN_BIOS_BLOCK_ADDR    0x0040
-#define MBOX_WRITE_FOUR_RAM_WORDS      0x0041
-#define MBOX_EXEC_BIOS_IOCB            0x0042
-
-#ifdef CONFIG_QL_ISP_A64
-#define MBOX_CMD_INIT_REQUEST_QUEUE_64      0x0052
-#define MBOX_CMD_INIT_RESPONSE_QUEUE_64     0x0053
-#endif /* CONFIG_QL_ISP_A64 */
-
-#include "qlogicisp_asm.c"
-
-#define PACKB(a, b)                    (((a)<<4)|(b))
-
-static const u_char mbox_param[] = {
-       PACKB(1, 1),    /* MBOX_NO_OP */
-       PACKB(5, 5),    /* MBOX_LOAD_RAM */
-       PACKB(2, 0),    /* MBOX_EXEC_FIRMWARE */
-       PACKB(5, 5),    /* MBOX_DUMP_RAM */
-       PACKB(3, 3),    /* MBOX_WRITE_RAM_WORD */
-       PACKB(2, 3),    /* MBOX_READ_RAM_WORD */
-       PACKB(6, 6),    /* MBOX_MAILBOX_REG_TEST */
-       PACKB(2, 3),    /* MBOX_VERIFY_CHECKSUM */
-       PACKB(1, 3),    /* MBOX_ABOUT_FIRMWARE */
-       PACKB(0, 0),    /* 0x0009 */
-       PACKB(0, 0),    /* 0x000a */
-       PACKB(0, 0),    /* 0x000b */
-       PACKB(0, 0),    /* 0x000c */
-       PACKB(0, 0),    /* 0x000d */
-       PACKB(1, 2),    /* MBOX_CHECK_FIRMWARE */
-       PACKB(0, 0),    /* 0x000f */
-       PACKB(5, 5),    /* MBOX_INIT_REQ_QUEUE */
-       PACKB(6, 6),    /* MBOX_INIT_RES_QUEUE */
-       PACKB(4, 4),    /* MBOX_EXECUTE_IOCB */
-       PACKB(2, 2),    /* MBOX_WAKE_UP */
-       PACKB(1, 6),    /* MBOX_STOP_FIRMWARE */
-       PACKB(4, 4),    /* MBOX_ABORT */
-       PACKB(2, 2),    /* MBOX_ABORT_DEVICE */
-       PACKB(3, 3),    /* MBOX_ABORT_TARGET */
-       PACKB(2, 2),    /* MBOX_BUS_RESET */
-       PACKB(2, 3),    /* MBOX_STOP_QUEUE */
-       PACKB(2, 3),    /* MBOX_START_QUEUE */
-       PACKB(2, 3),    /* MBOX_SINGLE_STEP_QUEUE */
-       PACKB(2, 3),    /* MBOX_ABORT_QUEUE */
-       PACKB(2, 4),    /* MBOX_GET_DEV_QUEUE_STATUS */
-       PACKB(0, 0),    /* 0x001e */
-       PACKB(1, 3),    /* MBOX_GET_FIRMWARE_STATUS */
-       PACKB(1, 2),    /* MBOX_GET_INIT_SCSI_ID */
-       PACKB(1, 2),    /* MBOX_GET_SELECT_TIMEOUT */
-       PACKB(1, 3),    /* MBOX_GET_RETRY_COUNT */
-       PACKB(1, 2),    /* MBOX_GET_TAG_AGE_LIMIT */
-       PACKB(1, 2),    /* MBOX_GET_CLOCK_RATE */
-       PACKB(1, 2),    /* MBOX_GET_ACT_NEG_STATE */
-       PACKB(1, 2),    /* MBOX_GET_ASYNC_DATA_SETUP_TIME */
-       PACKB(1, 3),    /* MBOX_GET_PCI_PARAMS */
-       PACKB(2, 4),    /* MBOX_GET_TARGET_PARAMS */
-       PACKB(2, 4),    /* MBOX_GET_DEV_QUEUE_PARAMS */
-       PACKB(0, 0),    /* 0x002a */
-       PACKB(0, 0),    /* 0x002b */
-       PACKB(0, 0),    /* 0x002c */
-       PACKB(0, 0),    /* 0x002d */
-       PACKB(0, 0),    /* 0x002e */
-       PACKB(0, 0),    /* 0x002f */
-       PACKB(2, 2),    /* MBOX_SET_INIT_SCSI_ID */
-       PACKB(2, 2),    /* MBOX_SET_SELECT_TIMEOUT */
-       PACKB(3, 3),    /* MBOX_SET_RETRY_COUNT */
-       PACKB(2, 2),    /* MBOX_SET_TAG_AGE_LIMIT */
-       PACKB(2, 2),    /* MBOX_SET_CLOCK_RATE */
-       PACKB(2, 2),    /* MBOX_SET_ACTIVE_NEG_STATE */
-       PACKB(2, 2),    /* MBOX_SET_ASYNC_DATA_SETUP_TIME */
-       PACKB(3, 3),    /* MBOX_SET_PCI_CONTROL_PARAMS */
-       PACKB(4, 4),    /* MBOX_SET_TARGET_PARAMS */
-       PACKB(4, 4),    /* MBOX_SET_DEV_QUEUE_PARAMS */
-       PACKB(0, 0),    /* 0x003a */
-       PACKB(0, 0),    /* 0x003b */
-       PACKB(0, 0),    /* 0x003c */
-       PACKB(0, 0),    /* 0x003d */
-       PACKB(0, 0),    /* 0x003e */
-       PACKB(0, 0),    /* 0x003f */
-       PACKB(1, 2),    /* MBOX_RETURN_BIOS_BLOCK_ADDR */
-       PACKB(6, 1),    /* MBOX_WRITE_FOUR_RAM_WORDS */
-       PACKB(2, 3)     /* MBOX_EXEC_BIOS_IOCB */
-#ifdef CONFIG_QL_ISP_A64
-       ,PACKB(0, 0),   /* 0x0043 */
-       PACKB(0, 0),    /* 0x0044 */
-       PACKB(0, 0),    /* 0x0045 */
-       PACKB(0, 0),    /* 0x0046 */
-       PACKB(0, 0),    /* 0x0047 */
-       PACKB(0, 0),    /* 0x0048 */
-       PACKB(0, 0),    /* 0x0049 */
-       PACKB(0, 0),    /* 0x004a */
-       PACKB(0, 0),    /* 0x004b */
-       PACKB(0, 0),    /* 0x004c */
-       PACKB(0, 0),    /* 0x004d */
-       PACKB(0, 0),    /* 0x004e */
-       PACKB(0, 0),    /* 0x004f */
-       PACKB(0, 0),    /* 0x0050 */
-       PACKB(0, 0),    /* 0x0051 */
-       PACKB(8, 8),    /* MBOX_CMD_INIT_REQUEST_QUEUE_64 (0x0052) */
-       PACKB(8, 8)     /* MBOX_CMD_INIT_RESPONSE_QUEUE_64 (0x0053) */
-#endif /* CONFIG_QL_ISP_A64 */
-};
-
-#define MAX_MBOX_COMMAND       (sizeof(mbox_param)/sizeof(u_short))
-
-struct host_param {
-       u_short         fifo_threshold;
-       u_short         host_adapter_enable;
-       u_short         initiator_scsi_id;
-       u_short         bus_reset_delay;
-       u_short         retry_count;
-       u_short         retry_delay;
-       u_short         async_data_setup_time;
-       u_short         req_ack_active_negation;
-       u_short         data_line_active_negation;
-       u_short         data_dma_burst_enable;
-       u_short         command_dma_burst_enable;
-       u_short         tag_aging;
-       u_short         selection_timeout;
-       u_short         max_queue_depth;
-};
-
-/*
- * Device Flags:
- *
- * Bit  Name
- * ---------
- *  7   Disconnect Privilege
- *  6   Parity Checking
- *  5   Wide Data Transfers
- *  4   Synchronous Data Transfers
- *  3   Tagged Queuing
- *  2   Automatic Request Sense
- *  1   Stop Queue on Check Condition
- *  0   Renegotiate on Error
- */
-
-struct dev_param {
-       u_short         device_flags;
-       u_short         execution_throttle;
-       u_short         synchronous_period;
-       u_short         synchronous_offset;
-       u_short         device_enable;
-       u_short         reserved; /* pad */
-};
-
-/*
- * The result queue can be quite a bit smaller since continuation entries
- * do not show up there:
- */
-#define RES_QUEUE_LEN          ((QLOGICISP_REQ_QUEUE_LEN + 1) / 8 - 1)
-#define QUEUE_ENTRY_LEN                64
-#define QSIZE(entries)  (((entries) + 1) * QUEUE_ENTRY_LEN)
-
-struct isp_queue_entry {
-       char __opaque[QUEUE_ENTRY_LEN];
-};
-
-struct isp1020_hostdata {
-       void __iomem *memaddr;
-       u_char  revision;
-       struct  host_param host_param;
-       struct  dev_param dev_param[MAX_TARGETS];
-       struct  pci_dev *pci_dev;
-       
-       struct isp_queue_entry *res_cpu; /* CPU-side address of response queue. */
-       struct isp_queue_entry *req_cpu; /* CPU-size address of request queue. */
-
-       /* result and request queues (shared with isp1020): */
-       u_int   req_in_ptr;             /* index of next request slot */
-       u_int   res_out_ptr;            /* index of next result slot */
-
-       /* this is here so the queues are nicely aligned */
-       long    send_marker;            /* do we need to send a marker? */
-
-       /* The cmd->handle has a fixed size, and is only 32-bits.  We
-        * need to take care to handle 64-bit systems correctly thus what
-        * we actually place in cmd->handle is an index to the following
-        * table.  Kudos to Matt Jacob for the technique.  -DaveM
-        */
-       Scsi_Cmnd *cmd_slots[QLOGICISP_REQ_QUEUE_LEN + 1];
-
-       dma_addr_t res_dma;     /* PCI side view of response queue */
-       dma_addr_t req_dma;     /* PCI side view of request queue */
-};
-
-/* queue length's _must_ be power of two: */
-#define QUEUE_DEPTH(in, out, ql)       ((in - out) & (ql))
-#define REQ_QUEUE_DEPTH(in, out)       QUEUE_DEPTH(in, out,                 \
-                                                   QLOGICISP_REQ_QUEUE_LEN)
-#define RES_QUEUE_DEPTH(in, out)       QUEUE_DEPTH(in, out, RES_QUEUE_LEN)
-
-static void    isp1020_enable_irqs(struct Scsi_Host *);
-static void    isp1020_disable_irqs(struct Scsi_Host *);
-static int     isp1020_init(struct Scsi_Host *);
-static int     isp1020_reset_hardware(struct Scsi_Host *);
-static int     isp1020_set_defaults(struct Scsi_Host *);
-static int     isp1020_load_parameters(struct Scsi_Host *);
-static int     isp1020_mbox_command(struct Scsi_Host *, u_short []); 
-static int     isp1020_return_status(struct Status_Entry *);
-static void    isp1020_intr_handler(int, void *, struct pt_regs *);
-static irqreturn_t do_isp1020_intr_handler(int, void *, struct pt_regs *);
-
-#if USE_NVRAM_DEFAULTS
-static int     isp1020_get_defaults(struct Scsi_Host *);
-static int     isp1020_verify_nvram(struct Scsi_Host *);
-static u_short isp1020_read_nvram_word(struct Scsi_Host *, u_short);
-#endif
-
-#if DEBUG_ISP1020
-static void    isp1020_print_scsi_cmd(Scsi_Cmnd *);
-#endif
-#if DEBUG_ISP1020_INTR
-static void    isp1020_print_status_entry(struct Status_Entry *);
-#endif
-
-/* memaddr should be used to determine if memmapped port i/o is being used
- * non-null memaddr == mmap'd
- * JV 7-Jan-2000
- */
-static inline u_short isp_inw(struct Scsi_Host *host, long offset)
-{
-       struct isp1020_hostdata *h = (struct isp1020_hostdata *)host->hostdata;
-       if (h->memaddr)
-               return readw(h->memaddr + offset);
-       else
-               return inw(host->io_port + offset);
-}
-
-static inline void isp_outw(u_short val, struct Scsi_Host *host, long offset)
-{
-       struct isp1020_hostdata *h = (struct isp1020_hostdata *)host->hostdata;
-       if (h->memaddr)
-               writew(val, h->memaddr + offset);
-       else
-               outw(val, host->io_port + offset);
-}
-
-static inline void isp1020_enable_irqs(struct Scsi_Host *host)
-{
-       isp_outw(ISP_EN_INT|ISP_EN_RISC, host, PCI_INTF_CTL);
-}
-
-
-static inline void isp1020_disable_irqs(struct Scsi_Host *host)
-{
-       isp_outw(0x0, host, PCI_INTF_CTL);
-}
-
-
-static int isp1020_detect(Scsi_Host_Template *tmpt)
-{
-       int hosts = 0;
-       struct Scsi_Host *host;
-       struct isp1020_hostdata *hostdata;
-       struct pci_dev *pdev = NULL;
-
-       ENTER("isp1020_detect");
-
-       tmpt->proc_name = "isp1020";
-
-       while ((pdev = pci_find_device(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1020, pdev)))
-       {
-               if (pci_enable_device(pdev))
-                       continue;
-
-               host = scsi_register(tmpt, sizeof(struct isp1020_hostdata));
-               if (!host)
-                       continue;
-
-               hostdata = (struct isp1020_hostdata *) host->hostdata;
-
-               memset(hostdata, 0, sizeof(struct isp1020_hostdata));
-
-               hostdata->pci_dev = pdev;
-
-               if (isp1020_init(host))
-                       goto fail_and_unregister;
-
-               if (isp1020_reset_hardware(host)
-#if USE_NVRAM_DEFAULTS
-                   || isp1020_get_defaults(host)
-#else
-                   || isp1020_set_defaults(host)
-#endif /* USE_NVRAM_DEFAULTS */
-                   || isp1020_load_parameters(host)) {
-                       goto fail_uninit;
-               }
-
-               host->this_id = hostdata->host_param.initiator_scsi_id;
-               host->max_sectors = 64;
-
-               if (request_irq(host->irq, do_isp1020_intr_handler, SA_INTERRUPT | SA_SHIRQ,
-                               "qlogicisp", host))
-               {
-                       printk("qlogicisp : interrupt %d already in use\n",
-                              host->irq);
-                       goto fail_uninit;
-               }
-
-               isp_outw(0x0, host, PCI_SEMAPHORE);
-               isp_outw(HCCR_CLEAR_RISC_INTR, host, HOST_HCCR);
-               isp1020_enable_irqs(host);
-
-               hosts++;
-               continue;
-
-       fail_uninit:
-               iounmap(hostdata->memaddr);
-               release_region(host->io_port, 0xff);
-       fail_and_unregister:
-               if (hostdata->res_cpu)
-                       pci_free_consistent(hostdata->pci_dev,
-                                           QSIZE(RES_QUEUE_LEN),
-                                           hostdata->res_cpu,
-                                           hostdata->res_dma);
-               if (hostdata->req_cpu)
-                       pci_free_consistent(hostdata->pci_dev,
-                                           QSIZE(QLOGICISP_REQ_QUEUE_LEN),
-                                           hostdata->req_cpu,
-                                           hostdata->req_dma);
-               scsi_unregister(host);
-       }
-
-       LEAVE("isp1020_detect");
-
-       return hosts;
-}
-
-
-static int isp1020_release(struct Scsi_Host *host)
-{
-       struct isp1020_hostdata *hostdata;
-
-       ENTER("isp1020_release");
-
-       hostdata = (struct isp1020_hostdata *) host->hostdata;
-
-       isp_outw(0x0, host, PCI_INTF_CTL);
-       free_irq(host->irq, host);
-
-       iounmap(hostdata->memaddr);
-
-       release_region(host->io_port, 0xff);
-
-       LEAVE("isp1020_release");
-
-       return 0;
-}
-
-
-static const char *isp1020_info(struct Scsi_Host *host)
-{
-       static char buf[80];
-       struct isp1020_hostdata *hostdata;
-
-       ENTER("isp1020_info");
-
-       hostdata = (struct isp1020_hostdata *) host->hostdata;
-       sprintf(buf,
-               "QLogic ISP1020 SCSI on PCI bus %02x device %02x irq %d %s base 0x%lx",
-               hostdata->pci_dev->bus->number, hostdata->pci_dev->devfn, host->irq,
-               (hostdata->memaddr ? "MEM" : "I/O"),
-               (hostdata->memaddr ? (unsigned long)hostdata->memaddr : host->io_port));
-
-       LEAVE("isp1020_info");
-
-       return buf;
-}
-
-
-/*
- * The middle SCSI layer ensures that queuecommand never gets invoked
- * concurrently with itself or the interrupt handler (though the
- * interrupt handler may call this routine as part of
- * request-completion handling).
- */
-static int isp1020_queuecommand(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *))
-{
-       int i, n, num_free;
-       u_int in_ptr, out_ptr;
-       struct dataseg * ds;
-       struct scatterlist *sg;
-       struct Command_Entry *cmd;
-       struct Continuation_Entry *cont;
-       struct Scsi_Host *host;
-       struct isp1020_hostdata *hostdata;
-       dma_addr_t      dma_addr;
-
-       ENTER("isp1020_queuecommand");
-
-       host = Cmnd->device->host;
-       hostdata = (struct isp1020_hostdata *) host->hostdata;
-       Cmnd->scsi_done = done;
-
-       DEBUG(isp1020_print_scsi_cmd(Cmnd));
-
-       out_ptr = isp_inw(host, + MBOX4);
-       in_ptr  = hostdata->req_in_ptr;
-
-       DEBUG(printk("qlogicisp : request queue depth %d\n",
-                    REQ_QUEUE_DEPTH(in_ptr, out_ptr)));
-
-       cmd = (struct Command_Entry *) &hostdata->req_cpu[in_ptr];
-       in_ptr = (in_ptr + 1) & QLOGICISP_REQ_QUEUE_LEN;
-       if (in_ptr == out_ptr) {
-               printk("qlogicisp : request queue overflow\n");
-               return 1;
-       }
-
-       if (hostdata->send_marker) {
-               struct Marker_Entry *marker;
-
-               TRACE("queue marker", in_ptr, 0);
-
-               DEBUG(printk("qlogicisp : adding marker entry\n"));
-               marker = (struct Marker_Entry *) cmd;
-               memset(marker, 0, sizeof(struct Marker_Entry));
-
-               marker->hdr.entry_type = ENTRY_MARKER;
-               marker->hdr.entry_cnt = 1;
-               marker->modifier = SYNC_ALL;
-
-               hostdata->send_marker = 0;
-
-               if (((in_ptr + 1) & QLOGICISP_REQ_QUEUE_LEN) == out_ptr) {
-                       isp_outw(in_ptr, host, MBOX4);
-                       hostdata->req_in_ptr = in_ptr;
-                       printk("qlogicisp : request queue overflow\n");
-                       return 1;
-               }
-               cmd = (struct Command_Entry *) &hostdata->req_cpu[in_ptr];
-               in_ptr = (in_ptr + 1) & QLOGICISP_REQ_QUEUE_LEN;
-       }
-
-       TRACE("queue command", in_ptr, Cmnd);
-
-       memset(cmd, 0, sizeof(struct Command_Entry));
-
-       cmd->hdr.entry_type = ENTRY_COMMAND;
-       cmd->hdr.entry_cnt = 1;
-
-       cmd->target_lun = Cmnd->device->lun;
-       cmd->target_id = Cmnd->device->id;
-       cmd->cdb_length = cpu_to_le16(Cmnd->cmd_len);
-       cmd->control_flags = cpu_to_le16(CFLAG_READ | CFLAG_WRITE);
-       cmd->time_out = cpu_to_le16(30);
-
-       memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len);
-
-       if (Cmnd->use_sg) {
-               int sg_count;
-
-               sg = (struct scatterlist *) Cmnd->request_buffer;
-               ds = cmd->dataseg;
-
-               sg_count = pci_map_sg(hostdata->pci_dev, sg, Cmnd->use_sg,
-                                     Cmnd->sc_data_direction);
-
-               cmd->segment_cnt = cpu_to_le16(sg_count);
-
-               /* fill in first four sg entries: */
-               n = sg_count;
-               if (n > IOCB_SEGS)
-                       n = IOCB_SEGS;
-               for (i = 0; i < n; i++) {
-                       dma_addr = sg_dma_address(sg);
-                       ds[i].d_base  = cpu_to_le32((u32) dma_addr);
-#ifdef CONFIG_QL_ISP_A64
-                       ds[i].d_base_hi = cpu_to_le32((u32) (dma_addr>>32));
-#endif /* CONFIG_QL_ISP_A64 */
-                       ds[i].d_count = cpu_to_le32(sg_dma_len(sg));
-                       ++sg;
-               }
-               sg_count -= IOCB_SEGS;
-
-               while (sg_count > 0) {
-                       ++cmd->hdr.entry_cnt;
-                       cont = (struct Continuation_Entry *)
-                               &hostdata->req_cpu[in_ptr];
-                       in_ptr = (in_ptr + 1) & QLOGICISP_REQ_QUEUE_LEN;
-                       if (in_ptr == out_ptr) {
-                               printk("isp1020: unexpected request queue "
-                                      "overflow\n");
-                               return 1;
-                       }
-                       TRACE("queue continuation", in_ptr, 0);
-                       cont->hdr.entry_type = ENTRY_CONTINUATION;
-                       cont->hdr.entry_cnt  = 0;
-                       cont->hdr.sys_def_1  = 0;
-                       cont->hdr.flags      = 0;
-#ifndef CONFIG_QL_ISP_A64
-                       cont->reserved = 0;
-#endif
-                       ds = cont->dataseg;
-                       n = sg_count;
-                       if (n > CONTINUATION_SEGS)
-                               n = CONTINUATION_SEGS;
-                       for (i = 0; i < n; ++i) {
-                               dma_addr = sg_dma_address(sg);
-                               ds[i].d_base = cpu_to_le32((u32) dma_addr);
-#ifdef CONFIG_QL_ISP_A64
-                               ds[i].d_base_hi = cpu_to_le32((u32)(dma_addr>>32));
-#endif /* CONFIG_QL_ISP_A64 */
-                               ds[i].d_count = cpu_to_le32(sg_dma_len(sg));
-                               ++sg;
-                       }
-                       sg_count -= n;
-               }
-       } else if (Cmnd->request_bufflen) {
-               /*Cmnd->SCp.ptr = (char *)(unsigned long)*/
-               dma_addr = pci_map_single(hostdata->pci_dev,
-                                      Cmnd->request_buffer,
-                                      Cmnd->request_bufflen,
-                                      Cmnd->sc_data_direction);
-               Cmnd->SCp.ptr = (char *)(unsigned long) dma_addr;
-
-               cmd->dataseg[0].d_base =
-                       cpu_to_le32((u32) dma_addr);
-#ifdef CONFIG_QL_ISP_A64
-               cmd->dataseg[0].d_base_hi =
-                       cpu_to_le32((u32) (dma_addr>>32));
-#endif /* CONFIG_QL_ISP_A64 */
-               cmd->dataseg[0].d_count =
-                       cpu_to_le32((u32)Cmnd->request_bufflen);
-               cmd->segment_cnt = cpu_to_le16(1);
-       } else {
-               cmd->dataseg[0].d_base = 0;
-#ifdef CONFIG_QL_ISP_A64
-               cmd->dataseg[0].d_base_hi = 0;
-#endif /* CONFIG_QL_ISP_A64 */
-               cmd->dataseg[0].d_count = 0;
-               cmd->segment_cnt = cpu_to_le16(1); /* Shouldn't this be 0? */
-       }
-
-       /* Committed, record Scsi_Cmd so we can find it later. */
-       cmd->handle = in_ptr;
-       hostdata->cmd_slots[in_ptr] = Cmnd;
-
-       isp_outw(in_ptr, host, MBOX4);
-       hostdata->req_in_ptr = in_ptr;
-
-       num_free = QLOGICISP_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr);
-       host->can_queue = host->host_busy + num_free;
-       host->sg_tablesize = QLOGICISP_MAX_SG(num_free);
-
-       LEAVE("isp1020_queuecommand");
-
-       return 0;
-}
-
-
-#define ASYNC_EVENT_INTERRUPT  0x01
-
-irqreturn_t do_isp1020_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct Scsi_Host *host = dev_id;
-       unsigned long flags;
-
-       spin_lock_irqsave(host->host_lock, flags);
-       isp1020_intr_handler(irq, dev_id, regs);
-       spin_unlock_irqrestore(host->host_lock, flags);
-
-       return IRQ_HANDLED;
-}
-
-void isp1020_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
-{
-       Scsi_Cmnd *Cmnd;
-       struct Status_Entry *sts;
-       struct Scsi_Host *host = dev_id;
-       struct isp1020_hostdata *hostdata;
-       u_int in_ptr, out_ptr;
-       u_short status;
-
-       ENTER_INTR("isp1020_intr_handler");
-
-       hostdata = (struct isp1020_hostdata *) host->hostdata;
-
-       DEBUG_INTR(printk("qlogicisp : interrupt on line %d\n", irq));
-
-       if (!(isp_inw(host, PCI_INTF_STS) & 0x04)) {
-               /* spurious interrupts can happen legally */
-               DEBUG_INTR(printk("qlogicisp: got spurious interrupt\n"));
-               return;
-       }
-       in_ptr = isp_inw(host, MBOX5);
-       isp_outw(HCCR_CLEAR_RISC_INTR, host, HOST_HCCR);
-
-       if ((isp_inw(host, PCI_SEMAPHORE) & ASYNC_EVENT_INTERRUPT)) {
-               status = isp_inw(host, MBOX0);
-
-               DEBUG_INTR(printk("qlogicisp : mbox completion status: %x\n",
-                                 status));
-
-               switch (status) {
-                     case ASYNC_SCSI_BUS_RESET:
-                     case EXECUTION_TIMEOUT_RESET:
-                       hostdata->send_marker = 1;
-                       break;
-                     case INVALID_COMMAND:
-                     case HOST_INTERFACE_ERROR:
-                     case COMMAND_ERROR:
-                     case COMMAND_PARAM_ERROR:
-                       printk("qlogicisp : bad mailbox return status\n");
-                       break;
-               }
-               isp_outw(0x0, host, PCI_SEMAPHORE);
-       }
-       out_ptr = hostdata->res_out_ptr;
-
-       DEBUG_INTR(printk("qlogicisp : response queue update\n"));
-       DEBUG_INTR(printk("qlogicisp : response queue depth %d\n",
-                         QUEUE_DEPTH(in_ptr, out_ptr, RES_QUEUE_LEN)));
-
-       while (out_ptr != in_ptr) {
-               u_int cmd_slot;
-
-               sts = (struct Status_Entry *) &hostdata->res_cpu[out_ptr];
-               out_ptr = (out_ptr + 1) & RES_QUEUE_LEN;
-
-               cmd_slot = sts->handle;
-               Cmnd = hostdata->cmd_slots[cmd_slot];
-               hostdata->cmd_slots[cmd_slot] = NULL;
-
-               TRACE("done", out_ptr, Cmnd);
-
-               if (le16_to_cpu(sts->completion_status) == CS_RESET_OCCURRED
-                   || le16_to_cpu(sts->completion_status) == CS_ABORTED
-                   || (le16_to_cpu(sts->status_flags) & STF_BUS_RESET))
-                       hostdata->send_marker = 1;
-
-               if (le16_to_cpu(sts->state_flags) & SF_GOT_SENSE)
-                       memcpy(Cmnd->sense_buffer, sts->req_sense_data,
-                              sizeof(Cmnd->sense_buffer));
-
-               DEBUG_INTR(isp1020_print_status_entry(sts));
-
-               if (sts->hdr.entry_type == ENTRY_STATUS)
-                       Cmnd->result = isp1020_return_status(sts);
-               else
-                       Cmnd->result = DID_ERROR << 16;
-
-               if (Cmnd->use_sg)
-                       pci_unmap_sg(hostdata->pci_dev,
-                                    (struct scatterlist *)Cmnd->buffer,
-                                    Cmnd->use_sg,
-                                    Cmnd->sc_data_direction);
-               else if (Cmnd->request_bufflen)
-                       pci_unmap_single(hostdata->pci_dev,
-#ifdef CONFIG_QL_ISP_A64
-                                        (dma_addr_t)((long)Cmnd->SCp.ptr),
-#else
-                                        (u32)((long)Cmnd->SCp.ptr),
-#endif
-                                        Cmnd->request_bufflen,
-                                        Cmnd->sc_data_direction);
-
-               isp_outw(out_ptr, host, MBOX5);
-               (*Cmnd->scsi_done)(Cmnd);
-       }
-       hostdata->res_out_ptr = out_ptr;
-
-       LEAVE_INTR("isp1020_intr_handler");
-}
-
-
-static int isp1020_return_status(struct Status_Entry *sts)
-{
-       int host_status = DID_ERROR;
-#if DEBUG_ISP1020_INTR
-       static char *reason[] = {
-               "DID_OK",
-               "DID_NO_CONNECT",
-               "DID_BUS_BUSY",
-               "DID_TIME_OUT",
-               "DID_BAD_TARGET",
-               "DID_ABORT",
-               "DID_PARITY",
-               "DID_ERROR",
-               "DID_RESET",
-               "DID_BAD_INTR"
-       };
-#endif /* DEBUG_ISP1020_INTR */
-
-       ENTER("isp1020_return_status");
-
-       DEBUG(printk("qlogicisp : completion status = 0x%04x\n",
-                    le16_to_cpu(sts->completion_status)));
-
-       switch(le16_to_cpu(sts->completion_status)) {
-             case CS_COMPLETE:
-               host_status = DID_OK;
-               break;
-             case CS_INCOMPLETE:
-               if (!(le16_to_cpu(sts->state_flags) & SF_GOT_BUS))
-                       host_status = DID_NO_CONNECT;
-               else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_TARGET))
-                       host_status = DID_BAD_TARGET;
-               else if (!(le16_to_cpu(sts->state_flags) & SF_SENT_CDB))
-                       host_status = DID_ERROR;
-               else if (!(le16_to_cpu(sts->state_flags) & SF_TRANSFERRED_DATA))
-                       host_status = DID_ERROR;
-               else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_STATUS))
-                       host_status = DID_ERROR;
-               else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_SENSE))
-                       host_status = DID_ERROR;
-               break;
-             case CS_DMA_ERROR:
-             case CS_TRANSPORT_ERROR:
-               host_status = DID_ERROR;
-               break;
-             case CS_RESET_OCCURRED:
-               host_status = DID_RESET;
-               break;
-             case CS_ABORTED:
-               host_status = DID_ABORT;
-               break;
-             case CS_TIMEOUT:
-               host_status = DID_TIME_OUT;
-               break;
-             case CS_DATA_OVERRUN:
-             case CS_COMMAND_OVERRUN:
-             case CS_STATUS_OVERRUN:
-             case CS_BAD_MESSAGE:
-             case CS_NO_MESSAGE_OUT:
-             case CS_EXT_ID_FAILED:
-             case CS_IDE_MSG_FAILED:
-             case CS_ABORT_MSG_FAILED:
-             case CS_NOP_MSG_FAILED:
-             case CS_PARITY_ERROR_MSG_FAILED:
-             case CS_DEVICE_RESET_MSG_FAILED:
-             case CS_ID_MSG_FAILED:
-             case CS_UNEXP_BUS_FREE:
-               host_status = DID_ERROR;
-               break;
-             case CS_DATA_UNDERRUN:
-               host_status = DID_OK;
-               break;
-             default:
-               printk("qlogicisp : unknown completion status 0x%04x\n",
-                      le16_to_cpu(sts->completion_status));
-               host_status = DID_ERROR;
-               break;
-       }
-
-       DEBUG_INTR(printk("qlogicisp : host status (%s) scsi status %x\n",
-                         reason[host_status], le16_to_cpu(sts->scsi_status)));
-
-       LEAVE("isp1020_return_status");
-
-       return (le16_to_cpu(sts->scsi_status) & STATUS_MASK) | (host_status << 16);
-}
-
-
-static int isp1020_biosparam(struct scsi_device *sdev, struct block_device *n,
-               sector_t capacity, int ip[])
-{
-       int size = capacity;
-
-       ENTER("isp1020_biosparam");
-
-       ip[0] = 64;
-       ip[1] = 32;
-       ip[2] = size >> 11;
-       if (ip[2] > 1024) {
-               ip[0] = 255;
-               ip[1] = 63;
-               ip[2] = size / (ip[0] * ip[1]);
-#if 0
-               if (ip[2] > 1023)
-                       ip[2] = 1023;
-#endif                 
-       }
-
-       LEAVE("isp1020_biosparam");
-
-       return 0;
-}
-
-
-static int isp1020_reset_hardware(struct Scsi_Host *host)
-{
-       u_short param[6];
-       int loop_count;
-
-       ENTER("isp1020_reset_hardware");
-
-       isp_outw(ISP_RESET, host, PCI_INTF_CTL);
-       udelay(100);
-       isp_outw(HCCR_RESET, host, HOST_HCCR);
-       udelay(100);
-       isp_outw(HCCR_RELEASE, host, HOST_HCCR);
-       isp_outw(HCCR_BIOS_DISABLE, host, HOST_HCCR);
-
-       loop_count = DEFAULT_LOOP_COUNT;
-       while (--loop_count && isp_inw(host, HOST_HCCR) == RISC_BUSY) {
-               barrier();
-               cpu_relax();
-       }
-       if (!loop_count)
-               printk("qlogicisp: reset_hardware loop timeout\n");
-
-       isp_outw(0, host, ISP_CFG1);
-
-#if DEBUG_ISP1020
-       printk("qlogicisp : mbox 0 0x%04x \n", isp_inw(host, MBOX0));
-       printk("qlogicisp : mbox 1 0x%04x \n", isp_inw(host, MBOX1));
-       printk("qlogicisp : mbox 2 0x%04x \n", isp_inw(host, MBOX2));
-       printk("qlogicisp : mbox 3 0x%04x \n", isp_inw(host, MBOX3));
-       printk("qlogicisp : mbox 4 0x%04x \n", isp_inw(host, MBOX4));
-       printk("qlogicisp : mbox 5 0x%04x \n", isp_inw(host, MBOX5));
-#endif /* DEBUG_ISP1020 */
-
-       param[0] = MBOX_NO_OP;
-       isp1020_mbox_command(host, param);
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : NOP test failed\n");
-               return 1;
-       }
-
-       DEBUG(printk("qlogicisp : loading risc ram\n"));
-
-#if RELOAD_FIRMWARE
-       for (loop_count = 0; loop_count < risc_code_length01; loop_count++) {
-               param[0] = MBOX_WRITE_RAM_WORD;
-               param[1] = risc_code_addr01 + loop_count;
-               param[2] = risc_code01[loop_count];
-               isp1020_mbox_command(host, param);
-               if (param[0] != MBOX_COMMAND_COMPLETE) {
-                       printk("qlogicisp : firmware load failure at %d\n",
-                           loop_count);
-                       return 1;
-               }
-       }
-#endif /* RELOAD_FIRMWARE */
-
-       DEBUG(printk("qlogicisp : verifying checksum\n"));
-
-       param[0] = MBOX_VERIFY_CHECKSUM;
-       param[1] = risc_code_addr01;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : ram checksum failure\n");
-               return 1;
-       }
-
-       DEBUG(printk("qlogicisp : executing firmware\n"));
-
-       param[0] = MBOX_EXEC_FIRMWARE;
-       param[1] = risc_code_addr01;
-
-       isp1020_mbox_command(host, param);
-
-       param[0] = MBOX_ABOUT_FIRMWARE;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : about firmware failure\n");
-               return 1;
-       }
-
-       DEBUG(printk("qlogicisp : firmware major revision %d\n", param[1]));
-       DEBUG(printk("qlogicisp : firmware minor revision %d\n", param[2]));
-
-       LEAVE("isp1020_reset_hardware");
-
-       return 0;
-}
-
-
-static int isp1020_init(struct Scsi_Host *sh)
-{
-       u_long io_base, mem_base, io_flags, mem_flags;
-       struct isp1020_hostdata *hostdata;
-       u_char revision;
-       u_int irq;
-       u_short command;
-       struct pci_dev *pdev;
-
-       ENTER("isp1020_init");
-
-       hostdata = (struct isp1020_hostdata *) sh->hostdata;
-       pdev = hostdata->pci_dev;
-
-       if (pci_read_config_word(pdev, PCI_COMMAND, &command)
-           || pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision))
-       {
-               printk("qlogicisp : error reading PCI configuration\n");
-               return 1;
-       }
-
-       io_base = pci_resource_start(pdev, 0);
-       mem_base = pci_resource_start(pdev, 1);
-       io_flags = pci_resource_flags(pdev, 0);
-       mem_flags = pci_resource_flags(pdev, 1);
-       irq = pdev->irq;
-
-       if (pdev->vendor != PCI_VENDOR_ID_QLOGIC) {
-               printk("qlogicisp : 0x%04x is not QLogic vendor ID\n",
-                      pdev->vendor);
-               return 1;
-       }
-
-       if (pdev->device != PCI_DEVICE_ID_QLOGIC_ISP1020) {
-               printk("qlogicisp : 0x%04x does not match ISP1020 device id\n",
-                      pdev->device);
-               return 1;
-       }
-
-#ifdef __alpha__
-       /* Force ALPHA to use bus I/O and not bus MEM.
-          This is to avoid having to use HAE_MEM registers,
-          which is broken on some platforms and with SMP.  */
-       command &= ~PCI_COMMAND_MEMORY; 
-#endif
-
-       sh->io_port = io_base;
-
-       if (!request_region(sh->io_port, 0xff, "qlogicisp")) {
-               printk("qlogicisp : i/o region 0x%lx-0x%lx already "
-                      "in use\n",
-                      sh->io_port, sh->io_port + 0xff);
-               return 1;
-       }
-
-       if ((command & PCI_COMMAND_MEMORY) &&
-           ((mem_flags & 1) == 0)) {
-               hostdata->memaddr = ioremap(mem_base, PAGE_SIZE);
-               if (!hostdata->memaddr) {
-                       printk("qlogicisp : i/o remapping failed.\n");
-                       goto out_release;
-               }
-       } else {
-               if (command & PCI_COMMAND_IO && (io_flags & 3) != 1) {
-                       printk("qlogicisp : i/o mapping is disabled\n");
-                       goto out_release;
-               }
-               hostdata->memaddr = NULL; /* zero to signify no i/o mapping */
-               mem_base = 0;
-       }
-
-       if (revision != ISP1020_REV_ID)
-               printk("qlogicisp : new isp1020 revision ID (%d)\n", revision);
-
-       if (isp_inw(sh,  PCI_ID_LOW) != PCI_VENDOR_ID_QLOGIC
-           || isp_inw(sh, PCI_ID_HIGH) != PCI_DEVICE_ID_QLOGIC_ISP1020)
-       {
-               printk("qlogicisp : can't decode %s address space 0x%lx\n",
-                      (io_base ? "I/O" : "MEM"),
-                      (io_base ? io_base : mem_base));
-               goto out_unmap;
-       }
-
-       hostdata->revision = revision;
-
-       sh->irq = irq;
-       sh->max_id = MAX_TARGETS;
-       sh->max_lun = MAX_LUNS;
-
-       hostdata->res_cpu = pci_alloc_consistent(hostdata->pci_dev,
-                                                QSIZE(RES_QUEUE_LEN),
-                                                &hostdata->res_dma);
-       if (hostdata->res_cpu == NULL) {
-               printk("qlogicisp : can't allocate response queue\n");
-               goto out_unmap;
-       }
-
-       hostdata->req_cpu = pci_alloc_consistent(hostdata->pci_dev,
-                                                QSIZE(QLOGICISP_REQ_QUEUE_LEN),
-                                                &hostdata->req_dma);
-       if (hostdata->req_cpu == NULL) {
-               pci_free_consistent(hostdata->pci_dev,
-                                   QSIZE(RES_QUEUE_LEN),
-                                   hostdata->res_cpu,
-                                   hostdata->res_dma);
-               printk("qlogicisp : can't allocate request queue\n");
-               goto out_unmap;
-       }
-
-       pci_set_master(pdev);
-
-       LEAVE("isp1020_init");
-
-       return 0;
-
-out_unmap:
-       iounmap(hostdata->memaddr);
-out_release:
-       release_region(sh->io_port, 0xff);
-       return 1;
-}
-
-
-#if USE_NVRAM_DEFAULTS
-
-static int isp1020_get_defaults(struct Scsi_Host *host)
-{
-       int i;
-       u_short value;
-       struct isp1020_hostdata *hostdata =
-               (struct isp1020_hostdata *) host->hostdata;
-
-       ENTER("isp1020_get_defaults");
-
-       if (!isp1020_verify_nvram(host)) {
-               printk("qlogicisp : nvram checksum failure\n");
-               printk("qlogicisp : attempting to use default parameters\n");
-               return isp1020_set_defaults(host);
-       }
-
-       value = isp1020_read_nvram_word(host, 2);
-       hostdata->host_param.fifo_threshold = (value >> 8) & 0x03;
-       hostdata->host_param.host_adapter_enable = (value >> 11) & 0x01;
-       hostdata->host_param.initiator_scsi_id = (value >> 12) & 0x0f;
-
-       value = isp1020_read_nvram_word(host, 3);
-       hostdata->host_param.bus_reset_delay = value & 0xff;
-       hostdata->host_param.retry_count = value >> 8;
-
-       value = isp1020_read_nvram_word(host, 4);
-       hostdata->host_param.retry_delay = value & 0xff;
-       hostdata->host_param.async_data_setup_time = (value >> 8) & 0x0f;
-       hostdata->host_param.req_ack_active_negation = (value >> 12) & 0x01;
-       hostdata->host_param.data_line_active_negation = (value >> 13) & 0x01;
-       hostdata->host_param.data_dma_burst_enable = (value >> 14) & 0x01;
-       hostdata->host_param.command_dma_burst_enable = (value >> 15);
-
-       value = isp1020_read_nvram_word(host, 5);
-       hostdata->host_param.tag_aging = value & 0xff;
-
-       value = isp1020_read_nvram_word(host, 6);
-       hostdata->host_param.selection_timeout = value & 0xffff;
-
-       value = isp1020_read_nvram_word(host, 7);
-       hostdata->host_param.max_queue_depth = value & 0xffff;
-
-#if DEBUG_ISP1020_SETUP
-       printk("qlogicisp : fifo threshold=%d\n",
-              hostdata->host_param.fifo_threshold);
-       printk("qlogicisp : initiator scsi id=%d\n",
-              hostdata->host_param.initiator_scsi_id);
-       printk("qlogicisp : bus reset delay=%d\n",
-              hostdata->host_param.bus_reset_delay);
-       printk("qlogicisp : retry count=%d\n",
-              hostdata->host_param.retry_count);
-       printk("qlogicisp : retry delay=%d\n",
-              hostdata->host_param.retry_delay);
-       printk("qlogicisp : async data setup time=%d\n",
-              hostdata->host_param.async_data_setup_time);
-       printk("qlogicisp : req/ack active negation=%d\n",
-              hostdata->host_param.req_ack_active_negation);
-       printk("qlogicisp : data line active negation=%d\n",
-              hostdata->host_param.data_line_active_negation);
-       printk("qlogicisp : data DMA burst enable=%d\n",
-              hostdata->host_param.data_dma_burst_enable);
-       printk("qlogicisp : command DMA burst enable=%d\n",
-              hostdata->host_param.command_dma_burst_enable);
-       printk("qlogicisp : tag age limit=%d\n",
-              hostdata->host_param.tag_aging);
-       printk("qlogicisp : selection timeout limit=%d\n",
-              hostdata->host_param.selection_timeout);
-       printk("qlogicisp : max queue depth=%d\n",
-              hostdata->host_param.max_queue_depth);
-#endif /* DEBUG_ISP1020_SETUP */
-
-       for (i = 0; i < MAX_TARGETS; i++) {
-
-               value = isp1020_read_nvram_word(host, 14 + i * 3);
-               hostdata->dev_param[i].device_flags = value & 0xff;
-               hostdata->dev_param[i].execution_throttle = value >> 8;
-
-               value = isp1020_read_nvram_word(host, 15 + i * 3);
-               hostdata->dev_param[i].synchronous_period = value & 0xff;
-               hostdata->dev_param[i].synchronous_offset = (value >> 8) & 0x0f;
-               hostdata->dev_param[i].device_enable = (value >> 12) & 0x01;
-
-#if DEBUG_ISP1020_SETUP
-               printk("qlogicisp : target 0x%02x\n", i);
-               printk("qlogicisp :     device flags=0x%02x\n",
-                      hostdata->dev_param[i].device_flags);
-               printk("qlogicisp :     execution throttle=%d\n",
-                      hostdata->dev_param[i].execution_throttle);
-               printk("qlogicisp :     synchronous period=%d\n",
-                      hostdata->dev_param[i].synchronous_period);
-               printk("qlogicisp :     synchronous offset=%d\n",
-                      hostdata->dev_param[i].synchronous_offset);
-               printk("qlogicisp :     device enable=%d\n",
-                      hostdata->dev_param[i].device_enable);
-#endif /* DEBUG_ISP1020_SETUP */
-       }
-
-       LEAVE("isp1020_get_defaults");
-
-       return 0;
-}
-
-
-#define ISP1020_NVRAM_LEN      0x40
-#define ISP1020_NVRAM_SIG1     0x5349
-#define ISP1020_NVRAM_SIG2     0x2050
-
-static int isp1020_verify_nvram(struct Scsi_Host *host)
-{
-       int     i;
-       u_short value;
-       u_char checksum = 0;
-
-       for (i = 0; i < ISP1020_NVRAM_LEN; i++) {
-               value = isp1020_read_nvram_word(host, i);
-
-               switch (i) {
-                     case 0:
-                       if (value != ISP1020_NVRAM_SIG1) return 0;
-                       break;
-                     case 1:
-                       if (value != ISP1020_NVRAM_SIG2) return 0;
-                       break;
-                     case 2:
-                       if ((value & 0xff) != 0x02) return 0;
-                       break;
-               }
-               checksum += value & 0xff;
-               checksum += value >> 8;
-       }
-
-       return (checksum == 0);
-}
-
-#define NVRAM_DELAY() udelay(2) /* 2 microsecond delay */
-
-
-u_short isp1020_read_nvram_word(struct Scsi_Host *host, u_short byte)
-{
-       int i;
-       u_short value, output, input;
-
-       byte &= 0x3f; byte |= 0x0180;
-
-       for (i = 8; i >= 0; i--) {
-               output = ((byte >> i) & 0x1) ? 0x4 : 0x0;
-               isp_outw(output | 0x2, host, PCI_NVRAM); NVRAM_DELAY();
-               isp_outw(output | 0x3, host, PCI_NVRAM); NVRAM_DELAY();
-               isp_outw(output | 0x2, host, PCI_NVRAM); NVRAM_DELAY();
-       }
-
-       for (i = 0xf, value = 0; i >= 0; i--) {
-               value <<= 1;
-               isp_outw(0x3, host, PCI_NVRAM); NVRAM_DELAY();
-               input = isp_inw(host, PCI_NVRAM); NVRAM_DELAY();
-               isp_outw(0x2, host, PCI_NVRAM); NVRAM_DELAY();
-               if (input & 0x8) value |= 1;
-       }
-
-       isp_outw(0x0, host, PCI_NVRAM); NVRAM_DELAY();
-
-       return value;
-}
-
-#endif /* USE_NVRAM_DEFAULTS */
-
-
-static int isp1020_set_defaults(struct Scsi_Host *host)
-{
-       struct isp1020_hostdata *hostdata =
-               (struct isp1020_hostdata *) host->hostdata;
-       int i;
-
-       ENTER("isp1020_set_defaults");
-
-       hostdata->host_param.fifo_threshold = 2;
-       hostdata->host_param.host_adapter_enable = 1;
-       hostdata->host_param.initiator_scsi_id = 7;
-       hostdata->host_param.bus_reset_delay = 3;
-       hostdata->host_param.retry_count = 0;
-       hostdata->host_param.retry_delay = 1;
-       hostdata->host_param.async_data_setup_time = 6;
-       hostdata->host_param.req_ack_active_negation = 1;
-       hostdata->host_param.data_line_active_negation = 1;
-       hostdata->host_param.data_dma_burst_enable = 1;
-       hostdata->host_param.command_dma_burst_enable = 1;
-       hostdata->host_param.tag_aging = 8;
-       hostdata->host_param.selection_timeout = 250;
-       hostdata->host_param.max_queue_depth = 256;
-
-       for (i = 0; i < MAX_TARGETS; i++) {
-               hostdata->dev_param[i].device_flags = 0xfd;
-               hostdata->dev_param[i].execution_throttle = 16;
-               hostdata->dev_param[i].synchronous_period = 25;
-               hostdata->dev_param[i].synchronous_offset = 12;
-               hostdata->dev_param[i].device_enable = 1;
-       }
-
-       LEAVE("isp1020_set_defaults");
-
-       return 0;
-}
-
-
-static int isp1020_load_parameters(struct Scsi_Host *host)
-{
-       int i, k;
-#ifdef CONFIG_QL_ISP_A64
-       u_long queue_addr;
-       u_short param[8];
-#else
-       u_int queue_addr;
-       u_short param[6];
-#endif
-       u_short isp_cfg1, hwrev;
-       struct isp1020_hostdata *hostdata =
-               (struct isp1020_hostdata *) host->hostdata;
-
-       ENTER("isp1020_load_parameters");
-
-       hwrev = isp_inw(host, ISP_CFG0) & ISP_CFG0_HWMSK;
-       isp_cfg1 = ISP_CFG1_F64 | ISP_CFG1_BENAB;
-       if (hwrev == ISP_CFG0_1040A) {
-               /* Busted fifo, says mjacob. */
-               isp_cfg1 &= ISP_CFG1_BENAB;
-       }
-
-       isp_outw(isp_inw(host, ISP_CFG1) | isp_cfg1, host, ISP_CFG1);
-       isp_outw(isp_inw(host, CDMA_CONF) | DMA_CONF_BENAB, host, CDMA_CONF);
-       isp_outw(isp_inw(host, DDMA_CONF) | DMA_CONF_BENAB, host, DDMA_CONF);
-
-       param[0] = MBOX_SET_INIT_SCSI_ID;
-       param[1] = hostdata->host_param.initiator_scsi_id;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set initiator id failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_RETRY_COUNT;
-       param[1] = hostdata->host_param.retry_count;
-       param[2] = hostdata->host_param.retry_delay;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set retry count failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME;
-       param[1] = hostdata->host_param.async_data_setup_time;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : async data setup time failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_ACTIVE_NEG_STATE;
-       param[1] = (hostdata->host_param.req_ack_active_negation << 4)
-               | (hostdata->host_param.data_line_active_negation << 5);
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set active negation state failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_PCI_CONTROL_PARAMS;
-       param[1] = hostdata->host_param.data_dma_burst_enable << 1;
-       param[2] = hostdata->host_param.command_dma_burst_enable << 1;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set pci control parameter failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_TAG_AGE_LIMIT;
-       param[1] = hostdata->host_param.tag_aging;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set tag age limit failure\n");
-               return 1;
-       }
-
-       param[0] = MBOX_SET_SELECT_TIMEOUT;
-       param[1] = hostdata->host_param.selection_timeout;
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set selection timeout failure\n");
-               return 1;
-       }
-
-       for (i = 0; i < MAX_TARGETS; i++) {
-
-               if (!hostdata->dev_param[i].device_enable)
-                       continue;
-
-               param[0] = MBOX_SET_TARGET_PARAMS;
-               param[1] = i << 8;
-               param[2] = hostdata->dev_param[i].device_flags << 8;
-               param[3] = (hostdata->dev_param[i].synchronous_offset << 8)
-                       | hostdata->dev_param[i].synchronous_period;
-
-               isp1020_mbox_command(host, param);
-
-               if (param[0] != MBOX_COMMAND_COMPLETE) {
-                       printk("qlogicisp : set target parameter failure\n");
-                       return 1;
-               }
-
-               for (k = 0; k < MAX_LUNS; k++) {
-
-                       param[0] = MBOX_SET_DEV_QUEUE_PARAMS;
-                       param[1] = (i << 8) | k;
-                       param[2] = hostdata->host_param.max_queue_depth;
-                       param[3] = hostdata->dev_param[i].execution_throttle;
-
-                       isp1020_mbox_command(host, param);
-
-                       if (param[0] != MBOX_COMMAND_COMPLETE) {
-                               printk("qlogicisp : set device queue "
-                                      "parameter failure\n");
-                               return 1;
-                       }
-               }
-       }
-
-       queue_addr = hostdata->res_dma;
-#ifdef CONFIG_QL_ISP_A64
-       param[0] = MBOX_CMD_INIT_RESPONSE_QUEUE_64;
-#else
-       param[0] = MBOX_INIT_RES_QUEUE;
-#endif
-       param[1] = RES_QUEUE_LEN + 1;
-       param[2] = (u_short) (queue_addr >> 16);
-       param[3] = (u_short) (queue_addr & 0xffff);
-       param[4] = 0;
-       param[5] = 0;
-#ifdef CONFIG_QL_ISP_A64
-       param[6] = (u_short) (queue_addr >> 48);
-       param[7] = (u_short) (queue_addr >> 32);
-#endif
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set response queue failure\n");
-               return 1;
-       }
-
-       queue_addr = hostdata->req_dma;
-#ifdef CONFIG_QL_ISP_A64
-       param[0] = MBOX_CMD_INIT_REQUEST_QUEUE_64;
-#else
-       param[0] = MBOX_INIT_REQ_QUEUE;
-#endif
-       param[1] = QLOGICISP_REQ_QUEUE_LEN + 1;
-       param[2] = (u_short) (queue_addr >> 16);
-       param[3] = (u_short) (queue_addr & 0xffff);
-       param[4] = 0;
-
-#ifdef CONFIG_QL_ISP_A64
-       param[5] = 0;
-       param[6] = (u_short) (queue_addr >> 48);
-       param[7] = (u_short) (queue_addr >> 32);
-#endif
-
-       isp1020_mbox_command(host, param);
-
-       if (param[0] != MBOX_COMMAND_COMPLETE) {
-               printk("qlogicisp : set request queue failure\n");
-               return 1;
-       }
-
-       LEAVE("isp1020_load_parameters");
-
-       return 0;
-}
-
-
-/*
- * currently, this is only called during initialization or abort/reset,
- * at which times interrupts are disabled, so polling is OK, I guess...
- */
-static int isp1020_mbox_command(struct Scsi_Host *host, u_short param[])
-{
-       int loop_count;
-
-       if (mbox_param[param[0]] == 0)
-               return 1;
-
-       loop_count = DEFAULT_LOOP_COUNT;
-       while (--loop_count && isp_inw(host, HOST_HCCR) & 0x0080) {
-               barrier();
-               cpu_relax();
-       }
-       if (!loop_count)
-               printk("qlogicisp: mbox_command loop timeout #1\n");
-
-       switch(mbox_param[param[0]] >> 4) {
-             case 8: isp_outw(param[7], host, MBOX7);
-             case 7: isp_outw(param[6], host, MBOX6);
-             case 6: isp_outw(param[5], host, MBOX5);
-             case 5: isp_outw(param[4], host, MBOX4);
-             case 4: isp_outw(param[3], host, MBOX3);
-             case 3: isp_outw(param[2], host, MBOX2);
-             case 2: isp_outw(param[1], host, MBOX1);
-             case 1: isp_outw(param[0], host, MBOX0);
-       }
-
-       isp_outw(0x0, host, PCI_SEMAPHORE);
-       isp_outw(HCCR_CLEAR_RISC_INTR, host, HOST_HCCR);
-       isp_outw(HCCR_SET_HOST_INTR, host, HOST_HCCR);
-
-       loop_count = DEFAULT_LOOP_COUNT;
-       while (--loop_count && !(isp_inw(host, PCI_INTF_STS) & 0x04)) {
-               barrier();
-               cpu_relax();
-       }
-       if (!loop_count)
-               printk("qlogicisp: mbox_command loop timeout #2\n");
-
-       loop_count = DEFAULT_LOOP_COUNT;
-       while (--loop_count && isp_inw(host, MBOX0) == 0x04) {
-               barrier();
-               cpu_relax();
-       }
-       if (!loop_count)
-               printk("qlogicisp: mbox_command loop timeout #3\n");
-
-       switch(mbox_param[param[0]] & 0xf) {
-             case 8: param[7] = isp_inw(host, MBOX7);
-             case 7: param[6] = isp_inw(host, MBOX6);
-             case 6: param[5] = isp_inw(host, MBOX5);
-             case 5: param[4] = isp_inw(host, MBOX4);
-             case 4: param[3] = isp_inw(host, MBOX3);
-             case 3: param[2] = isp_inw(host, MBOX2);
-             case 2: param[1] = isp_inw(host, MBOX1);
-             case 1: param[0] = isp_inw(host, MBOX0);
-       }
-
-       isp_outw(0x0, host, PCI_SEMAPHORE);
-       isp_outw(HCCR_CLEAR_RISC_INTR, host, HOST_HCCR);
-
-       return 0;
-}
-
-
-#if DEBUG_ISP1020_INTR
-
-void isp1020_print_status_entry(struct Status_Entry *status)
-{
-       int i;
-
-       printk("qlogicisp : entry count = 0x%02x, type = 0x%02x, flags = 0x%02x\n",
-              status->hdr.entry_cnt, status->hdr.entry_type, status->hdr.flags);
-       printk("qlogicisp : scsi status = 0x%04x, completion status = 0x%04x\n",
-              le16_to_cpu(status->scsi_status), le16_to_cpu(status->completion_status));
-       printk("qlogicisp : state flags = 0x%04x, status flags = 0x%04x\n",
-              le16_to_cpu(status->state_flags), le16_to_cpu(status->status_flags));
-       printk("qlogicisp : time = 0x%04x, request sense length = 0x%04x\n",
-              le16_to_cpu(status->time), le16_to_cpu(status->req_sense_len));
-       printk("qlogicisp : residual transfer length = 0x%08x\n",
-              le32_to_cpu(status->residual));
-
-       for (i = 0; i < le16_to_cpu(status->req_sense_len); i++)
-               printk("qlogicisp : sense data = 0x%02x\n", status->req_sense_data[i]);
-}
-
-#endif /* DEBUG_ISP1020_INTR */
-
-
-#if DEBUG_ISP1020
-
-void isp1020_print_scsi_cmd(Scsi_Cmnd *cmd)
-{
-       int i;
-
-       printk("qlogicisp : target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n",
-              cmd->target, cmd->lun, cmd->cmd_len);
-       printk("qlogicisp : command = ");
-       for (i = 0; i < cmd->cmd_len; i++)
-               printk("0x%02x ", cmd->cmnd[i]);
-       printk("\n");
-}
-
-#endif /* DEBUG_ISP1020 */
-
-MODULE_LICENSE("GPL");
-
-static Scsi_Host_Template driver_template = {
-       .detect                 = isp1020_detect,
-       .release                = isp1020_release,
-       .info                   = isp1020_info, 
-       .queuecommand           = isp1020_queuecommand,
-       .bios_param             = isp1020_biosparam,
-       .can_queue              = QLOGICISP_REQ_QUEUE_LEN,
-       .this_id                = -1,
-       .sg_tablesize           = QLOGICISP_MAX_SG(QLOGICISP_REQ_QUEUE_LEN),
-       .cmd_per_lun            = 1,
-       .use_clustering         = DISABLE_CLUSTERING,
-};
-#include "scsi_module.c"
diff --git a/drivers/scsi/qlogicisp_asm.c b/drivers/scsi/qlogicisp_asm.c
deleted file mode 100644 (file)
index 9ea4bec..0000000
+++ /dev/null
@@ -1,2034 +0,0 @@
-/*
- *      Firmware Version 7.63.00 (12:07 Jan 27, 1999)
- */
-static const unsigned short risc_code_version = 7*1024+63;
-
-static const unsigned short risc_code_addr01 = 0x1000 ;
-
-#if RELOAD_FIRMWARE
-
-static const unsigned short risc_code01[] = {
-       0x0078, 0x103a, 0x0000, 0x3f14, 0x0000, 0x2043, 0x4f50, 0x5952,
-       0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
-       0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
-       0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
-       0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3633,
-       0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
-       0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
-       0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
-       0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
-       0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
-       0x0010, 0x70c3, 0x0004, 0x20c9, 0x76ff, 0x2089, 0x1186, 0x70c7,
-       0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
-       0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
-       0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
-       0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
-       0x10bf, 0xa386, 0x000f, 0x0040, 0x1085, 0x2c6a, 0x2a5a, 0x20c1,
-       0x0000, 0x2019, 0x000f, 0x0078, 0x1065, 0x2c6a, 0x2a5a, 0x20c1,
-       0x0008, 0x2009, 0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc,
-       0x3fff, 0x2734, 0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040,
-       0x10a9, 0x284a, 0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134,
-       0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x10aa, 0x0078,
-       0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
-       0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
-       0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
-       0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5000, 0x8424,
-       0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7700, 0x2009,
-       0x0000, 0x2001, 0x0031, 0x1078, 0x1c9d, 0x2218, 0x2079, 0x5000,
-       0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
-       0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
-       0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
-       0x0002, 0x784f, 0x0003, 0x2069, 0x5040, 0x2001, 0x04fd, 0x2004,
-       0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
-       0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
-       0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
-       0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
-       0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5280, 0x2011, 0x0020,
-       0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
-       0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
-       0x8109, 0x00c0, 0x1122, 0x2069, 0x5300, 0x2009, 0x0002, 0x20a9,
-       0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
-       0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
-       0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
-       0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x21e9, 0x1078,
-       0x46e9, 0x1078, 0x1946, 0x1078, 0x4bdf, 0x3200, 0xa085, 0x000d,
-       0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
-       0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
-       0x00c0, 0x117a, 0x1078, 0x1cc6, 0x0010, 0x1180, 0x0068, 0x1180,
-       0x1078, 0x20c8, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1a2b,
-       0x00e0, 0x116c, 0x1078, 0x4a66, 0x0078, 0x116c, 0x118e, 0x1190,
-       0x23ea, 0x23ea, 0x476a, 0x476a, 0x23ea, 0x23ea, 0x0078, 0x118e,
-       0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
-       0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
-       0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
-       0x505b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5064, 0x200b,
-       0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
-       0x5062, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
-       0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
-       0x1078, 0x192b, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
-       0x11d3, 0x1078, 0x165a, 0x7817, 0x0000, 0x2009, 0x5062, 0x2104,
-       0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1996,
-       0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c, 0x6007,
-       0x0103, 0x1078, 0x1907, 0x00c0, 0x11fb, 0x1078, 0x192b, 0x2009,
-       0x5062, 0x200b, 0x0000, 0x2009, 0x505c, 0x2104, 0x200b, 0x0000,
-       0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
-       0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
-       0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
-       0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
-       0x12a0, 0x1748, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
-       0x174d, 0x1298, 0x1329, 0x1360, 0x1672, 0x1742, 0x12b5, 0x1591,
-       0x15ad, 0x15c9, 0x15f4, 0x154a, 0x1558, 0x156c, 0x1580, 0x13df,
-       0x1298, 0x138d, 0x1393, 0x1398, 0x139d, 0x13a3, 0x13a8, 0x13ad,
-       0x13b2, 0x13b7, 0x13bb, 0x13d0, 0x13dc, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x13eb, 0x13f4, 0x1403, 0x1429, 0x1433, 0x143a, 0x1480,
-       0x148f, 0x149e, 0x14b0, 0x152a, 0x153a, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x153f, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
-       0x001f, 0x0079, 0x125b, 0x1786, 0x1789, 0x1799, 0x1298, 0x1298,
-       0x18d8, 0x18f5, 0x1298, 0x1298, 0x1298, 0x18f9, 0x1901, 0x1298,
-       0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x1356, 0x1668,
-       0x1764, 0x1778, 0x1298, 0x1829, 0x1298, 0x18b4, 0x18be, 0x18c2,
-       0x18d0, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
-       0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
-       0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
-       0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
-       0x70c3, 0x4001, 0x0078, 0x1287, 0x70c3, 0x4006, 0x0078, 0x1287,
-       0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
-       0x1284, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x1284, 0x0078,
-       0x1284, 0x0078, 0x1284, 0x0078, 0x1284, 0x2091, 0x8000, 0x70c3,
-       0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
-       0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
-       0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
-       0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
-       0x4080, 0x0078, 0x0455, 0x1078, 0x1b36, 0x00c0, 0x129c, 0x75d8,
-       0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
-       0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1a70, 0x0040, 0x1284,
-       0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1b36, 0x00c0, 0x129c,
-       0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
-       0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1ad0, 0x0040,
-       0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
-       0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
-       0x0007, 0x70cb, 0x003f, 0x70cf, 0x0000, 0x0078, 0x1284, 0x1078,
-       0x1b36, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
-       0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
-       0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1350, 0x8001,
-       0x7892, 0xa084, 0xfc00, 0x0040, 0x1345, 0x78cc, 0xa085, 0x0001,
-       0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2,
-       0x7ea6, 0x7c96, 0x78cc, 0xa084, 0xfffc, 0x78ce, 0x0078, 0x1354,
-       0x78cc, 0xa085, 0x0001, 0x78ce, 0x0078, 0x1284, 0x1078, 0x1b36,
-       0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1363,
-       0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
-       0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1387, 0x8001, 0x78ae,
-       0xa084, 0xfc00, 0x0040, 0x137c, 0x78cc, 0xa085, 0x0100, 0x78ce,
-       0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba, 0x7dbe, 0x7ec2,
-       0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078, 0x138b, 0x78cc,
-       0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009, 0x5061, 0x210c,
-       0x7aec, 0x0078, 0x1282, 0x2009, 0x5041, 0x210c, 0x0078, 0x1283,
-       0x2009, 0x5042, 0x210c, 0x0078, 0x1283, 0x2061, 0x5040, 0x610c,
-       0x6210, 0x0078, 0x1282, 0x2009, 0x5045, 0x210c, 0x0078, 0x1283,
-       0x2009, 0x5046, 0x210c, 0x0078, 0x1283, 0x2009, 0x5048, 0x210c,
-       0x0078, 0x1283, 0x2009, 0x5049, 0x210c, 0x0078, 0x1283, 0x7908,
-       0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa0e8, 0x5280, 0x6a00, 0x6804, 0xa084, 0x0008,
-       0x0040, 0x13cd, 0x6b08, 0x0078, 0x13ce, 0x6b0c, 0x0078, 0x1281,
-       0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091,
-       0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078, 0x1283, 0x77c4,
-       0x1078, 0x1956, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
-       0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x127c,
-       0x1078, 0x22c1, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8,
-       0x127c, 0x2011, 0x5041, 0x2204, 0x007e, 0x2112, 0x1078, 0x227a,
-       0x017f, 0x0078, 0x1283, 0x71c4, 0x2011, 0x1421, 0x20a9, 0x0008,
-       0x2204, 0xa106, 0x0040, 0x1413, 0x8210, 0x0070, 0x1411, 0x0078,
-       0x1408, 0x0078, 0x127c, 0xa292, 0x1421, 0x027e, 0x2011, 0x5042,
-       0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x2286, 0x017f, 0x0078,
-       0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
-       0x004b, 0x2061, 0x5040, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
-       0x6012, 0x0078, 0x1282, 0x2061, 0x5040, 0x6114, 0x70c4, 0x6016,
-       0x0078, 0x1283, 0x2061, 0x5040, 0x71c4, 0x2011, 0x0004, 0x601f,
-       0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x145b, 0x2011,
-       0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
-       0x145b, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
-       0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
-       0x0001, 0x00c0, 0x1476, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x0048, 0x146e, 0x0038, 0x1472, 0x0078, 0x1476, 0x0028, 0x1472,
-       0x0078, 0x1476, 0x2019, 0x2222, 0x0078, 0x1478, 0x2019, 0x1212,
-       0x23b8, 0x1078, 0x2297, 0x1078, 0x4bdf, 0x017f, 0x0078, 0x1283,
-       0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5048, 0x2204,
-       0x2112, 0x007e, 0x1078, 0x22b9, 0x017f, 0x0078, 0x1283, 0x71c4,
-       0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5049, 0x2204, 0x007e,
-       0x2112, 0x1078, 0x22a8, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
-       0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
-       0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
-       0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
-       0x5280, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x14c6,
-       0x6c14, 0x84ff, 0x00c0, 0x14c6, 0x6817, 0x0040, 0xa284, 0x0040,
-       0x0040, 0x14d0, 0x6c10, 0x84ff, 0x00c0, 0x14d0, 0x6813, 0x0001,
-       0x6800, 0x007e, 0xa226, 0x0040, 0x14f3, 0x6a02, 0xa484, 0x2000,
-       0x0040, 0x14dc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14e2,
-       0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14f3, 0x810f, 0xa284,
-       0x4000, 0x0040, 0x14ef, 0x1078, 0x22db, 0x0078, 0x14f3, 0x1078,
-       0x22cd, 0x0078, 0x14f3, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1522,
-       0xa2a4, 0x00ff, 0x2061, 0x5040, 0x6118, 0xa186, 0x0028, 0x0040,
-       0x1509, 0xa186, 0x0032, 0x0040, 0x150f, 0xa186, 0x003c, 0x0040,
-       0x1515, 0xa482, 0x0064, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482,
-       0x0050, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482, 0x0043, 0x0048,
-       0x151f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a,
-       0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
-       0x0078, 0x1281, 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a14,
-       0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
-       0x0078, 0x1281, 0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4,
-       0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x22e9,
-       0x0078, 0x1281, 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a08,
-       0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
-       0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
-       0x6a0a, 0x6804, 0xa005, 0x0040, 0x1567, 0x1078, 0x21b1, 0x2091,
-       0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078, 0x1956, 0x2091,
-       0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
-       0x157b, 0x1078, 0x21b1, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
-       0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
-       0x8000, 0x1078, 0x1963, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
-       0x1282, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078,
-       0x19c4, 0x00c0, 0x15a9, 0x6818, 0xa005, 0x0040, 0x15a9, 0x2708,
-       0x1078, 0x22f9, 0x00c0, 0x15a9, 0x7817, 0x0015, 0x2091, 0x8001,
-       0x007c, 0x2091, 0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041,
-       0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
-       0x1963, 0x2061, 0x5040, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f,
-       0x6073, 0x0000, 0x7817, 0x0016, 0x1078, 0x21b1, 0x2091, 0x8001,
-       0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091,
-       0x8000, 0x2061, 0x5040, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782,
-       0x6093, 0x000f, 0x7817, 0x0017, 0x1078, 0x21b1, 0x2091, 0x8001,
-       0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000,
-       0x1078, 0x1963, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0,
-       0x15e8, 0x2091, 0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0,
-       0x1618, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
-       0x0008, 0x1078, 0x1956, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a,
-       0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1601, 0xa7bc,
-       0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1601,
-       0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040,
-       0x1641, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004,
-       0x0040, 0x162e, 0x0070, 0x162e, 0x0078, 0x1625, 0x684b, 0x0009,
-       0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x163b, 0x0070,
-       0x163b, 0x0078, 0x1632, 0x20a9, 0x00fa, 0x0070, 0x1641, 0x0078,
-       0x163d, 0x2079, 0x5000, 0x7817, 0x0018, 0x2061, 0x5040, 0x606f,
-       0x0001, 0x6073, 0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002,
-       0x78ce, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091,
-       0x8001, 0x007c, 0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001,
-       0x00c0, 0x1664, 0x1078, 0x1a0e, 0x71c4, 0x71c6, 0x794a, 0x007c,
-       0x1078, 0x1b36, 0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de,
-       0x0078, 0x1675, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
-       0x71c6, 0x73ca, 0x72ce, 0x2079, 0x5000, 0x2091, 0x8000, 0x1078,
-       0x1911, 0x2091, 0x8001, 0x0040, 0x172c, 0x20a9, 0x0005, 0x20a1,
-       0x5018, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
-       0x1078, 0x190c, 0x0040, 0x1698, 0x1078, 0x192b, 0x0078, 0x172c,
-       0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16fb, 0x0c7e,
-       0x2c68, 0x2091, 0x8000, 0x1078, 0x1911, 0x2091, 0x8001, 0x0040,
-       0x16cc, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x16a0, 0x609f, 0x0000,
-       0x0c7f, 0x0c7e, 0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c,
-       0xa065, 0x0040, 0x16fa, 0x2009, 0x0020, 0x1078, 0x190c, 0x00c0,
-       0x16e3, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16cc,
-       0x2d00, 0x6002, 0x0078, 0x16b2, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
-       0x1078, 0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009,
-       0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1907, 0x1078,
-       0x192b, 0x0078, 0x172c, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078,
-       0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c,
-       0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1907, 0x1078, 0x192b,
-       0x0078, 0x172c, 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091,
-       0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x5040, 0x706f, 0x0005,
-       0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000,
-       0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2,
-       0xa184, 0x0060, 0x0040, 0x171e, 0x1078, 0x467f, 0x0e7f, 0x6596,
-       0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078,
-       0x21b1, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287,
-       0x20a9, 0x0005, 0x2099, 0x5018, 0x2091, 0x8000, 0x530a, 0x2091,
-       0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284,
-       0x71c4, 0x71c6, 0x2168, 0x0078, 0x174f, 0x2069, 0x1000, 0x690c,
-       0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1751, 0xa285,
-       0x0000, 0x00c0, 0x175f, 0x70c3, 0x4000, 0x0078, 0x1761, 0x70c3,
-       0x4003, 0x70ca, 0x0078, 0x1287, 0x2011, 0x5067, 0x220c, 0x70c4,
-       0x8003, 0x0048, 0x1771, 0x1078, 0x3b49, 0xa184, 0x7fff, 0x0078,
-       0x1775, 0x1078, 0x3b3c, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283,
-       0x71c4, 0x1078, 0x3b33, 0x6100, 0x2001, 0x5067, 0x2004, 0xa084,
-       0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078,
-       0x1283, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004,
-       0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078,
-       0x1284, 0x70c4, 0x2068, 0x2079, 0x5000, 0x2091, 0x8000, 0x1078,
-       0x1911, 0x2091, 0x8001, 0x0040, 0x1825, 0x6007, 0x0001, 0x600b,
-       0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f,
-       0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016,
-       0xa284, 0x0800, 0x0040, 0x17c0, 0x601b, 0x000a, 0x0078, 0x17c6,
-       0xa284, 0x1000, 0x0040, 0x17c6, 0x601b, 0x000c, 0xa284, 0x0300,
-       0x0040, 0x17cf, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085,
-       0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400,
-       0x0040, 0x17dc, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b,
-       0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0,
-       0x17f1, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078,
-       0x17fb, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c,
-       0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042,
-       0x2c08, 0x2061, 0x5040, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077,
-       0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284,
-       0x0400, 0x608e, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007,
-       0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000,
-       0x1078, 0x21b1, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078,
-       0x1287, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071,
-       0x5040, 0x2079, 0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040,
-       0x18aa, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1844,
-       0xa286, 0x000f, 0x00c0, 0x18aa, 0x691c, 0xa184, 0x0080, 0x00c0,
-       0x18aa, 0x6824, 0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b0,
-       0x81ff, 0x0040, 0x1865, 0x0d7e, 0x2069, 0x0020, 0x6908, 0x6808,
-       0xa106, 0x00c0, 0x1856, 0x690c, 0x680c, 0xa106, 0x00c0, 0x185b,
-       0xa184, 0x00ff, 0x00c0, 0x185b, 0x0d7f, 0x78b8, 0xa084, 0x801f,
-       0x00c0, 0x1865, 0x7848, 0xa085, 0x000c, 0x784a, 0x71b0, 0x81ff,
-       0x0040, 0x1888, 0x70b3, 0x0000, 0x0d7e, 0x2069, 0x0020, 0x6807,
-       0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1879, 0x6807, 0x0008,
-       0x6804, 0xa084, 0x0008, 0x00c0, 0x1880, 0x6807, 0x0002, 0x0d7f,
-       0x61c4, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x0e7e, 0x2071,
-       0x5000, 0x7266, 0x736a, 0xae80, 0x0019, 0x0e7f, 0x1078, 0x4598,
-       0x78a3, 0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4, 0xa080,
-       0x00da, 0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001,
-       0x0078, 0x1284, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001,
-       0x2001, 0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4, 0xa182,
-       0x0003, 0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980, 0x71c6,
-       0x0078, 0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca,
-       0x71c8, 0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x1284,
-       0x7974, 0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x1284,
-       0x7900, 0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0005, 0x0048, 0x18e7, 0x0038, 0x18e9, 0x0078, 0x18f3, 0x00a8,
-       0x18f3, 0xa18c, 0x0001, 0x00c0, 0x18f1, 0x20b9, 0x2222, 0x0078,
-       0x18f3, 0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6, 0x0078,
-       0x1284, 0x2009, 0x5074, 0x2104, 0x70c6, 0x70c4, 0x200a, 0x0078,
-       0x1284, 0x2009, 0x5074, 0x2104, 0x70c6, 0x0078, 0x1284, 0xac80,
-       0x0001, 0x1078, 0x1af2, 0x007c, 0xac80, 0x0001, 0x1078, 0x1a92,
-       0x007c, 0x7850, 0xa065, 0x0040, 0x1919, 0x2c04, 0x7852, 0x2063,
-       0x0000, 0x007c, 0x0f7e, 0x2079, 0x5000, 0x7850, 0xa06d, 0x0040,
-       0x1929, 0x2d04, 0x7852, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b,
-       0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x5000,
-       0x7850, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1938, 0x1078, 0x23ca,
-       0x7852, 0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x5000,
-       0x7850, 0x206a, 0x2d00, 0x7852, 0x0f7f, 0x007c, 0x2011, 0x7700,
-       0x7a52, 0x7bec, 0x8319, 0x0040, 0x1953, 0xa280, 0x0031, 0x2012,
-       0x2010, 0x0078, 0x194a, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00,
-       0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
-       0xa0e8, 0x5300, 0x007c, 0x1078, 0x1956, 0x2900, 0x682a, 0x2a00,
-       0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a, 0x2009, 0x5052,
-       0x210c, 0x6804, 0xa005, 0x0040, 0x1995, 0xa116, 0x00c0, 0x1980,
-       0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1983,
-       0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1992, 0x6000,
-       0x6806, 0x1078, 0x19a3, 0x1078, 0x1c42, 0x6810, 0x8001, 0x6812,
-       0x00c0, 0x1983, 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040,
-       0x19a2, 0x609c, 0x609f, 0x0000, 0x2008, 0x1078, 0x192b, 0x2100,
-       0x0078, 0x1996, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
-       0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
-       0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071, 0x5040, 0x704c,
-       0xa08c, 0x0200, 0x00c0, 0x19c2, 0xa088, 0x5080, 0x2d0a, 0x8000,
-       0x704e, 0xa006, 0x0e7f, 0x007c, 0x1078, 0x1956, 0x2091, 0x8000,
-       0x6804, 0x781e, 0xa065, 0x0040, 0x1a0d, 0x0078, 0x19d5, 0x2c00,
-       0x781e, 0x6000, 0xa065, 0x0040, 0x1a0d, 0x600c, 0xa306, 0x00c0,
-       0x19cf, 0x6010, 0xa206, 0x00c0, 0x19cf, 0x2c28, 0x2001, 0x5052,
-       0x2004, 0xac06, 0x00c0, 0x19e6, 0x0078, 0x1a0b, 0x6804, 0xac06,
-       0x00c0, 0x19f3, 0x6000, 0xa065, 0x6806, 0x00c0, 0x19fd, 0x6803,
-       0x0000, 0x0078, 0x19fd, 0x6400, 0x781c, 0x2060, 0x6402, 0xa486,
-       0x0000, 0x00c0, 0x19fd, 0x2c00, 0x6802, 0x2560, 0x1078, 0x19a3,
-       0x601b, 0x0005, 0x6023, 0x0020, 0x1078, 0x1c42, 0x6810, 0x8001,
-       0x1050, 0x23ca, 0x6812, 0xa085, 0xffff, 0x007c, 0x2039, 0x0000,
-       0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000,
-       0x1078, 0x1963, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a18, 0xa7bc,
-       0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1a18,
-       0x2091, 0x8001, 0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001,
-       0x00c0, 0x1a3c, 0x2091, 0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091,
-       0x8001, 0xa005, 0x00c0, 0x1a3d, 0x007c, 0xa08c, 0xfff0, 0x0040,
-       0x1a43, 0x1078, 0x23ca, 0x0079, 0x1a45, 0x1a55, 0x1a58, 0x1a5e,
-       0x1a62, 0x1a56, 0x1a66, 0x1a6c, 0x1a56, 0x1a56, 0x1c0c, 0x1c30,
-       0x1c34, 0x1a56, 0x1a56, 0x1a56, 0x1a56, 0x007c, 0x1078, 0x23ca,
-       0x1078, 0x1a0e, 0x2001, 0x8001, 0x0078, 0x1c3a, 0x2001, 0x8003,
-       0x0078, 0x1c3a, 0x2001, 0x8004, 0x0078, 0x1c3a, 0x1078, 0x1a0e,
-       0x2001, 0x8006, 0x0078, 0x1c3a, 0x2001, 0x8007, 0x0078, 0x1c3a,
-       0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1a78, 0x2009, 0x0020,
-       0x2600, 0x1078, 0x1a92, 0x00c0, 0x1a91, 0xa7ba, 0x0020, 0x0048,
-       0x1a90, 0x0040, 0x1a90, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040,
-       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1a72,
-       0xa006, 0x007c, 0x81ff, 0x0040, 0x1acd, 0x2099, 0x0030, 0x20a0,
-       0x700c, 0xa084, 0x00ff, 0x0040, 0x1aa4, 0x7007, 0x0004, 0x7004,
-       0xa084, 0x0004, 0x00c0, 0x1a9f, 0x21a8, 0x7017, 0x0000, 0x810b,
-       0x7112, 0x721a, 0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0001,
-       0x7002, 0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x00c8, 0x1ac1, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0,
-       0x1ab3, 0x7008, 0x800b, 0x00c8, 0x1ab3, 0x7007, 0x0002, 0xa08c,
-       0x01e0, 0x00c0, 0x1acd, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c,
-       0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1ad8, 0x2009, 0x0020,
-       0x2600, 0x1078, 0x1af2, 0x00c0, 0x1af1, 0xa7ba, 0x0020, 0x0048,
-       0x1af0, 0x0040, 0x1af0, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040,
-       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1ad2,
-       0xa006, 0x007c, 0x81ff, 0x0040, 0x1b33, 0x2098, 0x20a1, 0x0030,
-       0x700c, 0xa084, 0x00ff, 0x0040, 0x1b04, 0x7007, 0x0004, 0x7004,
-       0xa084, 0x0004, 0x00c0, 0x1aff, 0x21a8, 0x7017, 0x0000, 0x810b,
-       0x7112, 0x721a, 0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0000,
-       0x7002, 0x53a6, 0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0005, 0x00c8, 0x1b22, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000,
-       0x00c0, 0x1b14, 0x7010, 0xa084, 0xf000, 0x0040, 0x1b2b, 0x7007,
-       0x0008, 0x0078, 0x1b2f, 0x7108, 0x8103, 0x00c8, 0x1b14, 0x7007,
-       0x0002, 0xa184, 0x01e0, 0x7003, 0x0000, 0x007c, 0x2001, 0x04fd,
-       0x2004, 0xa082, 0x0004, 0x00c8, 0x1b3f, 0x0078, 0x1b42, 0xa006,
-       0x0078, 0x1b44, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2071, 0x5000,
-       0x2d08, 0x7058, 0x6802, 0xa005, 0x00c0, 0x1b4f, 0x715e, 0x715a,
-       0x0e7f, 0x007c, 0x2c08, 0x7858, 0x6002, 0xa005, 0x00c0, 0x1b59,
-       0x795e, 0x795a, 0x007c, 0x2091, 0x8000, 0x6003, 0x0000, 0x2c08,
-       0x785c, 0xa065, 0x00c0, 0x1b67, 0x795a, 0x0078, 0x1b68, 0x6102,
-       0x795e, 0x2091, 0x8001, 0x1078, 0x21ce, 0x007c, 0x0e7e, 0x2071,
-       0x5000, 0x7058, 0xa06d, 0x0040, 0x1b7c, 0x6800, 0x705a, 0xa005,
-       0x00c0, 0x1b7b, 0x705e, 0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e,
-       0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005,
-       0x0040, 0x1bac, 0x2068, 0x6814, 0xa306, 0x00c0, 0x1b95, 0x6828,
-       0xa084, 0x00ff, 0xa406, 0x0040, 0x1b98, 0x2d60, 0x0078, 0x1b86,
-       0x6800, 0xa005, 0x6002, 0x00c0, 0x1ba4, 0xaf80, 0x0016, 0xac06,
-       0x0040, 0x1ba3, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040,
-       0x1bab, 0x1078, 0x1996, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005,
-       0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016,
-       0x2060, 0x6000, 0xa005, 0x0040, 0x1bdb, 0x2068, 0x6814, 0xa084,
-       0x00ff, 0xa306, 0x0040, 0x1bc7, 0x2d60, 0x0078, 0x1bb9, 0x6800,
-       0xa005, 0x6002, 0x00c0, 0x1bd3, 0xaf80, 0x0016, 0xac06, 0x0040,
-       0x1bd2, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bda,
-       0x1078, 0x1996, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
-       0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016, 0x2060,
-       0x6000, 0xa06d, 0x0040, 0x1c07, 0x6814, 0xa306, 0x0040, 0x1bf3,
-       0x2d60, 0x0078, 0x1be8, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1bff,
-       0xaf80, 0x0016, 0xac06, 0x0040, 0x1bfe, 0x2c00, 0x785e, 0x0d7e,
-       0x689c, 0xa005, 0x0040, 0x1c06, 0x1078, 0x1996, 0x007f, 0x0f7f,
-       0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0x2069, 0x5040,
-       0x6800, 0xa086, 0x0000, 0x0040, 0x1c1a, 0x2091, 0x8001, 0x78e3,
-       0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049,
-       0x0004, 0x2051, 0x0010, 0x1078, 0x1963, 0x8738, 0xa784, 0x001f,
-       0x00c0, 0x1c23, 0x2091, 0x8001, 0x2001, 0x800a, 0x0078, 0x1c3a,
-       0x2001, 0x800c, 0x0078, 0x1c3a, 0x1078, 0x1a0e, 0x2001, 0x800d,
-       0x0078, 0x1c3a, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
-       0x4080, 0x007c, 0x6004, 0x2c08, 0x2063, 0x0000, 0x7884, 0x8000,
-       0x7886, 0x7888, 0xa005, 0x798a, 0x0040, 0x1c51, 0x2c02, 0x0078,
-       0x1c52, 0x798e, 0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061, 0x5000,
-       0x2d08, 0x206b, 0x0000, 0x6084, 0x8000, 0x6086, 0x6088, 0xa005,
-       0x618a, 0x0040, 0x1c66, 0x2d02, 0x0078, 0x1c67, 0x618e, 0x0c7f,
-       0x007c, 0x1078, 0x1c7a, 0x0040, 0x1c79, 0x0c7e, 0x609c, 0xa065,
-       0x0040, 0x1c74, 0x1078, 0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078,
-       0x192b, 0x007c, 0x788c, 0xa065, 0x0040, 0x1c8c, 0x2091, 0x8000,
-       0x7884, 0x8001, 0x7886, 0x2c04, 0x788e, 0xa005, 0x00c0, 0x1c8a,
-       0x788a, 0x8000, 0x2091, 0x8001, 0x007c, 0x20a9, 0x0010, 0xa006,
-       0x8004, 0x8086, 0x818e, 0x00c8, 0x1c96, 0xa200, 0x0070, 0x1c9a,
-       0x0078, 0x1c91, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010,
-       0xa005, 0x0040, 0x1cc0, 0xa11a, 0x00c8, 0x1cc0, 0x8213, 0x818d,
-       0x0048, 0x1cb1, 0xa11a, 0x00c8, 0x1cb2, 0x0070, 0x1cb8, 0x0078,
-       0x1ca6, 0xa11a, 0x2308, 0x8210, 0x0070, 0x1cb8, 0x0078, 0x1ca6,
-       0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c,
-       0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x1cbc, 0x7994, 0x70d0,
-       0xa106, 0x0040, 0x1d34, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004,
-       0xa005, 0x00c0, 0x1d34, 0x7008, 0x7208, 0xa206, 0x00c0, 0x1d34,
-       0xa286, 0x0008, 0x00c0, 0x1d34, 0x2071, 0x0010, 0x1078, 0x1911,
-       0x0040, 0x1d34, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa184, 0xff00,
-       0x0040, 0x1d02, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b, 0x86b5,
-       0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5,
-       0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
-       0x0078, 0x1d0c, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000,
-       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078, 0x190c,
-       0x2091, 0x8001, 0x0040, 0x1d2b, 0x1078, 0x192b, 0x78a8, 0x8000,
-       0x78aa, 0xa086, 0x0002, 0x00c0, 0x1d34, 0x2091, 0x8000, 0x78e3,
-       0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce, 0x2091,
-       0x8001, 0x0078, 0x1d34, 0x78ab, 0x0000, 0x1078, 0x208b, 0x6004,
-       0xa084, 0x000f, 0x0079, 0x1d39, 0x2071, 0x0010, 0x2091, 0x8001,
-       0x007c, 0x1d49, 0x1d6b, 0x1d91, 0x1d49, 0x1dae, 0x1d58, 0x1f0d,
-       0x1f28, 0x1d49, 0x1d65, 0x1d8b, 0x1df6, 0x1e63, 0x1eb3, 0x1ec5,
-       0x1f24, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008, 0xa705,
-       0x600a, 0x1078, 0x1fa6, 0x609c, 0x78da, 0x1078, 0x2073, 0x007c,
-       0x78dc, 0xa084, 0x0100, 0x0040, 0x1d5f, 0x0078, 0x1d49, 0x601c,
-       0xa085, 0x0080, 0x601e, 0x0078, 0x1d72, 0x1078, 0x1b36, 0x00c0,
-       0x1d49, 0x1078, 0x20a5, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1d72,
-       0x0078, 0x1d49, 0x78df, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff,
-       0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x1d88, 0x1078, 0x1fa6,
-       0x0040, 0x1d88, 0x78dc, 0xa085, 0x0100, 0x78de, 0x0078, 0x1d8a,
-       0x1078, 0x1fca, 0x007c, 0x1078, 0x1b36, 0x00c0, 0x1d49, 0x1078,
-       0x20a1, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1d9a, 0xa084, 0x0100,
-       0x00c0, 0x1d9c, 0x0078, 0x1d49, 0x1078, 0x1fa6, 0x00c0, 0x1dad,
-       0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x1f63, 0xa186,
-       0x000f, 0x0040, 0x1f63, 0x1078, 0x1fca, 0x007c, 0x78dc, 0xa084,
-       0x0100, 0x0040, 0x1db5, 0x0078, 0x1d49, 0x78df, 0x0000, 0x6714,
-       0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005,
-       0x0040, 0x1dd8, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020,
-       0xa08e, 0x0001, 0x0040, 0x1dd8, 0x2039, 0x0000, 0x2011, 0x0002,
-       0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1dd8, 0x0078, 0x1df3,
-       0x1078, 0x1956, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
-       0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
-       0x0070, 0x1dec, 0x0078, 0x1dda, 0x8211, 0x0040, 0x1df3, 0x20a9,
-       0x0100, 0x0078, 0x1dda, 0x1078, 0x192b, 0x007c, 0x2001, 0x5067,
-       0x2004, 0xa084, 0x8000, 0x0040, 0x1f8b, 0x6114, 0x1078, 0x20c2,
-       0x6900, 0xa184, 0x0001, 0x0040, 0x1e17, 0x6028, 0xa084, 0x00ff,
-       0x00c0, 0x1f83, 0x6800, 0xa084, 0x0001, 0x0040, 0x1f8b, 0x6803,
-       0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x1f93, 0x2011,
-       0x0001, 0x6020, 0xa084, 0x4000, 0x0040, 0x1e20, 0xa295, 0x0002,
-       0x6020, 0xa084, 0x0100, 0x0040, 0x1e27, 0xa295, 0x0008, 0x601c,
-       0xa084, 0x0002, 0x0040, 0x1e2e, 0xa295, 0x0004, 0x602c, 0xa08c,
-       0x00ff, 0xa182, 0x0002, 0x0048, 0x1f8f, 0xa182, 0x001b, 0x00c8,
-       0x1f8f, 0x0040, 0x1f8f, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff,
-       0xa182, 0x0002, 0x0048, 0x1f8f, 0xa182, 0x001b, 0x00c8, 0x1f8f,
-       0x0040, 0x1f8f, 0x6912, 0x6030, 0xa005, 0x00c0, 0x1e51, 0x2001,
-       0x001e, 0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x1f8b,
-       0x6806, 0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1f8b, 0x680a,
-       0x6a02, 0x0078, 0x1f93, 0x2001, 0x5067, 0x2004, 0xa084, 0x8000,
-       0x0040, 0x1f8b, 0x6114, 0x1078, 0x20c2, 0x2091, 0x8000, 0x6a04,
-       0x6b08, 0x6418, 0xa484, 0x0003, 0x0040, 0x1e89, 0x6128, 0xa18c,
-       0x00ff, 0x8001, 0x00c0, 0x1e82, 0x2100, 0xa210, 0x0048, 0x1eaf,
-       0x0078, 0x1e89, 0x8001, 0x00c0, 0x1eaf, 0x2100, 0xa212, 0x0048,
-       0x1eaf, 0xa484, 0x000c, 0x0040, 0x1ea3, 0x6128, 0x810f, 0xa18c,
-       0x00ff, 0xa082, 0x0004, 0x00c0, 0x1e9b, 0x2100, 0xa318, 0x0048,
-       0x1eaf, 0x0078, 0x1ea3, 0xa082, 0x0004, 0x00c0, 0x1eaf, 0x2100,
-       0xa31a, 0x0048, 0x1eaf, 0x6030, 0xa005, 0x0040, 0x1ea9, 0x8000,
-       0x6816, 0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1f93, 0x2091,
-       0x8001, 0x0078, 0x1f8f, 0x6114, 0x1078, 0x20c2, 0x2091, 0x8000,
-       0x6b08, 0x8318, 0x0048, 0x1ec1, 0x6b0a, 0x2091, 0x8001, 0x0078,
-       0x1fa2, 0x2091, 0x8001, 0x0078, 0x1f8f, 0x6024, 0x8007, 0xa084,
-       0x00ff, 0x0040, 0x1ee3, 0xa086, 0x0080, 0x00c0, 0x1f0b, 0x20a9,
-       0x0008, 0x2069, 0x7410, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff,
-       0x6802, 0xade8, 0x0008, 0x0070, 0x1edf, 0x0078, 0x1ed5, 0x2091,
-       0x8001, 0x0078, 0x1f93, 0x6028, 0xa015, 0x0040, 0x1f0b, 0x6114,
-       0x1078, 0x20c2, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800,
-       0xa00d, 0x0040, 0x1f08, 0xa206, 0x0040, 0x1ef9, 0x2168, 0x0078,
-       0x1eef, 0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x192b, 0x0c7f,
-       0x0d7f, 0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x1fa2,
-       0x2091, 0x8001, 0x0d7f, 0x0078, 0x1f8b, 0x6114, 0x1078, 0x20c2,
-       0x6800, 0xa084, 0x0001, 0x0040, 0x1f7b, 0x2091, 0x8000, 0x6a04,
-       0x8210, 0x0048, 0x1f20, 0x6a06, 0x2091, 0x8001, 0x0078, 0x1fa2,
-       0x2091, 0x8001, 0x0078, 0x1f8f, 0x1078, 0x1b36, 0x00c0, 0x1d49,
-       0x6114, 0x1078, 0x20c2, 0x60be, 0x6900, 0xa184, 0x0008, 0x0040,
-       0x1f35, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0040,
-       0x1f8b, 0xa184, 0x0100, 0x00c0, 0x1f77, 0xa184, 0x0200, 0x00c0,
-       0x1f73, 0x681c, 0xa005, 0x00c0, 0x1f7f, 0x6004, 0xa084, 0x00ff,
-       0xa086, 0x000f, 0x00c0, 0x1f4e, 0x1078, 0x20a5, 0x78df, 0x0000,
-       0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000,
-       0x0040, 0x1f63, 0x1078, 0x1fa6, 0x0040, 0x1f63, 0x78dc, 0xa085,
-       0x0100, 0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024,
-       0xa084, 0xff00, 0x6026, 0x1078, 0x39aa, 0x0040, 0x1cc6, 0x1078,
-       0x1b5b, 0x0078, 0x1cc6, 0x2009, 0x0017, 0x0078, 0x1f95, 0x2009,
-       0x000e, 0x0078, 0x1f95, 0x2009, 0x0007, 0x0078, 0x1f95, 0x2009,
-       0x0035, 0x0078, 0x1f95, 0x2009, 0x003e, 0x0078, 0x1f95, 0x2009,
-       0x0004, 0x0078, 0x1f95, 0x2009, 0x0006, 0x0078, 0x1f95, 0x2009,
-       0x0016, 0x0078, 0x1f95, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00,
-       0xa105, 0x6026, 0x2091, 0x8000, 0x1078, 0x1c42, 0x2091, 0x8001,
-       0x0078, 0x1cc6, 0x1078, 0x192b, 0x0078, 0x1cc6, 0x78d4, 0xa06d,
-       0x00c0, 0x1fb1, 0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078,
-       0x1fbd, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002,
-       0x78d8, 0xad06, 0x00c0, 0x1fbd, 0x6002, 0x78d0, 0x8001, 0x78d2,
-       0x00c0, 0x1fc9, 0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060,
-       0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff,
-       0x601e, 0xa184, 0x0060, 0x0040, 0x1fd9, 0x0e7e, 0x1078, 0x467f,
-       0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3,
-       0x0000, 0x6714, 0x1078, 0x1956, 0x2091, 0x8000, 0x60a0, 0xa084,
-       0x8000, 0x00c0, 0x2000, 0x6808, 0xa084, 0x0001, 0x0040, 0x2000,
-       0x2091, 0x8001, 0x1078, 0x19a3, 0x2091, 0x8000, 0x1078, 0x1c42,
-       0x2091, 0x8001, 0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x2072,
-       0x6024, 0xa096, 0x0001, 0x00c0, 0x2007, 0x8000, 0x6026, 0x6a10,
-       0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x2016, 0x0040, 0x2016,
-       0x2039, 0x0200, 0x1078, 0x2073, 0x0078, 0x2072, 0x2c08, 0x2091,
-       0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x2043, 0x6800, 0xa065,
-       0x0040, 0x2048, 0x6a04, 0x0e7e, 0x2071, 0x5040, 0x7000, 0xa084,
-       0x0001, 0x0040, 0x203d, 0x7048, 0xa206, 0x00c0, 0x203d, 0x6b04,
-       0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0, 0x2038, 0x6902,
-       0x2260, 0x6102, 0x0e7f, 0x0078, 0x204f, 0x2160, 0x6202, 0x6906,
-       0x0e7f, 0x0078, 0x204f, 0x6800, 0xa065, 0x0040, 0x2048, 0x6102,
-       0x6902, 0x00c0, 0x204c, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
-       0x60a0, 0xa084, 0x8000, 0x0040, 0x2059, 0x6808, 0xa084, 0xfffc,
-       0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c,
-       0x0040, 0x0040, 0x2068, 0xa086, 0x0040, 0x680a, 0x1078, 0x19b4,
-       0x2091, 0x8000, 0x1078, 0x21b1, 0x2091, 0x8001, 0x78db, 0x0000,
-       0x78d7, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000,
-       0x1078, 0x1c42, 0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x2086,
-       0x609c, 0x78da, 0x609f, 0x0000, 0x0078, 0x2076, 0x78d7, 0x0000,
-       0x78db, 0x0000, 0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8,
-       0x2092, 0xa006, 0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x20a0,
-       0x8001, 0x7806, 0x00c0, 0x20a0, 0x0068, 0x20a0, 0x2091, 0x4080,
-       0x007c, 0x2039, 0x20b9, 0x0078, 0x20a7, 0x2039, 0x20bf, 0x2704,
-       0xa005, 0x0040, 0x20b8, 0xac00, 0x2068, 0x6b08, 0x6c0c, 0x6910,
-       0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078, 0x20a7,
-       0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015,
-       0x001b, 0x0000, 0x0c7e, 0x1078, 0x3b33, 0x2c68, 0x0c7f, 0x007c,
-       0x0010, 0x2139, 0x0068, 0x2139, 0x2029, 0x0000, 0x78cb, 0x0000,
-       0x788c, 0xa065, 0x0040, 0x2132, 0x2009, 0x5074, 0x2104, 0xa084,
-       0x0001, 0x0040, 0x2100, 0x6004, 0xa086, 0x0103, 0x00c0, 0x2100,
-       0x6018, 0xa005, 0x00c0, 0x2100, 0x6014, 0xa005, 0x00c0, 0x2100,
-       0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x20ff,
-       0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001,
-       0x2091, 0x4080, 0x0d7f, 0x1078, 0x1c69, 0x0078, 0x2137, 0x0d7f,
-       0x1078, 0x213a, 0x0040, 0x2132, 0x6204, 0xa294, 0x00ff, 0xa296,
-       0x0003, 0x0040, 0x2112, 0x6204, 0xa296, 0x0110, 0x00c0, 0x2120,
-       0x78cb, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211, 0x0040,
-       0x2120, 0x85ff, 0x00c0, 0x2132, 0x8210, 0xa202, 0x00c8, 0x2132,
-       0x057e, 0x1078, 0x2149, 0x057f, 0x0040, 0x212d, 0x78e0, 0xa086,
-       0x0003, 0x0040, 0x2132, 0x0078, 0x2120, 0x8528, 0x78c8, 0xa005,
-       0x0040, 0x20d0, 0x85ff, 0x0040, 0x2139, 0x2091, 0x4080, 0x78b0,
-       0x70d6, 0x007c, 0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2143,
-       0x2300, 0xa005, 0x007c, 0x0048, 0x2147, 0xa302, 0x007c, 0x8002,
-       0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x2163,
-       0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2198,
-       0x7008, 0x7208, 0xa206, 0x00c0, 0x2198, 0xa286, 0x0008, 0x00c0,
-       0x2198, 0x2071, 0x0010, 0x1078, 0x219d, 0x2009, 0x0020, 0x6004,
-       0xa086, 0x0103, 0x00c0, 0x2172, 0x6028, 0xa005, 0x00c0, 0x2172,
-       0x2009, 0x000c, 0x1078, 0x1907, 0x0040, 0x218b, 0x78c4, 0x8000,
-       0x78c6, 0xa086, 0x0002, 0x00c0, 0x2198, 0x2091, 0x8000, 0x78e3,
-       0x0003, 0x78c7, 0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091,
-       0x8001, 0x0078, 0x2198, 0x78c7, 0x0000, 0x1078, 0x1c69, 0x79ac,
-       0x78b0, 0x8000, 0xa10a, 0x00c8, 0x2196, 0xa006, 0x78b2, 0xa006,
-       0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, 0x8004, 0x8004,
-       0x7ab8, 0x7bb4, 0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000, 0xa4a1,
-       0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x505b, 0x2091, 0x8000,
-       0x200a, 0x0f7e, 0x0e7e, 0x2071, 0x5040, 0x7000, 0xa086, 0x0000,
-       0x00c0, 0x21cb, 0x2009, 0x5012, 0x2104, 0xa005, 0x00c0, 0x21cb,
-       0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21cb, 0x0018,
-       0x21cb, 0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e,
-       0x2071, 0x5040, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0,
-       0x21e4, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21e4,
-       0x0018, 0x21e4, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f,
-       0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x5040, 0x2079, 0x0100,
-       0x784b, 0x000f, 0x0098, 0x21f7, 0x7838, 0x0078, 0x21f0, 0x20a9,
-       0x0040, 0x7800, 0xa082, 0x0004, 0x0048, 0x2200, 0x20a9, 0x0060,
-       0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x220a,
-       0x0078, 0x2202, 0x7800, 0xa082, 0x0004, 0x0048, 0x2219, 0x70b7,
-       0x009b, 0x2019, 0x4da4, 0x1078, 0x2255, 0x702f, 0x8001, 0x0078,
-       0x2225, 0x70b7, 0x0000, 0x2019, 0x4c1c, 0x1078, 0x2255, 0x2019,
-       0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078,
-       0x235e, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd, 0x210c,
-       0xa18a, 0x0005, 0x0048, 0x223a, 0x0038, 0x2240, 0xa085, 0x6280,
-       0x0078, 0x2242, 0x0028, 0x2240, 0xa085, 0x6280, 0x0078, 0x2242,
-       0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204, 0x7843, 0x00d8,
-       0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008, 0x7053, 0x507f,
-       0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e, 0x147e, 0x157e,
-       0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a, 0x0040, 0x2275,
-       0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484, 0xff00, 0x0040,
-       0x226d, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6, 0xa005,
-       0x00c0, 0x2264, 0x3318, 0x0078, 0x225b, 0x047f, 0x157f, 0x147f,
-       0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084,
-       0xfff0, 0xa105, 0x2012, 0x1078, 0x235e, 0x007c, 0x2011, 0x0101,
-       0x20a9, 0x0009, 0x810b, 0x0070, 0x228f, 0x0078, 0x228a, 0xa18c,
-       0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009,
-       0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x22a0, 0x0078, 0x229b,
-       0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c,
-       0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x22b1, 0x0078,
-       0x22ac, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012,
-       0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012,
-       0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100,
-       0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080,
-       0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf,
-       0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
-       0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f,
-       0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100,
-       0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f,
-       0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040,
-       0x233c, 0x2061, 0x7400, 0x1078, 0x2344, 0x0040, 0x2328, 0x20a9,
-       0x0000, 0x2061, 0x7300, 0x0c7e, 0x1078, 0x2344, 0x0040, 0x2318,
-       0x0c7f, 0x8c60, 0x0070, 0x2316, 0x0078, 0x230b, 0x0078, 0x233c,
-       0x007f, 0xa082, 0x7300, 0x2071, 0x5040, 0x7086, 0x7182, 0x2001,
-       0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x21ac, 0x0078, 0x2338,
-       0x60c0, 0xa005, 0x00c0, 0x233c, 0x2071, 0x5040, 0x7182, 0x2c00,
-       0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x1078, 0x21ac,
-       0x2001, 0x0000, 0x0078, 0x233e, 0x2001, 0x0001, 0x2091, 0x8001,
-       0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x235b,
-       0x2060, 0x600c, 0xa306, 0x00c0, 0x2358, 0x6010, 0xa206, 0x00c0,
-       0x2358, 0x6014, 0xa106, 0x00c0, 0x2358, 0xa006, 0x0078, 0x235d,
-       0x6000, 0x0078, 0x2345, 0xa085, 0x0001, 0x007c, 0x2011, 0x5041,
-       0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100,
-       0x0040, 0x2374, 0x2021, 0xff04, 0x2122, 0x810b, 0x810b, 0x810b,
-       0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c,
-       0x0020, 0x0040, 0x23c8, 0xa084, 0x0006, 0x00c0, 0x23c8, 0x6014,
-       0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x5280,
-       0x7004, 0xa084, 0x000a, 0x00c0, 0x23c8, 0x7108, 0xa194, 0xff00,
-       0x0040, 0x23c8, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040,
-       0x23af, 0x2001, 0x0012, 0xa106, 0x0040, 0x23b3, 0x2001, 0x0014,
-       0xa106, 0x0040, 0x23b7, 0x2001, 0x0019, 0xa106, 0x0040, 0x23bb,
-       0x2001, 0x0032, 0xa106, 0x0040, 0x23bf, 0x0078, 0x23c3, 0x2009,
-       0x0012, 0x0078, 0x23c5, 0x2009, 0x0014, 0x0078, 0x23c5, 0x2009,
-       0x0019, 0x0078, 0x23c5, 0x2009, 0x0020, 0x0078, 0x23c5, 0x2009,
-       0x003f, 0x0078, 0x23c5, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a,
-       0x0e7f, 0x007c, 0x0068, 0x23ca, 0x2091, 0x8000, 0x2071, 0x0000,
-       0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x23d1, 0x007f, 0x2071,
-       0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x073f,
-       0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
-       0x0078, 0x23e8, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c,
-       0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca, 0x75ce, 0xa594,
-       0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079, 0x23ff, 0x2411,
-       0x2411, 0x2411, 0x274b, 0x3907, 0x240f, 0x2440, 0x244a, 0x240f,
-       0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x1078,
-       0x23ca, 0x8507, 0xa084, 0x001f, 0x0079, 0x2416, 0x2454, 0x274b,
-       0x2905, 0x2a02, 0x2a2a, 0x2cc3, 0x2f6e, 0x2fb1, 0x2ffc, 0x3081,
-       0x3139, 0x31e2, 0x2440, 0x2827, 0x2f43, 0x2436, 0x3c78, 0x3c98,
-       0x3e5e, 0x3e6a, 0x3f3f, 0x2436, 0x2436, 0x4012, 0x4016, 0x3c76,
-       0x2436, 0x3dc9, 0x2436, 0x3b56, 0x244a, 0x2436, 0x1078, 0x23ca,
-       0x0018, 0x23ef, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c,
-       0x2019, 0x4cfd, 0x1078, 0x2255, 0x702f, 0x0001, 0x781b, 0x004f,
-       0x0078, 0x2438, 0x2019, 0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000,
-       0x781b, 0x00d5, 0x0078, 0x2438, 0x7242, 0x2009, 0x500f, 0x200b,
-       0x0000, 0xa584, 0x0001, 0x00c0, 0x3b6a, 0x0040, 0x2471, 0x1078,
-       0x23ca, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x7037,
-       0x0000, 0x1078, 0x38de, 0x0018, 0x23ef, 0x2009, 0x500f, 0x200b,
-       0x0000, 0x7068, 0xa005, 0x00c0, 0x253c, 0x706c, 0xa084, 0x0007,
-       0x0079, 0x247a, 0x2573, 0x2482, 0x248e, 0x24ab, 0x24cd, 0x251a,
-       0x24f3, 0x2482, 0x1078, 0x38c6, 0x2009, 0x0048, 0x1078, 0x2e0f,
-       0x00c0, 0x248c, 0x7003, 0x0004, 0x0078, 0x2438, 0x1078, 0x38c6,
-       0x00c0, 0x24a9, 0x7080, 0x8007, 0x7882, 0x789b, 0x0010, 0x78ab,
-       0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009,
-       0x00e5, 0x1078, 0x2e03, 0x00c0, 0x24a9, 0x7003, 0x0004, 0x7093,
-       0x000f, 0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0, 0x24cb, 0x7180,
-       0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0,
-       0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b,
-       0x0004, 0x2009, 0x00e5, 0x1078, 0x2e03, 0x00c0, 0x24cb, 0x7003,
-       0x0004, 0x7093, 0x000f, 0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0,
-       0x24f1, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
-       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa, 0x78ab,
-       0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009,
-       0x00e5, 0x1078, 0x2e03, 0x00c0, 0x24f1, 0x7003, 0x0004, 0x7093,
-       0x000f, 0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0, 0x2518, 0x7180,
-       0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0,
-       0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b,
-       0x0004, 0x2009, 0x00e5, 0x1078, 0x2e03, 0x00c0, 0x2518, 0x7088,
-       0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002, 0x7093, 0x000f,
-       0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0, 0x2438, 0x7088, 0x2068,
-       0x6f14, 0x1078, 0x37bd, 0x2c50, 0x1078, 0x3978, 0x789b, 0x0010,
-       0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x6e1c, 0x2041,
-       0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004, 0x0040, 0x253a,
-       0x2001, 0x0006, 0x0078, 0x265b, 0x1078, 0x38c6, 0x00c0, 0x2438,
-       0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078, 0x37bd, 0x2c50,
-       0x1078, 0x3978, 0x6008, 0xa085, 0x0010, 0x600a, 0x6824, 0xa005,
-       0x0040, 0x255a, 0xa082, 0x0006, 0x0048, 0x2558, 0x0078, 0x255a,
-       0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0x7058,
-       0xa084, 0x8000, 0x0040, 0x2568, 0xa684, 0x0001, 0x0040, 0x256a,
-       0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001,
-       0x0003, 0x0078, 0x265b, 0x0018, 0x23ef, 0x744c, 0xa485, 0x0000,
-       0x0040, 0x258d, 0xa080, 0x5080, 0x2030, 0x7150, 0x8108, 0xa12a,
-       0x0048, 0x2584, 0x2009, 0x5080, 0x2164, 0x6504, 0x85ff, 0x00c0,
-       0x259e, 0x8421, 0x00c0, 0x257e, 0x7152, 0x7003, 0x0000, 0x704b,
-       0x0000, 0x7040, 0xa005, 0x0040, 0x3b6a, 0x0078, 0x2438, 0x764c,
-       0xa6b0, 0x5080, 0x7150, 0x2600, 0x0078, 0x2589, 0x7152, 0x2568,
-       0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0, 0x259b,
-       0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x25d4, 0xa784, 0x0021,
-       0x00c0, 0x259b, 0xa784, 0x0002, 0x0040, 0x25bd, 0xa784, 0x0004,
-       0x0040, 0x259b, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008, 0x00c0,
-       0x259b, 0xa784, 0x0010, 0x00c0, 0x259b, 0xa784, 0x0200, 0x00c0,
-       0x259b, 0xa784, 0x0100, 0x0040, 0x25d4, 0x6018, 0xa005, 0x00c0,
-       0x259b, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c, 0xa684,
-       0x000e, 0x6118, 0x0040, 0x25e4, 0x601c, 0xa102, 0x0048, 0x25e7,
-       0x0040, 0x25e7, 0x0078, 0x2597, 0x81ff, 0x00c0, 0x2597, 0x68c3,
-       0x0000, 0xa784, 0x0080, 0x00c0, 0x25ef, 0x700c, 0x6022, 0xa7bc,
-       0xff7f, 0x670a, 0x1078, 0x3978, 0x0018, 0x23ef, 0x789b, 0x0010,
-       0xa046, 0x1078, 0x38c6, 0x00c0, 0x2438, 0x6b14, 0xa39c, 0x001f,
-       0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x260b, 0xa684,
-       0x0001, 0x0040, 0x260d, 0xa39c, 0xffbf, 0xa684, 0x0010, 0x0040,
-       0x2613, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e, 0x00c0,
-       0x261e, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x2659, 0x7158, 0xa18c,
-       0x0800, 0x0040, 0x33d7, 0x2011, 0x0020, 0xa684, 0x0008, 0x00c0,
-       0x262f, 0x8210, 0xa684, 0x0002, 0x00c0, 0x262f, 0x8210, 0x7aaa,
-       0x8840, 0x1078, 0x38de, 0x6a14, 0x610c, 0x8108, 0xa18c, 0x00ff,
-       0xa1e0, 0x7300, 0x2c64, 0x8cff, 0x0040, 0x2650, 0x6014, 0xa206,
-       0x00c0, 0x263a, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2635, 0x0c7e,
-       0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x2573,
-       0x1078, 0x38c6, 0x00c0, 0x2438, 0x2a60, 0x610e, 0x79aa, 0x8840,
-       0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184, 0x0018, 0x0040,
-       0x2676, 0xa184, 0x0010, 0x0040, 0x2669, 0x1078, 0x35d6, 0x00c0,
-       0x2699, 0xa184, 0x0008, 0x0040, 0x2676, 0x69a0, 0xa184, 0x0600,
-       0x00c0, 0x2676, 0x1078, 0x34c7, 0x0078, 0x2699, 0x69a0, 0xa184,
-       0x0800, 0x0040, 0x268d, 0x0c7e, 0x027e, 0x2960, 0x6000, 0xa085,
-       0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f, 0x0c7f,
-       0x1078, 0x35d6, 0x00c0, 0x2699, 0x69a0, 0xa184, 0x0200, 0x0040,
-       0x2695, 0x1078, 0x3516, 0x0078, 0x2699, 0xa184, 0x0400, 0x00c0,
-       0x2672, 0x69a0, 0xa184, 0x1000, 0x0040, 0x26a4, 0x6914, 0xa18c,
-       0xff00, 0x810f, 0x1078, 0x22cd, 0x007f, 0x7002, 0xa68c, 0x00e0,
-       0xa684, 0x0060, 0x0040, 0x26b2, 0xa086, 0x0060, 0x00c0, 0x26b2,
-       0xa18d, 0x4000, 0x88ff, 0x0040, 0x26b7, 0xa18d, 0x0004, 0x795a,
-       0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061, 0x6818,
-       0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c, 0x0080, 0x0040,
-       0x26d6, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050, 0x26d4, 0xa08a,
-       0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x78aa, 0x8008,
-       0x810c, 0x0040, 0x33dd, 0xa18c, 0x00f8, 0x00c0, 0x33dd, 0x157e,
-       0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac,
-       0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814,
-       0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2, 0x7eda,
-       0x1078, 0x38c6, 0x00c0, 0x270d, 0x702c, 0x8003, 0x0048, 0x2706,
-       0x2019, 0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000, 0x7830, 0xa084,
-       0x00c0, 0x00c0, 0x270d, 0x0098, 0x2715, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x38de, 0x0078, 0x2461, 0x7200, 0xa284, 0x0007,
-       0xa086, 0x0001, 0x00c0, 0x2722, 0x781b, 0x004f, 0x1078, 0x38de,
-       0x0078, 0x2733, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x004f,
-       0x1078, 0x38de, 0x7200, 0x2500, 0xa605, 0x0040, 0x2733, 0xa284,
-       0x0007, 0x1079, 0x2741, 0xad80, 0x0009, 0x7036, 0xa284, 0x0007,
-       0xa086, 0x0001, 0x00c0, 0x2438, 0x6018, 0x8000, 0x601a, 0x0078,
-       0x2438, 0x2749, 0x48f7, 0x48f7, 0x48e6, 0x48f7, 0x2749, 0x48e6,
-       0x2749, 0x1078, 0x23ca, 0x1078, 0x38c6, 0x0f7e, 0x2079, 0x5000,
-       0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x276f, 0x706c, 0xa086,
-       0x0001, 0x00c0, 0x275e, 0x706e, 0x0078, 0x2802, 0x706c, 0xa086,
-       0x0005, 0x00c0, 0x276d, 0x7088, 0x2068, 0x681b, 0x0004, 0x6817,
-       0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000, 0x2011,
-       0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x2790, 0xa186, 0x0007,
-       0x00c0, 0x2780, 0x2009, 0x5038, 0x200b, 0x0005, 0x0078, 0x2790,
-       0x2009, 0x5013, 0x2104, 0x2009, 0x5012, 0x200a, 0x2009, 0x5038,
-       0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078, 0x2792,
-       0x706f, 0x0000, 0x1078, 0x4633, 0x157e, 0x20a9, 0x0010, 0x2039,
-       0x0000, 0x1078, 0x36b0, 0xa7b8, 0x0100, 0x0070, 0x27a1, 0x0078,
-       0x2799, 0x157f, 0x7000, 0x0079, 0x27a5, 0x27d3, 0x27ba, 0x27ba,
-       0x27ad, 0x27d3, 0x27d3, 0x27d3, 0x27d3, 0x2021, 0x505a, 0x2404,
-       0xa005, 0x0040, 0x27d3, 0xad06, 0x00c0, 0x27ba, 0x6800, 0x2022,
-       0x0078, 0x27ca, 0x6820, 0xa084, 0x0001, 0x00c0, 0x27c6, 0x6f14,
-       0x1078, 0x37bd, 0x1078, 0x33ae, 0x0078, 0x27ca, 0x7060, 0x2060,
-       0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008,
-       0x6822, 0x1078, 0x1c53, 0x2021, 0x7400, 0x1078, 0x280f, 0x2021,
-       0x505a, 0x1078, 0x280f, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7300,
-       0x1078, 0x280f, 0x8420, 0x0070, 0x27e7, 0x0078, 0x27e0, 0x2061,
-       0x5300, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff,
-       0x0040, 0x27f6, 0xa102, 0x0050, 0x27f6, 0x6012, 0x601b, 0x0000,
-       0xace0, 0x0010, 0x0070, 0x27fe, 0x0078, 0x27ed, 0x8421, 0x00c0,
-       0x27eb, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x2809, 0x1078,
-       0x39cc, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x2438, 0x047e,
-       0x2404, 0xa005, 0x0040, 0x2823, 0x2068, 0x6800, 0x007e, 0x6a1a,
-       0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1c53,
-       0x007f, 0x0078, 0x2811, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282,
-       0x0003, 0x0050, 0x282d, 0x1078, 0x23ca, 0x2300, 0x0079, 0x2830,
-       0x2833, 0x28a6, 0x28c3, 0xa282, 0x0002, 0x0040, 0x2839, 0x1078,
-       0x23ca, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x2840,
-       0x2848, 0x2848, 0x284a, 0x287e, 0x33e3, 0x2848, 0x287e, 0x2848,
-       0x1078, 0x23ca, 0x7780, 0x1078, 0x36b0, 0x7780, 0xa7bc, 0x0f00,
-       0x1078, 0x37bd, 0x6018, 0xa005, 0x0040, 0x2875, 0x2021, 0x7400,
-       0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x28de, 0x0040, 0x2875,
-       0x157e, 0x20a9, 0x0000, 0x2021, 0x7300, 0x047e, 0x2009, 0x0004,
-       0x2011, 0x0010, 0x1078, 0x28de, 0x047f, 0x0040, 0x2874, 0x8420,
-       0x0070, 0x2874, 0x0078, 0x2865, 0x157f, 0x8738, 0xa784, 0x001f,
-       0x00c0, 0x2850, 0x0078, 0x2461, 0x0078, 0x2461, 0x7780, 0x1078,
-       0x37bd, 0x6018, 0xa005, 0x0040, 0x28a4, 0x2021, 0x7400, 0x2009,
-       0x0005, 0x2011, 0x0020, 0x1078, 0x28de, 0x0040, 0x28a4, 0x157e,
-       0x20a9, 0x0000, 0x2021, 0x7300, 0x047e, 0x2009, 0x0005, 0x2011,
-       0x0020, 0x1078, 0x28de, 0x047f, 0x0040, 0x28a3, 0x8420, 0x0070,
-       0x28a3, 0x0078, 0x2894, 0x157f, 0x0078, 0x2461, 0x2200, 0x0079,
-       0x28a9, 0x28ac, 0x28ae, 0x28ae, 0x1078, 0x23ca, 0x2009, 0x0012,
-       0x706c, 0xa086, 0x0002, 0x0040, 0x28b7, 0x2009, 0x000e, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x28bd, 0x691a, 0x706f, 0x0000, 0x7073,
-       0x0001, 0x0078, 0x3854, 0x2200, 0x0079, 0x28c6, 0x28cb, 0x28ae,
-       0x28c9, 0x1078, 0x23ca, 0x1078, 0x4633, 0x7000, 0xa086, 0x0001,
-       0x00c0, 0x3373, 0x1078, 0x33c4, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x1078, 0x3366, 0x0040, 0x3373, 0x0078, 0x2573, 0x2404, 0xa005,
-       0x0040, 0x2901, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040,
-       0x28ed, 0x2d20, 0x007f, 0x0078, 0x28df, 0x007f, 0x2022, 0x691a,
-       0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078, 0x1c53, 0x6010,
-       0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x33c4,
-       0x007c, 0xa085, 0x0001, 0x0078, 0x2900, 0x2300, 0x0079, 0x2908,
-       0x290d, 0x290b, 0x29a6, 0x1078, 0x23ca, 0x78ec, 0xa084, 0x0001,
-       0x00c0, 0x2921, 0x7000, 0xa086, 0x0004, 0x00c0, 0x2919, 0x0078,
-       0x2944, 0x1078, 0x33c4, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078,
-       0x3373, 0x78e4, 0xa005, 0x00d0, 0x2944, 0x0018, 0x2438, 0x2008,
-       0xa084, 0x0030, 0x00c0, 0x2930, 0x781b, 0x004f, 0x0078, 0x2438,
-       0x78ec, 0xa084, 0x0003, 0x0040, 0x292c, 0x2100, 0xa084, 0x0007,
-       0x0079, 0x293a, 0x297d, 0x2988, 0x296e, 0x2942, 0x38b9, 0x38b9,
-       0x2942, 0x2997, 0x1078, 0x23ca, 0x7000, 0xa086, 0x0004, 0x00c0,
-       0x295e, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2954, 0x2011, 0x0002,
-       0x2019, 0x0000, 0x0078, 0x2827, 0x706c, 0xa086, 0x0006, 0x0040,
-       0x294e, 0x706c, 0xa086, 0x0004, 0x0040, 0x294e, 0x79e4, 0xa184,
-       0x0030, 0x0040, 0x2968, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x296a,
-       0x0078, 0x2f43, 0x2001, 0x0003, 0x0078, 0x2cd7, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x2975, 0x681b, 0x001d, 0x1078, 0x368f, 0x782b,
-       0x3008, 0x781b, 0x0056, 0x0078, 0x2438, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x2984, 0x681b, 0x001d, 0x1078, 0x368f, 0x0078, 0x3884,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x298f, 0x681b, 0x001d, 0x1078,
-       0x368f, 0x782b, 0x3008, 0x781b, 0x00d2, 0x0078, 0x2438, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x299e, 0x681b, 0x001d, 0x1078, 0x368f,
-       0x782b, 0x3008, 0x781b, 0x0093, 0x0078, 0x2438, 0xa584, 0x000f,
-       0x00c0, 0x29c3, 0x7000, 0x0079, 0x29ad, 0x2461, 0x29b7, 0x29b5,
-       0x3373, 0x3373, 0x3373, 0x3373, 0x29b5, 0x1078, 0x23ca, 0x1078,
-       0x33c4, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x3366, 0x0040,
-       0x3373, 0x0078, 0x2573, 0x78e4, 0xa005, 0x00d0, 0x2944, 0x0018,
-       0x2944, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29d2, 0x781b, 0x004f,
-       0x0078, 0x2438, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ce, 0x2100,
-       0xa184, 0x0007, 0x0079, 0x29dc, 0x29ee, 0x29f2, 0x29e6, 0x29e4,
-       0x38b9, 0x38b9, 0x29e4, 0x38af, 0x1078, 0x23ca, 0x1078, 0x3697,
-       0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2438, 0x1078, 0x3697,
-       0x0078, 0x3884, 0x1078, 0x3697, 0x782b, 0x3008, 0x781b, 0x00d2,
-       0x0078, 0x2438, 0x1078, 0x3697, 0x782b, 0x3008, 0x781b, 0x0093,
-       0x0078, 0x2438, 0x2300, 0x0079, 0x2a05, 0x2a0a, 0x2a08, 0x2a0c,
-       0x1078, 0x23ca, 0x0078, 0x3081, 0x681b, 0x0008, 0x78a3, 0x0000,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x3081, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x3081, 0xa184, 0x0007, 0x0079, 0x2a1e, 0x2a26, 0x29f2,
-       0x296e, 0x3854, 0x38b9, 0x38b9, 0x2a26, 0x38af, 0x1078, 0x3868,
-       0x0078, 0x2438, 0xa282, 0x0005, 0x0050, 0x2a30, 0x1078, 0x23ca,
-       0x2300, 0x0079, 0x2a33, 0x2a36, 0x2c84, 0x2c92, 0x2200, 0x0079,
-       0x2a39, 0x2a53, 0x2a40, 0x2a53, 0x2a3e, 0x2c69, 0x1078, 0x23ca,
-       0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048,
-       0x366b, 0xa08a, 0x0004, 0x00c8, 0x366b, 0x0079, 0x2a4f, 0x366b,
-       0x366b, 0x366b, 0x3619, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080,
-       0x0040, 0x2a64, 0x0078, 0x366b, 0x7000, 0xa005, 0x00c0, 0x2a5a,
-       0x2011, 0x0004, 0x0078, 0x31f5, 0xa184, 0x00ff, 0xa08a, 0x0010,
-       0x00c8, 0x366b, 0x0079, 0x2a6c, 0x2a7e, 0x2a7c, 0x2a96, 0x2a9a,
-       0x2b55, 0x366b, 0x366b, 0x2b57, 0x366b, 0x366b, 0x2c65, 0x2c65,
-       0x366b, 0x366b, 0x366b, 0x2c67, 0x1078, 0x23ca, 0xa684, 0x1000,
-       0x0040, 0x2a8b, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a, 0x781b,
-       0x0091, 0x0078, 0x2438, 0x6818, 0xa084, 0x8000, 0x0040, 0x2a94,
-       0x681b, 0x001d, 0x0078, 0x2a82, 0x0078, 0x3854, 0x681b, 0x001d,
-       0x0078, 0x367b, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x2adb,
-       0x6820, 0xa084, 0x0001, 0x00c0, 0x2ae1, 0x6818, 0xa086, 0x0008,
-       0x00c0, 0x2aac, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040, 0x2b51,
-       0xa684, 0x0080, 0x0040, 0x2ad7, 0x7097, 0x0000, 0x6818, 0xa084,
-       0x003f, 0xa08a, 0x000d, 0x0050, 0x2ad7, 0xa08a, 0x000c, 0x7196,
-       0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061, 0x78aa, 0x157e,
-       0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac,
-       0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x781b,
-       0x0058, 0x0078, 0x2438, 0xa684, 0x1000, 0x0040, 0x2ae1, 0x0078,
-       0x2438, 0xa684, 0x0060, 0x0040, 0x2b4d, 0xa684, 0x0800, 0x0040,
-       0x2b4d, 0xa684, 0x8000, 0x00c0, 0x2aef, 0x0078, 0x2b09, 0xa6b4,
-       0x7fff, 0x7e5a, 0x6eb6, 0x789b, 0x0076, 0x7aac, 0x79ac, 0x78ac,
-       0x801b, 0x00c8, 0x2afc, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
-       0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
-       0x68ae, 0xa684, 0x4000, 0x0040, 0x2b11, 0xa6b4, 0xbfff, 0x7e5a,
-       0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0, 0x2b1e, 0x1078, 0x46e9,
-       0x1078, 0x48e6, 0x781b, 0x0064, 0x0078, 0x2438, 0xa006, 0x1078,
-       0x49ed, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
-       0x2b2d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda,
-       0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x2b3f, 0xa6b5,
-       0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064, 0x0078, 0x2438, 0x781b,
-       0x0064, 0x2200, 0xa115, 0x00c0, 0x2b49, 0x1078, 0x48f7, 0x0078,
-       0x2438, 0x1078, 0x4942, 0x0078, 0x2438, 0x781b, 0x0065, 0x0078,
-       0x2438, 0x781b, 0x0058, 0x0078, 0x2438, 0x1078, 0x23ca, 0x0078,
-       0x2bb8, 0x6920, 0xa184, 0x0100, 0x0040, 0x2b6f, 0xa18c, 0xfeff,
-       0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002,
-       0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x2ba7, 0xa184,
-       0x0200, 0x0040, 0x2ba7, 0xa18c, 0xfdff, 0x6922, 0x0c7e, 0x7054,
-       0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef,
-       0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2ba7,
-       0x1078, 0x37b9, 0x1078, 0x34c7, 0x88ff, 0x0040, 0x2ba7, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684,
-       0x0400, 0x00c0, 0x2ba1, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078,
-       0x2438, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x7e58,
-       0xa684, 0x0400, 0x00c0, 0x2bb0, 0x781b, 0x0058, 0x0078, 0x2438,
-       0x781b, 0x0065, 0x0078, 0x2438, 0x0078, 0x3673, 0x0078, 0x3673,
-       0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, 0x2bb6, 0x789b,
-       0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0, 0x2bf6,
-       0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x2bee, 0x0048,
-       0x2bd3, 0x0078, 0x2bf0, 0xa380, 0x0002, 0xa102, 0x00c8, 0x2bee,
-       0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000,
-       0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5, 0x6006, 0x0c7f,
-       0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2ba8, 0x0078, 0x2b59,
-       0x24a8, 0x7aa8, 0x00f0, 0x2bf0, 0x0078, 0x2bc1, 0xa284, 0x00f0,
-       0xa086, 0x0020, 0x00c0, 0x2c56, 0x8318, 0x8318, 0x2300, 0xa102,
-       0x0040, 0x2c06, 0x0048, 0x2c06, 0x0078, 0x2c53, 0xa286, 0x0023,
-       0x0040, 0x2bb6, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684,
-       0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010,
-       0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f,
-       0xa184, 0x0010, 0x0040, 0x2c2a, 0x1078, 0x37b9, 0x1078, 0x35d6,
-       0x0078, 0x2c39, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008, 0x2c48,
-       0x0c7f, 0xa184, 0x0008, 0x0040, 0x2ba7, 0x1078, 0x37b9, 0x1078,
-       0x34c7, 0x88ff, 0x0040, 0x2ba7, 0x789b, 0x0060, 0x2800, 0x78aa,
-       0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2c4d, 0x782b,
-       0x3008, 0x781b, 0x0056, 0x0078, 0x2438, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x7aa8, 0x0078, 0x2bc1, 0x8318, 0x2300,
-       0xa102, 0x0040, 0x2c5f, 0x0048, 0x2c5f, 0x0078, 0x2bc1, 0xa284,
-       0x0080, 0x00c0, 0x367b, 0x0078, 0x3673, 0x0078, 0x367b, 0x0078,
-       0x366b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001,
-       0x0040, 0x2c74, 0x1078, 0x23ca, 0x7aa8, 0xa294, 0x00ff, 0x78a8,
-       0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x366b, 0x0079, 0x2c80,
-       0x366b, 0x3414, 0x366b, 0x356b, 0xa282, 0x0000, 0x00c0, 0x2c8a,
-       0x1078, 0x23ca, 0x1078, 0x368f, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x2438, 0xa282, 0x0003, 0x00c0, 0x2c98, 0x1078, 0x23ca,
-       0xa484, 0x8000, 0x00c0, 0x2cbb, 0x706c, 0xa005, 0x0040, 0x2ca2,
-       0x1078, 0x23ca, 0x6f14, 0x7782, 0xa7bc, 0x0f00, 0x1078, 0x37bd,
-       0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0,
-       0x2ca6, 0x1078, 0x3693, 0x706f, 0x0002, 0x2009, 0x5038, 0x200b,
-       0x0009, 0x0078, 0x2cbd, 0x1078, 0x369f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x2438, 0xa282, 0x0004, 0x0050, 0x2cc9, 0x1078,
-       0x23ca, 0x2300, 0x0079, 0x2ccc, 0x2ccf, 0x2db8, 0x2deb, 0xa286,
-       0x0003, 0x0040, 0x2cd5, 0x1078, 0x23ca, 0x2001, 0x0000, 0x007e,
-       0x68c0, 0xa005, 0x0040, 0x2cde, 0x7003, 0x0003, 0x68a0, 0xa084,
-       0x2000, 0x0040, 0x2ce7, 0x6008, 0xa085, 0x0002, 0x600a, 0x007f,
-       0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2cee, 0x2461, 0x2cf8,
-       0x2cf8, 0x2eed, 0x2f29, 0x2461, 0x2f29, 0x2cf6, 0x1078, 0x23ca,
-       0xa684, 0x1000, 0x00c0, 0x2d00, 0x1078, 0x4633, 0x0040, 0x2d92,
-       0x7868, 0xa08c, 0x00ff, 0x0040, 0x2d48, 0xa186, 0x0008, 0x00c0,
-       0x2d17, 0x1078, 0x33c4, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
-       0x3366, 0x0040, 0x2d48, 0x1078, 0x4633, 0x0078, 0x2d2f, 0xa186,
-       0x0028, 0x00c0, 0x2d48, 0x1078, 0x4633, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x6018, 0xa005, 0x0040, 0x2d2f, 0x8001, 0x601a, 0xa005,
-       0x0040, 0x2d2f, 0x8001, 0xa005, 0x0040, 0x2d2f, 0x601e, 0x6820,
-       0xa084, 0x0001, 0x0040, 0x2461, 0x6820, 0xa084, 0xfffe, 0x6822,
-       0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802,
-       0xa005, 0x2d00, 0x00c0, 0x2d45, 0x6002, 0x6006, 0x0078, 0x2461,
-       0x017e, 0x1078, 0x2e1c, 0x017f, 0xa684, 0xdf00, 0x681e, 0x682b,
-       0x0000, 0x6f14, 0x81ff, 0x0040, 0x2d92, 0xa186, 0x0002, 0x00c0,
-       0x2d92, 0xa684, 0x0800, 0x00c0, 0x2d65, 0xa684, 0x0060, 0x0040,
-       0x2d65, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820, 0xa084, 0x0800,
-       0x00c0, 0x2d92, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213,
-       0xa290, 0x5280, 0xa290, 0x0000, 0x221c, 0xa384, 0x0100, 0x00c0,
-       0x2d7b, 0x0078, 0x2d81, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012,
-       0x8211, 0xa384, 0x0400, 0x0040, 0x2d8e, 0x68a0, 0xa084, 0x0100,
-       0x00c0, 0x2d8e, 0x1078, 0x2ea0, 0x0078, 0x2461, 0x6008, 0xa085,
-       0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000, 0x0040, 0x2d9a,
-       0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078, 0x33b5, 0x1078,
-       0x33c4, 0x00c0, 0x2da7, 0x6008, 0xa084, 0xffef, 0x600a, 0x6820,
-       0xa084, 0x0001, 0x00c0, 0x2db0, 0x1078, 0x33ae, 0x0078, 0x2db4,
-       0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1c53, 0x0078, 0x2461,
-       0xa282, 0x0004, 0x0048, 0x2dbe, 0x1078, 0x23ca, 0x2200, 0x0079,
-       0x2dc1, 0x2dbc, 0x2dc5, 0x2dd2, 0x2dc5, 0x7000, 0xa086, 0x0005,
-       0x0040, 0x2dce, 0x1078, 0x368f, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x2438, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007, 0xa080,
-       0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003, 0x0040,
-       0x2de7, 0xa186, 0x0000, 0x0040, 0x2de7, 0x0078, 0x366b, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff,
-       0x00c0, 0x2df6, 0x1078, 0x368f, 0x0078, 0x2dfd, 0x8211, 0x0040,
-       0x2dfb, 0x1078, 0x23ca, 0x1078, 0x369f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x702c, 0x8003, 0x0048, 0x2e0d, 0x2019,
-       0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000, 0x1078, 0x38de, 0x7830,
-       0xa084, 0x00c0, 0x00c0, 0x2e19, 0x0018, 0x2e19, 0x791a, 0xa006,
-       0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060, 0x00c0, 0x2e26,
-       0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e9f, 0xa684, 0x0800,
-       0x00c0, 0x2e48, 0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x0800,
-       0x00c0, 0x2e48, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x703c, 0xa005,
-       0x00c0, 0x2e40, 0x2200, 0xa105, 0x0040, 0x2e47, 0x703f, 0x0015,
-       0x7000, 0xa086, 0x0006, 0x0040, 0x2e47, 0x1078, 0x4633, 0x007c,
-       0xa684, 0x0020, 0x0040, 0x2e6a, 0xa684, 0x4000, 0x0040, 0x2e56,
-       0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e40, 0x68b4, 0xa084,
-       0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e50, 0x703c, 0xa005,
-       0x00c0, 0x2e64, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x692e, 0x6a32,
-       0x0078, 0x2e40, 0xa684, 0x4000, 0x0040, 0x2e74, 0x682f, 0x0000,
-       0x6833, 0x0000, 0x0078, 0x2e40, 0x68b4, 0xa084, 0x4800, 0xa635,
-       0xa684, 0x4000, 0x00c0, 0x2e6e, 0x703c, 0xa005, 0x00c0, 0x2e82,
-       0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8, 0x2e89,
-       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32,
-       0x2100, 0xa205, 0x00c0, 0x2e96, 0x0078, 0x2e40, 0x7000, 0xa086,
-       0x0006, 0x0040, 0x2e9f, 0x1078, 0x49ed, 0x0078, 0x2e40, 0x007c,
-       0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200, 0x0040, 0x2eac,
-       0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006, 0x688f, 0x0000,
-       0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003,
-       0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020,
-       0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079, 0x2ec7, 0x2461,
-       0x2ed1, 0x2eda, 0x2ecf, 0x2ecf, 0x2ecf, 0x2ecf, 0x2ecf, 0x1078,
-       0x23ca, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2eda, 0x1078, 0x33ae,
-       0x0078, 0x2ee0, 0x7060, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60,
-       0x2021, 0x505a, 0x2404, 0xa005, 0x0040, 0x2ee9, 0x2020, 0x0078,
-       0x2ee2, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x33b5, 0x1078,
-       0x33c4, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b, 0x0000, 0x789b,
-       0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4a35, 0xa684, 0x0800,
-       0x0040, 0x2f06, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x2f16, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2f14,
-       0x681b, 0x001e, 0x0078, 0x2f16, 0x681b, 0x0000, 0x2021, 0x505a,
-       0x2404, 0xad06, 0x0040, 0x2f1d, 0x7460, 0x6800, 0x2022, 0x68c3,
-       0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x1c53, 0x0078,
-       0x2461, 0x1078, 0x2e1c, 0x682b, 0x0000, 0x2001, 0x000e, 0x6f14,
-       0x1078, 0x38e4, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x2f3c, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x706f,
-       0x0000, 0x0078, 0x2461, 0x7000, 0xa005, 0x00c0, 0x2f49, 0x0078,
-       0x2461, 0xa006, 0x1078, 0x4633, 0x6817, 0x0000, 0x681b, 0x0014,
-       0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa085, 0x00ff,
-       0x6822, 0x7000, 0x0079, 0x2f5c, 0x2461, 0x2f66, 0x2f66, 0x2f68,
-       0x2f68, 0x2f68, 0x2f68, 0x2f64, 0x1078, 0x23ca, 0x1078, 0x33c4,
-       0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x337e, 0x2300, 0x0079,
-       0x2f71, 0x2f74, 0x2f76, 0x2faf, 0x1078, 0x23ca, 0x7000, 0x0079,
-       0x2f79, 0x2461, 0x2f83, 0x2f83, 0x2f9e, 0x2f83, 0x2fab, 0x2f9e,
-       0x2f81, 0x1078, 0x23ca, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
-       0x2f9a, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
-       0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x4633, 0x1078, 0x48f7,
-       0x0078, 0x3854, 0xa684, 0x2000, 0x0040, 0x2f8d, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x2fab, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
-       0x2fab, 0x681b, 0x0007, 0x1078, 0x3868, 0x0078, 0x2438, 0x1078,
-       0x23ca, 0x2300, 0x0079, 0x2fb4, 0x2fb7, 0x2fb9, 0x2fec, 0x1078,
-       0x23ca, 0x7000, 0x0079, 0x2fbc, 0x2461, 0x2fc6, 0x2fc6, 0x2fe1,
-       0x2fc6, 0x2fe8, 0x2fe1, 0x2fc4, 0x1078, 0x23ca, 0xa684, 0x0060,
-       0xa086, 0x0060, 0x00c0, 0x2fdd, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff,
-       0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078,
-       0x4633, 0x1078, 0x48f7, 0x0078, 0x3854, 0xa684, 0x2000, 0x0040,
-       0x2fd0, 0x6818, 0xa084, 0x8000, 0x0040, 0x2fe8, 0x681b, 0x0007,
-       0x781b, 0x00d2, 0x0078, 0x2438, 0x6820, 0xa085, 0x0004, 0x6822,
-       0x1078, 0x381f, 0xa6b5, 0x0800, 0x1078, 0x368f, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x2438, 0x2300, 0x0079, 0x2fff, 0x3002,
-       0x3004, 0x3006, 0x1078, 0x23ca, 0x0078, 0x367b, 0xa684, 0x0400,
-       0x00c0, 0x302f, 0x79e4, 0xa184, 0x0020, 0x0040, 0x3016, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x3016, 0x782b, 0x3009, 0x789b, 0x0060,
-       0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020,
-       0x0040, 0x3027, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x302b, 0x2001,
-       0x0014, 0x0078, 0x2cd7, 0xa184, 0x0007, 0x0079, 0x3067, 0x7a90,
-       0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x3065,
-       0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x3056, 0x7ba8,
-       0x7ba8, 0xa386, 0x0001, 0x00c0, 0x3049, 0x2009, 0xfff7, 0x0078,
-       0x304f, 0xa386, 0x0003, 0x00c0, 0x3056, 0x2009, 0xffef, 0x0c7e,
-       0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060,
-       0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920,
-       0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3854, 0x297d,
-       0x2988, 0x3071, 0x3079, 0x306f, 0x306f, 0x3854, 0x3854, 0x1078,
-       0x23ca, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
-       0x385e, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
-       0x3854, 0x79e4, 0xa184, 0x0030, 0x0040, 0x308b, 0x78ec, 0xa084,
-       0x0003, 0x00c0, 0x30b2, 0x7000, 0xa086, 0x0004, 0x00c0, 0x30a5,
-       0x706c, 0xa086, 0x0002, 0x00c0, 0x309b, 0x2011, 0x0002, 0x2019,
-       0x0000, 0x0078, 0x2827, 0x706c, 0xa086, 0x0006, 0x0040, 0x3095,
-       0x706c, 0xa086, 0x0004, 0x0040, 0x3095, 0x7000, 0xa086, 0x0000,
-       0x0040, 0x2438, 0x6818, 0xa085, 0x8000, 0x681a, 0x2001, 0x0014,
-       0x0078, 0x2cd7, 0xa184, 0x0007, 0x0079, 0x30b6, 0x3854, 0x3854,
-       0x30be, 0x3854, 0x38b9, 0x38b9, 0x3854, 0x3854, 0xa684, 0x0080,
-       0x0040, 0x30ed, 0x7194, 0x81ff, 0x0040, 0x30ed, 0xa182, 0x000d,
-       0x00d0, 0x30ce, 0x7097, 0x0000, 0x0078, 0x30d3, 0xa182, 0x000c,
-       0x7096, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e,
-       0x147e, 0x7098, 0x8114, 0xa210, 0x729a, 0xa080, 0x000b, 0xad00,
-       0x2098, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6,
-       0x147f, 0x137f, 0x157f, 0x0078, 0x385e, 0xa684, 0x0400, 0x00c0,
-       0x312e, 0x6820, 0xa084, 0x0001, 0x0040, 0x385e, 0xa68c, 0x0060,
-       0xa684, 0x0060, 0x0040, 0x3102, 0xa086, 0x0060, 0x00c0, 0x3102,
-       0xa18d, 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060,
-       0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a,
-       0x78aa, 0x8008, 0x810c, 0x0040, 0x33dd, 0xa18c, 0x00f8, 0x00c0,
-       0x33dd, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
-       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
-       0x157f, 0x6814, 0x8007, 0x7882, 0x0078, 0x385e, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x3135, 0x681b, 0x0008, 0x781b, 0x00c8, 0x0078,
-       0x2438, 0x2300, 0x0079, 0x313c, 0x3141, 0x31e0, 0x313f, 0x1078,
-       0x23ca, 0x7000, 0xa084, 0x0007, 0x0079, 0x3146, 0x2461, 0x3150,
-       0x3185, 0x315b, 0x314e, 0x2461, 0x314e, 0x314e, 0x1078, 0x23ca,
-       0x681c, 0xa084, 0x2000, 0x0040, 0x3169, 0x6008, 0xa085, 0x0002,
-       0x600a, 0x0078, 0x3169, 0x68c0, 0xa005, 0x00c0, 0x3185, 0x6920,
-       0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800, 0x706a, 0x0078,
-       0x317f, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005,
-       0x00c0, 0x3173, 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x317f,
-       0x7014, 0x68ba, 0x7130, 0xa188, 0x7300, 0x0078, 0x3181, 0x2009,
-       0x7400, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6, 0xa684, 0x0060,
-       0x0040, 0x31de, 0xa684, 0x0800, 0x00c0, 0x3199, 0xa684, 0x7fff,
-       0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x4633, 0x0078,
-       0x31de, 0xa684, 0x0020, 0x0040, 0x31ae, 0x68c0, 0xa005, 0x0040,
-       0x31a5, 0x1078, 0x4a35, 0x0078, 0x31a8, 0xa006, 0x1078, 0x49ed,
-       0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x31b4, 0x1078, 0x37ca,
-       0x69aa, 0x6aa6, 0x1078, 0x49ed, 0xa684, 0x8000, 0x0040, 0x31de,
-       0xa684, 0x7fff, 0x68b6, 0x2001, 0x0076, 0x1078, 0x38e4, 0x2010,
-       0x2001, 0x0078, 0x1078, 0x38e4, 0x2008, 0xa684, 0x0020, 0x00c0,
-       0x31d6, 0x2001, 0x007a, 0x1078, 0x38e4, 0x801b, 0x00c8, 0x31d1,
-       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
-       0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x0078, 0x2461,
-       0x0078, 0x367b, 0x7037, 0x0000, 0xa282, 0x0006, 0x0050, 0x31ea,
-       0x1078, 0x23ca, 0x7000, 0xa084, 0x0007, 0x10c0, 0x398a, 0x2300,
-       0x0079, 0x31f2, 0x31f5, 0x321e, 0x3232, 0x2200, 0x0079, 0x31f8,
-       0x321c, 0x367b, 0x31fe, 0x321c, 0x324e, 0x3290, 0x7003, 0x0005,
-       0x2001, 0x7510, 0x2068, 0x704a, 0x157e, 0x20a9, 0x0031, 0x2003,
-       0x0000, 0x8000, 0x0070, 0x320e, 0x0078, 0x3207, 0x157f, 0xad80,
-       0x0009, 0x7036, 0x6817, 0x0000, 0x68b7, 0x0700, 0x6823, 0x0800,
-       0x6827, 0x0003, 0x0078, 0x366b, 0x1078, 0x23ca, 0x7003, 0x0005,
-       0x2001, 0x7510, 0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200,
-       0x0079, 0x322a, 0x367b, 0x3230, 0x3230, 0x324e, 0x3230, 0x367b,
-       0x1078, 0x23ca, 0x7003, 0x0005, 0x2001, 0x7510, 0x2068, 0x704a,
-       0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x323e, 0x3246, 0x3244,
-       0x3244, 0x3246, 0x3244, 0x3246, 0x1078, 0x23ca, 0x1078, 0x369f,
-       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x7003, 0x0002,
-       0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
-       0xa215, 0x2069, 0x7400, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
-       0x0040, 0x3269, 0x6814, 0xa206, 0x0040, 0x3285, 0x6800, 0x0078,
-       0x325c, 0x7003, 0x0005, 0x2001, 0x7510, 0x2068, 0x704a, 0x7036,
-       0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x327a,
-       0x0078, 0x3273, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16, 0x68b7,
-       0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820,
-       0xa084, 0x0c00, 0x0040, 0x32df, 0x1078, 0x3697, 0x0078, 0x32df,
-       0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
-       0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0xa1e8,
-       0x7300, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005, 0x0040, 0x32af,
-       0x6814, 0xa206, 0x0040, 0x32ca, 0x6800, 0x0078, 0x32a2, 0x7003,
-       0x0005, 0x2001, 0x7510, 0x2068, 0x704a, 0x157e, 0x20a9, 0x0031,
-       0x2003, 0x0000, 0x8000, 0x0070, 0x32bf, 0x0078, 0x32b8, 0x157f,
-       0xad80, 0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800,
-       0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040,
-       0x32df, 0xa084, 0x0800, 0x0040, 0x32d9, 0x1078, 0x369b, 0x0078,
-       0x32df, 0x1078, 0x3697, 0x708b, 0x0000, 0x0078, 0x32df, 0x027e,
-       0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x5280,
-       0x2060, 0x7056, 0x6000, 0x705a, 0x6004, 0x705e, 0xa684, 0x0060,
-       0x0040, 0x3337, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0,
-       0x3319, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a,
-       0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3337, 0x68c0, 0xa005,
-       0x0040, 0x3312, 0x7003, 0x0003, 0x682b, 0x0000, 0x1078, 0x48e6,
-       0x0078, 0x3314, 0x1078, 0x48f7, 0xa6b5, 0x2000, 0x7e5a, 0x0078,
-       0x3337, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040,
-       0x3337, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xa6b4, 0xbfff,
-       0x7e5a, 0x007e, 0x68c0, 0xa005, 0x007f, 0x0040, 0x3335, 0x7003,
-       0x0003, 0x1078, 0x48e6, 0x0078, 0x3337, 0x1078, 0x4942, 0x077f,
-       0x1078, 0x37bd, 0x2009, 0x0065, 0xa684, 0x0004, 0x0040, 0x3358,
-       0x78e4, 0xa084, 0x0030, 0x0040, 0x3350, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x3350, 0x782b, 0x3008, 0x2009, 0x0065, 0x0078, 0x3358,
-       0x0f7e, 0x2079, 0x5000, 0x1078, 0x4633, 0x0f7f, 0x0040, 0x2461,
-       0x791a, 0x2d00, 0x704a, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xa080, 0x5280, 0x2048, 0x0078, 0x2438, 0x6020, 0xa005,
-       0x0040, 0x3372, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a,
-       0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x4633, 0x6817, 0x0000,
-       0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084,
-       0x0007, 0x0079, 0x3383, 0x2461, 0x338d, 0x338d, 0x33aa, 0x3395,
-       0x3393, 0x3395, 0x338b, 0x1078, 0x23ca, 0x1078, 0x33b5, 0x1078,
-       0x33ae, 0x1078, 0x1c53, 0x0078, 0x2461, 0x706c, 0x706f, 0x0000,
-       0x7093, 0x0000, 0x0079, 0x339c, 0x33a6, 0x33a6, 0x33a4, 0x33a4,
-       0x33a4, 0x33a6, 0x33a4, 0x33a6, 0x0079, 0x2840, 0x706f, 0x0000,
-       0x0078, 0x2461, 0x681b, 0x0000, 0x0078, 0x2eed, 0x6800, 0xa005,
-       0x00c0, 0x33b3, 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040,
-       0x33be, 0x8001, 0x00d0, 0x33be, 0x1078, 0x23ca, 0x6012, 0x6008,
-       0xa084, 0xffef, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x33ca,
-       0x8001, 0x601a, 0x007c, 0x1078, 0x38de, 0x681b, 0x0018, 0x0078,
-       0x3401, 0x1078, 0x38de, 0x681b, 0x0019, 0x0078, 0x3401, 0x1078,
-       0x38de, 0x681b, 0x001a, 0x0078, 0x3401, 0x1078, 0x38de, 0x681b,
-       0x0003, 0x0078, 0x3401, 0x7780, 0x1078, 0x37bd, 0x7184, 0xa18c,
-       0x00ff, 0xa1e8, 0x7300, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0,
-       0x33f3, 0x0078, 0x2461, 0x6814, 0x7280, 0xa206, 0x0040, 0x33fb,
-       0x6800, 0x0078, 0x33ec, 0x6800, 0x200a, 0x681b, 0x0005, 0x708b,
-       0x0000, 0x1078, 0x33b5, 0x6820, 0xa084, 0x0001, 0x00c0, 0x340a,
-       0x1078, 0x33ae, 0x1078, 0x33c4, 0x681f, 0x0000, 0x6823, 0x0020,
-       0x1078, 0x1c53, 0x0078, 0x2461, 0xa282, 0x0003, 0x00c0, 0x366b,
-       0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff, 0x6920, 0xa18d,
-       0x0080, 0x6922, 0xa184, 0x0100, 0x0040, 0x3478, 0xa18c, 0xfeff,
-       0x6922, 0xa4a4, 0x00ff, 0x0040, 0x3462, 0xa482, 0x000c, 0x0048,
-       0x3435, 0x0040, 0x3435, 0x2021, 0x000c, 0x852b, 0x852b, 0x1078,
-       0x372e, 0x0040, 0x343f, 0x1078, 0x3531, 0x0078, 0x346b, 0x1078,
-       0x36e9, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078,
-       0x3558, 0x0c7f, 0x6920, 0xa18d, 0x0100, 0x6922, 0x7e58, 0xa6b5,
-       0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x345c, 0x782b, 0x3008,
-       0x781b, 0x0056, 0x0078, 0x2438, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x2438, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006,
-       0x1078, 0x3558, 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x3474,
-       0x781b, 0x0058, 0x0078, 0x2438, 0x781b, 0x0065, 0x0078, 0x2438,
-       0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040, 0x34b8,
-       0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x348c,
-       0x0040, 0x348c, 0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x3491,
-       0x2220, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0,
-       0x34a1, 0xa282, 0x0019, 0x00c8, 0x34a7, 0x2011, 0x0019, 0x0078,
-       0x34a7, 0xa282, 0x000c, 0x00c8, 0x34a7, 0x2011, 0x000c, 0x2200,
-       0xa502, 0x00c8, 0x34ac, 0x2228, 0x1078, 0x36ed, 0x852b, 0x852b,
-       0x1078, 0x372e, 0x0040, 0x34b8, 0x1078, 0x3531, 0x0078, 0x34bc,
-       0x1078, 0x36e9, 0x1078, 0x3558, 0x7858, 0xa085, 0x0004, 0x785a,
-       0x0c7f, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x0c7e,
-       0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x34df, 0x6010, 0xa084,
-       0x000f, 0x00c0, 0x34d9, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x0c7f,
-       0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3506, 0x68a0,
-       0xa084, 0x0200, 0x00c0, 0x34d9, 0x6208, 0xa294, 0x00ff, 0x7018,
-       0xa086, 0x0028, 0x00c0, 0x34f4, 0xa282, 0x0019, 0x00c8, 0x34fa,
-       0x2011, 0x0019, 0x0078, 0x34fa, 0xa282, 0x000c, 0x00c8, 0x34fa,
-       0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
-       0x0048, 0x3506, 0x0040, 0x3506, 0x2019, 0x000c, 0x78ab, 0x0001,
-       0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
-       0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x2960,
-       0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078,
-       0x3521, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
-       0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f,
-       0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078, 0x3538, 0x0c7f, 0x007c,
-       0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018, 0x789a, 0x7cae,
-       0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6,
-       0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204, 0x8004, 0xa084,
-       0x00ff, 0xa405, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x007c,
-       0x0c7e, 0x7054, 0x2060, 0x1078, 0x355f, 0x0c7f, 0x007c, 0x6018,
-       0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084,
-       0xfff0, 0x7886, 0x007c, 0xa282, 0x0002, 0x00c0, 0x366b, 0x7aa8,
-       0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0200, 0x0040, 0x35b4,
-       0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8,
-       0x366b, 0x1078, 0x35fd, 0x1078, 0x3558, 0xa980, 0x0001, 0x200c,
-       0x1078, 0x37b9, 0x1078, 0x34c7, 0x88ff, 0x0040, 0x35a7, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684,
-       0x0400, 0x00c0, 0x35a1, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078,
-       0x2438, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x7e58,
-       0xa684, 0x0400, 0x00c0, 0x35b0, 0x781b, 0x0058, 0x0078, 0x2438,
-       0x781b, 0x0065, 0x0078, 0x2438, 0xa282, 0x0002, 0x00c8, 0x35bc,
-       0xa284, 0x0001, 0x0040, 0x35c6, 0x7154, 0xa188, 0x0000, 0x210c,
-       0xa18c, 0x2000, 0x00c0, 0x35c6, 0x2011, 0x0000, 0x1078, 0x36db,
-       0x1078, 0x35fd, 0x1078, 0x3558, 0x7858, 0xa085, 0x0004, 0x785a,
-       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x0c7e, 0x027e,
-       0x2960, 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x35ed,
-       0x6014, 0xa084, 0x0040, 0x00c0, 0x35eb, 0xa18c, 0xffef, 0x6106,
-       0xa006, 0x0078, 0x35fa, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085,
-       0x0200, 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7054, 0x2060,
-       0x1078, 0x3604, 0x0c7f, 0x007c, 0x82ff, 0x0040, 0x3609, 0x2011,
-       0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xffbf,
-       0xa205, 0x78a6, 0x788a, 0x6016, 0x6004, 0xa084, 0xffef, 0x6006,
-       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x3622, 0x007f,
-       0x0078, 0x3625, 0x007f, 0x0078, 0x3667, 0xa684, 0x0020, 0x0040,
-       0x3667, 0x7888, 0xa084, 0x0040, 0x0040, 0x3667, 0x7bb8, 0xa384,
-       0x003f, 0x831b, 0x00c8, 0x3635, 0x8000, 0xa005, 0x0040, 0x364b,
-       0x831b, 0x00c8, 0x363e, 0x8001, 0x0040, 0x3663, 0xa684, 0x4000,
-       0x0040, 0x364b, 0x78b8, 0x801b, 0x00c8, 0x3647, 0x8000, 0xa084,
-       0x003f, 0x00c0, 0x3663, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc,
-       0x2001, 0x0001, 0xa108, 0x00c8, 0x3657, 0xa291, 0x0000, 0x79d2,
-       0x79da, 0x7ad6, 0x7ade, 0x1078, 0x49ed, 0x781b, 0x0064, 0x1078,
-       0x4872, 0x0078, 0x2438, 0x781b, 0x0064, 0x0078, 0x2438, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x1078, 0x36a3, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x1078, 0x368f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x2438, 0x6827, 0x0002, 0x1078, 0x3697, 0x78e4,
-       0xa084, 0x0030, 0x0040, 0x2461, 0x78ec, 0xa084, 0x0003, 0x0040,
-       0x2461, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x2001,
-       0x0005, 0x0078, 0x36a5, 0x2001, 0x000c, 0x0078, 0x36a5, 0x2001,
-       0x0006, 0x0078, 0x36a5, 0x2001, 0x000d, 0x0078, 0x36a5, 0x2001,
-       0x0009, 0x0078, 0x36a5, 0x2001, 0x0007, 0x789b, 0x0010, 0x78aa,
-       0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004, 0x7e5a, 0x007c,
-       0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0,
-       0x5280, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
-       0x36c9, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008,
-       0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040,
-       0x36d9, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010,
-       0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004,
-       0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab,
-       0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b,
-       0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff,
-       0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0,
-       0x2001, 0x5046, 0x2004, 0xa082, 0x0028, 0x0040, 0x3717, 0x2021,
-       0x37a0, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x371d, 0x2021,
-       0x37ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404,
-       0xa084, 0xfff0, 0xa106, 0x0040, 0x372c, 0x8420, 0x2300, 0xa210,
-       0x0070, 0x372c, 0x0078, 0x371f, 0x157f, 0x007c, 0x157e, 0x2009,
-       0x5046, 0x210c, 0xa182, 0x0032, 0x0048, 0x3742, 0x0040, 0x3746,
-       0x2009, 0x3792, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032,
-       0x0078, 0x3758, 0xa182, 0x0028, 0x0040, 0x3750, 0x2009, 0x37a0,
-       0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078, 0x3758,
-       0x2009, 0x37ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
-       0x2200, 0xa502, 0x0040, 0x3768, 0x0048, 0x3768, 0x8108, 0x2300,
-       0xa210, 0x0070, 0x3765, 0x0078, 0x3758, 0x157f, 0xa006, 0x007c,
-       0x157f, 0xa582, 0x0064, 0x00c8, 0x3777, 0x7808, 0xa085, 0x0070,
-       0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078, 0x3777, 0x78ec,
-       0xa084, 0x0300, 0x0040, 0x377f, 0x2104, 0x0078, 0x3790, 0x2104,
-       0xa09e, 0x1102, 0x00c0, 0x3790, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0005, 0x0048, 0x378f, 0x2001, 0x1201, 0x0078, 0x3790, 0x2104,
-       0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
-       0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07,
-       0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805,
-       0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202,
-       0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04,
-       0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800b,
-       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0,
-       0x5300, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x37d1,
-       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e,
-       0x2079, 0x0100, 0x2009, 0x5040, 0x2091, 0x8000, 0x2104, 0x0079,
-       0x37e1, 0x3817, 0x37eb, 0x37eb, 0x37eb, 0x37eb, 0x37eb, 0x37eb,
-       0x381b, 0x1078, 0x23ca, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
-       0x00c0, 0x37ed, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
-       0x37f4, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858, 0xa085, 0x4000,
-       0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3817, 0x0018, 0x3817,
-       0x681c, 0xa084, 0x0020, 0x00c0, 0x3815, 0x0e7e, 0x2071, 0x5040,
-       0x1078, 0x3868, 0x0e7f, 0x0078, 0x3817, 0x781b, 0x00d2, 0x2091,
-       0x8001, 0x0f7f, 0x007c, 0x1078, 0x3a42, 0x0078, 0x3817, 0x0c7e,
-       0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
-       0x5280, 0x6004, 0xa084, 0x000a, 0x00c0, 0x3852, 0x6108, 0xa194,
-       0xff00, 0x0040, 0x3852, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106,
-       0x0040, 0x3841, 0x2001, 0x0032, 0xa106, 0x0040, 0x3845, 0x0078,
-       0x3849, 0x2009, 0x0020, 0x0078, 0x384b, 0x2009, 0x003f, 0x0078,
-       0x384b, 0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0xa085,
-       0x0002, 0x6006, 0x0c7f, 0x007c, 0x781b, 0x0065, 0x0078, 0x2438,
-       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2438, 0x781b, 0x0058,
-       0x0078, 0x2438, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2438,
-       0x2009, 0x5020, 0x210c, 0xa186, 0x0000, 0x0040, 0x387c, 0xa186,
-       0x0001, 0x0040, 0x387f, 0x2009, 0x5038, 0x200b, 0x000b, 0x706f,
-       0x0001, 0x781b, 0x0048, 0x007c, 0x781b, 0x00cc, 0x007c, 0x2009,
-       0x5038, 0x200b, 0x000a, 0x007c, 0x2009, 0x5020, 0x210c, 0xa186,
-       0x0000, 0x0040, 0x389f, 0xa186, 0x0001, 0x0040, 0x3899, 0x2009,
-       0x5038, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x0078,
-       0x2438, 0x2009, 0x5038, 0x200b, 0x000a, 0x0078, 0x2438, 0x782b,
-       0x3008, 0x781b, 0x00cc, 0x0078, 0x2438, 0x781b, 0x00d2, 0x0078,
-       0x2438, 0x782b, 0x3008, 0x781b, 0x00d2, 0x0078, 0x2438, 0x781b,
-       0x0093, 0x0078, 0x2438, 0x782b, 0x3008, 0x781b, 0x0093, 0x0078,
-       0x2438, 0x6818, 0xa084, 0x8000, 0x0040, 0x38c0, 0x681b, 0x001d,
-       0x706f, 0x0001, 0x781b, 0x0048, 0x0078, 0x2438, 0x007e, 0x7830,
-       0xa084, 0x00c0, 0x00c0, 0x38dc, 0x7808, 0xa084, 0xfffc, 0x780a,
-       0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
-       0x38dc, 0x7044, 0x780a, 0xa005, 0x007f, 0x007c, 0x7044, 0xa085,
-       0x0002, 0x7046, 0x780a, 0x007c, 0x007e, 0x7830, 0xa084, 0x0040,
-       0x00c0, 0x38e5, 0x0098, 0x38f0, 0x007f, 0x789a, 0x78ac, 0x007c,
-       0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
-       0x78ec, 0xa084, 0x0021, 0x0040, 0x38ff, 0x0098, 0x38fd, 0x007f,
-       0x789a, 0x78ac, 0x007e, 0x7044, 0x780a, 0x007f, 0x007c, 0x78ec,
-       0xa084, 0x0002, 0x00c0, 0x461d, 0xa784, 0x007d, 0x00c0, 0x3913,
-       0x2700, 0x1078, 0x23ca, 0xa784, 0x0001, 0x00c0, 0x2f43, 0xa784,
-       0x0070, 0x0040, 0x3923, 0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2375,
-       0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040, 0x3930, 0x784b,
-       0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2461, 0x0078, 0x3854,
-       0xa784, 0x0004, 0x0040, 0x3963, 0x78b8, 0xa084, 0x4001, 0x0040,
-       0x3963, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2461,
-       0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0, 0x3963, 0x78c0,
-       0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00d2, 0x0078, 0x2438,
-       0x784b, 0x0008, 0x6818, 0xa084, 0x8000, 0x0040, 0x395f, 0x681b,
-       0x0015, 0xa684, 0x4000, 0x0040, 0x395f, 0x681b, 0x0007, 0x1078,
-       0x3868, 0x0078, 0x2438, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00,
-       0x681e, 0x682f, 0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x2944, 0x0018, 0x2438, 0x0078, 0x3673,
-       0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
-       0x5280, 0x2060, 0x2048, 0x7056, 0x6000, 0x705a, 0x6004, 0x705e,
-       0x2a60, 0x007c, 0x0079, 0x398c, 0x3994, 0x3995, 0x3994, 0x3997,
-       0x3994, 0x3994, 0x3994, 0x399c, 0x007c, 0x1078, 0x33c4, 0x1078,
-       0x4633, 0x7038, 0x600a, 0x007c, 0x70a0, 0xa005, 0x0040, 0x39a9,
-       0x2068, 0x1078, 0x1b45, 0x1078, 0x45b5, 0x1078, 0x45bc, 0x70a3,
-       0x0000, 0x007c, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x5040, 0x7000,
-       0xa086, 0x0007, 0x00c0, 0x39c0, 0x6110, 0x70bc, 0xa106, 0x00c0,
-       0x39c0, 0x0e7f, 0x1078, 0x1b52, 0x1078, 0x39c6, 0xa006, 0x007c,
-       0x2091, 0x8001, 0x0e7f, 0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e,
-       0x2071, 0x5040, 0x0078, 0x21d9, 0x785b, 0x0000, 0x70af, 0x000e,
-       0x2009, 0x0100, 0x017e, 0x70a0, 0xa06d, 0x0040, 0x39db, 0x70a3,
-       0x0000, 0x0078, 0x39e1, 0x70b3, 0x0000, 0x1078, 0x1b6e, 0x0040,
-       0x39e7, 0x70ac, 0x6826, 0x1078, 0x3ac2, 0x0078, 0x39db, 0x017f,
-       0x157e, 0x0c7e, 0x0d7e, 0x20a9, 0x0008, 0x2061, 0x7410, 0x6000,
-       0xa105, 0x6002, 0x601c, 0xa06d, 0x0040, 0x39ff, 0x6800, 0x601e,
-       0x1078, 0x193d, 0x6008, 0x8000, 0x600a, 0x0078, 0x39f2, 0x6018,
-       0xa06d, 0x0040, 0x3a09, 0x6800, 0x601a, 0x1078, 0x193d, 0x0078,
-       0x39ff, 0xace0, 0x0008, 0x0070, 0x3a0f, 0x0078, 0x39ef, 0x709c,
-       0xa084, 0x8000, 0x0040, 0x3a16, 0x1078, 0x3b3c, 0x0d7f, 0x0c7f,
-       0x157f, 0x007c, 0x127e, 0x2091, 0x2300, 0x6804, 0xa084, 0x000f,
-       0x0079, 0x3a22, 0x3a32, 0x3a32, 0x3a32, 0x3a32, 0x3a32, 0x3a32,
-       0x3a34, 0x3a3a, 0x3a32, 0x3a32, 0x3a32, 0x3a32, 0x3a32, 0x3a3c,
-       0x3a32, 0x3a34, 0x1078, 0x23ca, 0x1078, 0x4466, 0x1078, 0x193d,
-       0x0078, 0x3a40, 0x6827, 0x000b, 0x1078, 0x4466, 0x1078, 0x3ac2,
-       0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x0098, 0x3a5e, 0x7830,
-       0xa084, 0x00c0, 0x00c0, 0x3a5e, 0x0d7e, 0x1078, 0x45c5, 0x2d00,
-       0x682e, 0x2009, 0x0004, 0x2001, 0x0000, 0x6827, 0x0084, 0x1078,
-       0x457e, 0x1078, 0x3ac2, 0x0d7f, 0x0078, 0x3a90, 0x7948, 0xa185,
-       0x4000, 0x784a, 0x0098, 0x3a67, 0x794a, 0x0078, 0x3a4c, 0x7828,
-       0xa086, 0x1834, 0x00c0, 0x3a70, 0xa185, 0x0004, 0x0078, 0x3a77,
-       0x7828, 0xa186, 0x1814, 0x00c0, 0x3a64, 0xa185, 0x000c, 0x784a,
-       0x789b, 0x000e, 0x78ab, 0x0002, 0x7858, 0xa084, 0x00ff, 0xa085,
-       0x0400, 0x785a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x6827, 0x0002,
-       0x6827, 0x0084, 0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x457e,
-       0x127f, 0x007c, 0x0d7e, 0x6b14, 0x1078, 0x1be0, 0x0040, 0x3a9f,
-       0x2068, 0x6827, 0x0002, 0x1078, 0x3ac2, 0x0078, 0x3a94, 0x0d7f,
-       0x007c, 0x0d7e, 0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1b7e,
-       0x0040, 0x3aaf, 0x2068, 0x6827, 0x0002, 0x1078, 0x3ac2, 0x0d7f,
-       0x007c, 0x0d7e, 0x6b14, 0xa39c, 0x00ff, 0x1078, 0x1bb1, 0x0040,
-       0x3ac0, 0x2068, 0x6827, 0x0002, 0x1078, 0x3ac2, 0x0078, 0x3ab5,
-       0x0d7f, 0x007c, 0x0c7e, 0x6914, 0x1078, 0x3b33, 0x6904, 0xa18c,
-       0x00ff, 0xa186, 0x0006, 0x0040, 0x3add, 0xa186, 0x000d, 0x0040,
-       0x3afc, 0xa186, 0x0017, 0x00c0, 0x3ad9, 0x1078, 0x193d, 0x0078,
-       0x3adb, 0x1078, 0x1c55, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048,
-       0x3afa, 0x6006, 0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x3aea,
-       0xa18d, 0x8000, 0xa684, 0x0004, 0x0040, 0x3af0, 0xa18d, 0x0002,
-       0x691e, 0x6823, 0x0000, 0x7104, 0x810f, 0x6818, 0xa105, 0x681a,
-       0x0078, 0x3ad9, 0x1078, 0x23ca, 0x6018, 0xa005, 0x00c0, 0x3b0b,
-       0x6008, 0x8001, 0x0048, 0x3b0b, 0x600a, 0x601c, 0x6802, 0x2d00,
-       0x601e, 0x0078, 0x3b21, 0xac88, 0x0006, 0x2104, 0xa005, 0x0040,
-       0x3b14, 0x2008, 0x0078, 0x3b0d, 0x6802, 0x2d0a, 0x6008, 0x8001,
-       0x0048, 0x3adb, 0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0078,
-       0x3b05, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x191a,
-       0x2da0, 0x137f, 0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f,
-       0x157f, 0x0078, 0x3ad9, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003,
-       0xa080, 0x7410, 0x2060, 0x007c, 0x2019, 0x5051, 0x2304, 0xa085,
-       0x0001, 0x201a, 0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a,
-       0x007c, 0x2019, 0x5051, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019,
-       0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c,
-       0xfff8, 0x7992, 0x70b4, 0xa080, 0x00d8, 0x781a, 0x0078, 0x2438,
-       0x70a3, 0x0000, 0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000,
-       0x0018, 0x23ef, 0x1078, 0x1b6e, 0x0040, 0x3b91, 0x2009, 0x500f,
-       0x200b, 0x0000, 0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040,
-       0x3b85, 0x6827, 0x000e, 0xa084, 0x0200, 0x0040, 0x3b81, 0x6827,
-       0x0017, 0x1078, 0x3ac2, 0x0078, 0x3b60, 0x7000, 0xa086, 0x0007,
-       0x00c0, 0x3be3, 0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078,
-       0x3b98, 0x7040, 0xa086, 0x0001, 0x0040, 0x2471, 0x0078, 0x2438,
-       0x2031, 0x0000, 0x691c, 0xa184, 0x0002, 0x0040, 0x3ba1, 0xa6b5,
-       0x0004, 0xa184, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3c72,
-       0x2004, 0xa635, 0x6820, 0xa084, 0x0400, 0x0040, 0x3bb9, 0x789b,
-       0x0018, 0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5,
-       0x1000, 0x6820, 0xa084, 0x8000, 0x0040, 0x3bc5, 0xa6b5, 0x0400,
-       0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0xa684, 0x0200, 0x0040,
-       0x3bdf, 0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0040,
-       0x3bdd, 0x682c, 0xa084, 0x0001, 0x0040, 0x3bdd, 0x7888, 0xa084,
-       0x0040, 0x0040, 0x3bdd, 0xa6b5, 0x8000, 0x1078, 0x45ad, 0x7e5a,
-       0x6eb6, 0x0078, 0x45e4, 0x1078, 0x38c6, 0x00c0, 0x3c6c, 0x702c,
-       0x8004, 0x0048, 0x3bf1, 0x2019, 0x4cfd, 0x1078, 0x2255, 0x702f,
-       0x0001, 0x2011, 0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814,
-       0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x691c, 0xa184, 0x0002,
-       0x0040, 0x3c0a, 0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa,
-       0xa290, 0x0002, 0x6820, 0xa084, 0x8000, 0x0040, 0x3c18, 0xa6b5,
-       0x0400, 0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3c26,
-       0x681c, 0xa084, 0x8000, 0x00c0, 0x3c26, 0xa6b5, 0x0800, 0x6820,
-       0xa084, 0x0100, 0x0040, 0x3c26, 0xa6b5, 0x4000, 0x681c, 0xa084,
-       0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3c72, 0x2004, 0xa635,
-       0xa684, 0x0100, 0x0040, 0x3c40, 0x682c, 0xa084, 0x0001, 0x0040,
-       0x3c40, 0x7888, 0xa084, 0x0040, 0x0040, 0x3c40, 0xa6b5, 0x8000,
-       0x789b, 0x007e, 0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7882,
-       0x7aaa, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3c6c, 0x0018, 0x3c6c,
-       0x70b4, 0xa080, 0x00dd, 0x781a, 0x1078, 0x38de, 0xa684, 0x0200,
-       0x0040, 0x3c60, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x1078, 0x45ad,
-       0x2d00, 0x70a2, 0x704a, 0x6810, 0x70be, 0x7003, 0x0007, 0xad80,
-       0x000f, 0x7036, 0x0078, 0x2438, 0x1078, 0x1b45, 0x1078, 0x38de,
-       0x0078, 0x2438, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078, 0x23ca,
-       0x2300, 0x0079, 0x3c7b, 0x3c7e, 0x3c7e, 0x3c80, 0x1078, 0x23ca,
-       0x1078, 0x45bc, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
-       0x3c92, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x1b45,
-       0x0078, 0x3b60, 0x2001, 0x000a, 0x1078, 0x454c, 0x0078, 0x3b60,
-       0xa282, 0x0005, 0x0050, 0x3c9e, 0x1078, 0x23ca, 0x7000, 0xa084,
-       0x0007, 0x10c0, 0x398a, 0x1078, 0x191a, 0x00c0, 0x3cbd, 0xa684,
-       0x0004, 0x0040, 0x3caf, 0x2001, 0x2800, 0x0078, 0x3cb1, 0x2001,
-       0x0800, 0x71b4, 0xa188, 0x0091, 0x789b, 0x000e, 0x78aa, 0x2031,
-       0x0400, 0x7e5a, 0x791a, 0x0078, 0x2438, 0x6807, 0x0106, 0x680b,
-       0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0,
-       0x3cde, 0xa286, 0x0002, 0x00c0, 0x3cde, 0x78a0, 0xa005, 0x00c0,
-       0x3cde, 0xa484, 0x8000, 0x00c0, 0x3cde, 0x78e4, 0xa084, 0x0008,
-       0x0040, 0x3cde, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x40d3,
-       0x2d00, 0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824,
-       0xa084, 0x0080, 0x0040, 0x3cf0, 0x1078, 0x4180, 0x0078, 0x2438,
-       0x2300, 0x0079, 0x3cf3, 0x3cf6, 0x3d77, 0x3d96, 0x2200, 0x0079,
-       0x3cf9, 0x3cfe, 0x3d0e, 0x3d34, 0x3d40, 0x3d63, 0x2029, 0x0001,
-       0xa026, 0x2011, 0x0000, 0x1078, 0x428d, 0x0079, 0x3d07, 0x3d0c,
-       0x2438, 0x3b60, 0x3d0c, 0x3d0c, 0x1078, 0x23ca, 0x7990, 0xa18c,
-       0x0007, 0x00c0, 0x3d15, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684,
-       0x0004, 0x0040, 0x3d1d, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011,
-       0x0001, 0x1078, 0x428d, 0x0079, 0x3d25, 0x3d2a, 0x2438, 0x3b60,
-       0x3d32, 0x3d2c, 0x0078, 0x45ea, 0x70ab, 0x3d30, 0x0078, 0x2438,
-       0x0078, 0x3d2a, 0x1078, 0x23ca, 0xa684, 0x0010, 0x0040, 0x3d3e,
-       0x1078, 0x414f, 0x0040, 0x3d3e, 0x0078, 0x2438, 0x0078, 0x41bc,
-       0x6000, 0xa084, 0x0002, 0x0040, 0x3d5d, 0x70b4, 0xa080, 0x00cd,
-       0x781a, 0x0d7e, 0x1078, 0x45c5, 0x2d00, 0x682e, 0x6827, 0x0000,
-       0x1078, 0x3ac2, 0x0d7f, 0x1078, 0x193d, 0x7003, 0x0000, 0x7037,
-       0x0000, 0x704b, 0x0000, 0x0078, 0x3b60, 0xa684, 0x0004, 0x00c0,
-       0x3d63, 0x0078, 0x45ea, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3d75,
-       0x6000, 0xa084, 0x0001, 0x0040, 0x3d75, 0x70ab, 0x3d75, 0x2001,
-       0x0007, 0x1078, 0x4544, 0x0078, 0x45f0, 0x0078, 0x45ea, 0x2200,
-       0x0079, 0x3d7a, 0x3d7f, 0x3d7f, 0x3d7f, 0x3d81, 0x3d7f, 0x1078,
-       0x23ca, 0x70a7, 0x3d85, 0x0078, 0x45f6, 0x2011, 0x0018, 0x1078,
-       0x4287, 0x0079, 0x3d8b, 0x3d90, 0x2438, 0x3b60, 0x3d92, 0x3d94,
-       0x1078, 0x23ca, 0x1078, 0x23ca, 0x1078, 0x23ca, 0x2200, 0x0079,
-       0x3d99, 0x3d9e, 0x3da0, 0x3da0, 0x3d9e, 0x3d9e, 0x1078, 0x23ca,
-       0x78e4, 0xa084, 0x0008, 0x0040, 0x3db5, 0x70a7, 0x3da9, 0x0078,
-       0x45f6, 0x2011, 0x0004, 0x1078, 0x4287, 0x0079, 0x3daf, 0x3db5,
-       0x2438, 0x3b60, 0x3db5, 0x3dbf, 0x3dc3, 0x70ab, 0x3dbd, 0x2001,
-       0x0003, 0x1078, 0x4544, 0x0078, 0x45f0, 0x0078, 0x45ea, 0x70ab,
-       0x3db5, 0x0078, 0x2438, 0x70ab, 0x3dc7, 0x0078, 0x2438, 0x0078,
-       0x3dbd, 0xa282, 0x0003, 0x0050, 0x3dcf, 0x1078, 0x23ca, 0xa386,
-       0x0002, 0x00c0, 0x3de8, 0xa286, 0x0002, 0x00c0, 0x3dee, 0x78a0,
-       0xa005, 0x00c0, 0x3dee, 0xa484, 0x8000, 0x00c0, 0x3dee, 0x78e4,
-       0xa084, 0x0008, 0x0040, 0x3de8, 0xa6b5, 0x0008, 0x2019, 0x0000,
-       0xa684, 0x0008, 0x0040, 0x3dee, 0x1078, 0x412c, 0x6810, 0x70be,
-       0x7003, 0x0007, 0x2300, 0x0079, 0x3df5, 0x3df8, 0x3e25, 0x3e2d,
-       0x2200, 0x0079, 0x3dfb, 0x3e00, 0x3dfe, 0x3e19, 0x1078, 0x23ca,
-       0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x428d,
-       0x0079, 0x3e0a, 0x3e0f, 0x2438, 0x3b60, 0x3e17, 0x3e11, 0x0078,
-       0x45ea, 0x70ab, 0x3e15, 0x0078, 0x2438, 0x0078, 0x3e0f, 0x1078,
-       0x23ca, 0xa684, 0x0010, 0x0040, 0x3e23, 0x1078, 0x414f, 0x0040,
-       0x3e23, 0x0078, 0x2438, 0x0078, 0x41bc, 0x2200, 0x0079, 0x3e28,
-       0x3e2b, 0x3e2b, 0x3e2b, 0x1078, 0x23ca, 0x2200, 0x0079, 0x3e30,
-       0x3e33, 0x3e35, 0x3e35, 0x1078, 0x23ca, 0x78e4, 0xa084, 0x0008,
-       0x0040, 0x3e4a, 0x70a7, 0x3e3e, 0x0078, 0x45f6, 0x2011, 0x0004,
-       0x1078, 0x4287, 0x0079, 0x3e44, 0x3e4a, 0x2438, 0x3b60, 0x3e4a,
-       0x3e54, 0x3e58, 0x70ab, 0x3e52, 0x2001, 0x0003, 0x1078, 0x4544,
-       0x0078, 0x45f0, 0x0078, 0x45ea, 0x70ab, 0x3e4a, 0x0078, 0x2438,
-       0x70ab, 0x3e5c, 0x0078, 0x2438, 0x0078, 0x3e52, 0x2300, 0x0079,
-       0x3e61, 0x3e66, 0x3e68, 0x3e64, 0x1078, 0x23ca, 0x70a4, 0x007a,
-       0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3e70, 0x1078, 0x23ca,
-       0xa684, 0x0200, 0x0040, 0x3e7a, 0x1078, 0x45b5, 0x1078, 0x426f,
-       0x1078, 0x45bc, 0x2300, 0x0079, 0x3e7d, 0x3e80, 0x3ea4, 0x3f0a,
-       0xa286, 0x0001, 0x0040, 0x3e86, 0x1078, 0x23ca, 0xa684, 0x0200,
-       0x0040, 0x3e8e, 0x1078, 0x45b5, 0x1078, 0x45bc, 0x2001, 0x0001,
-       0x1078, 0x454c, 0x78b8, 0xa084, 0xc001, 0x0040, 0x3ea0, 0x7848,
-       0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3e9b,
-       0x7003, 0x0000, 0x0078, 0x3b60, 0x2200, 0x0079, 0x3ea7, 0x3ea9,
-       0x3eda, 0x70a7, 0x3ead, 0x0078, 0x45f6, 0x2011, 0x000d, 0x1078,
-       0x4287, 0x0079, 0x3eb3, 0x3eba, 0x2438, 0x3b60, 0x3ec2, 0x3eca,
-       0x3ed0, 0x3ed2, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x0078, 0x45e4, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x0078, 0x45e4, 0x70ab, 0x3ece, 0x0078, 0x2438, 0x0078, 0x3eba,
-       0x1078, 0x23ca, 0x70ab, 0x3ed6, 0x0078, 0x2438, 0x1078, 0x45fc,
-       0x0078, 0x2438, 0x70a7, 0x3ede, 0x0078, 0x45f6, 0x2011, 0x0012,
-       0x1078, 0x4287, 0x0079, 0x3ee4, 0x3eea, 0x2438, 0x3b60, 0x3ef6,
-       0x3efe, 0x3f04, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x70b4, 0xa080, 0x00a5, 0x781a, 0x0078, 0x2438, 0xa6b4, 0x00ff,
-       0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x45e4, 0x70ab, 0x3f02,
-       0x0078, 0x2438, 0x0078, 0x3eea, 0x70ab, 0x3f08, 0x0078, 0x2438,
-       0x0078, 0x3ef6, 0xa286, 0x0001, 0x0040, 0x3f10, 0x1078, 0x23ca,
-       0x70a7, 0x3f14, 0x0078, 0x45f6, 0x2011, 0x0015, 0x1078, 0x4287,
-       0x0079, 0x3f1a, 0x3f1f, 0x2438, 0x3b60, 0x3f2d, 0x3f39, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4,
-       0xa080, 0x00b5, 0x781a, 0x0078, 0x2438, 0xa6b4, 0x00ff, 0xa6b5,
-       0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00a5, 0x781a, 0x0078,
-       0x2438, 0x70ab, 0x3f3d, 0x0078, 0x2438, 0x0078, 0x3f1f, 0xa282,
-       0x0003, 0x0050, 0x3f45, 0x1078, 0x23ca, 0x2300, 0x0079, 0x3f48,
-       0x3f4b, 0x3f82, 0x3fdd, 0xa286, 0x0001, 0x0040, 0x3f51, 0x1078,
-       0x23ca, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x3f5e,
-       0x1078, 0x3ac2, 0x7003, 0x0000, 0x0078, 0x3b60, 0x683b, 0x0000,
-       0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x3f6c, 0x1078, 0x45b5,
-       0x1078, 0x426f, 0x1078, 0x45bc, 0x2001, 0x0001, 0x1078, 0x454c,
-       0x78b8, 0xa084, 0xc001, 0x0040, 0x3f7e, 0x7848, 0xa085, 0x0008,
-       0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3f79, 0x7003, 0x0000,
-       0x0078, 0x3b60, 0x2200, 0x0079, 0x3f85, 0x3f87, 0x3fb8, 0x70a7,
-       0x3f8b, 0x0078, 0x45f6, 0x2011, 0x000d, 0x1078, 0x4287, 0x0079,
-       0x3f91, 0x3f98, 0x2438, 0x3b60, 0x3fa0, 0x3fa8, 0x3fae, 0x3fb0,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x45e4,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x45e4,
-       0x70ab, 0x3fac, 0x0078, 0x2438, 0x0078, 0x3f98, 0x1078, 0x23ca,
-       0x70ab, 0x3fb4, 0x0078, 0x2438, 0x1078, 0x45fc, 0x0078, 0x2438,
-       0x70a7, 0x3fbc, 0x0078, 0x45f6, 0x2011, 0x0005, 0x1078, 0x4287,
-       0x0079, 0x3fc2, 0x3fc7, 0x2438, 0x3b60, 0x3fcf, 0x3fd7, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x45e4, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x45e4, 0x70ab,
-       0x3fdb, 0x0078, 0x2438, 0x0078, 0x3fc7, 0xa286, 0x0001, 0x0040,
-       0x3fe3, 0x1078, 0x23ca, 0x70a7, 0x3fe7, 0x0078, 0x45f6, 0x2011,
-       0x0006, 0x1078, 0x4287, 0x0079, 0x3fed, 0x3ff2, 0x2438, 0x3b60,
-       0x3ff8, 0x4002, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x45e4,
-       0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a,
-       0x0078, 0x45e4, 0x70ab, 0x4006, 0x0078, 0x2438, 0x0078, 0x3ff2,
-       0x2300, 0x0079, 0x400b, 0x4010, 0x400e, 0x400e, 0x1078, 0x23ca,
-       0x1078, 0x23ca, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be,
-       0xa282, 0x0003, 0x0050, 0x401e, 0x1078, 0x23ca, 0x2300, 0x0079,
-       0x4021, 0x4024, 0x4037, 0x4059, 0x82ff, 0x00c0, 0x4029, 0x1078,
-       0x23ca, 0xa684, 0x0200, 0x0040, 0x4031, 0x1078, 0x45b5, 0x1078,
-       0x45bc, 0x2001, 0x0001, 0x1078, 0x454c, 0x0078, 0x2438, 0xa296,
-       0x0002, 0x0040, 0x4040, 0x82ff, 0x0040, 0x4040, 0x1078, 0x23ca,
-       0x70a7, 0x4044, 0x0078, 0x45f6, 0x2011, 0x0018, 0x1078, 0x4287,
-       0x0079, 0x404a, 0x404f, 0x2438, 0x3b60, 0x4051, 0x4053, 0x0078,
-       0x45e4, 0x0078, 0x45e4, 0x70ab, 0x4057, 0x0078, 0x2438, 0x0078,
-       0x404f, 0x2200, 0x0079, 0x405c, 0x405e, 0x4077, 0x70a7, 0x4062,
-       0x0078, 0x45f6, 0x2011, 0x0017, 0x1078, 0x4287, 0x0079, 0x4068,
-       0x406d, 0x2438, 0x3b60, 0x406f, 0x4071, 0x0078, 0x45e4, 0x0078,
-       0x45e4, 0x70ab, 0x4075, 0x0078, 0x2438, 0x0078, 0x406d, 0xa484,
-       0x8000, 0x00c0, 0x40c1, 0xa684, 0x0100, 0x0040, 0x408b, 0x1078,
-       0x45b5, 0x1078, 0x426f, 0x1078, 0x45bc, 0x7848, 0xa085, 0x000c,
-       0x784a, 0x0078, 0x408f, 0x78d8, 0x78d2, 0x78dc, 0x78d6, 0xa6b4,
-       0xefff, 0x7e5a, 0x70a7, 0x4096, 0x0078, 0x45f6, 0x2011, 0x000d,
-       0x1078, 0x4287, 0x0079, 0x409c, 0x40a3, 0x2438, 0x3b60, 0x40a3,
-       0x40b1, 0x40b7, 0x40b9, 0xa684, 0x0100, 0x0040, 0x40af, 0x1078,
-       0x4573, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x1078, 0x45ad, 0x0078,
-       0x45e4, 0x70ab, 0x40b5, 0x0078, 0x2438, 0x0078, 0x40a3, 0x1078,
-       0x23ca, 0x70ab, 0x40bd, 0x0078, 0x2438, 0x1078, 0x45fc, 0x0078,
-       0x2438, 0x1078, 0x45bc, 0x70ab, 0x40cb, 0x2001, 0x0003, 0x1078,
-       0x4544, 0x0078, 0x45f0, 0x1078, 0x45ad, 0x682c, 0x78d2, 0x6830,
-       0x78d6, 0x0078, 0x45e4, 0x70b8, 0x6812, 0x70be, 0x8000, 0x70ba,
-       0x681b, 0x0000, 0xa684, 0x0008, 0x0040, 0x40f6, 0x157e, 0x137e,
-       0x147e, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f,
-       0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0xad80,
-       0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f, 0x157f, 0xa6c4, 0x0f00,
-       0xa684, 0x0002, 0x00c0, 0x4102, 0x692c, 0x810d, 0x810d, 0x810d,
-       0x0078, 0x410f, 0x789b, 0x0010, 0x79ac, 0x0078, 0x410f, 0x017e,
-       0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x457e, 0x017f, 0xa184,
-       0x001f, 0xa805, 0x6816, 0x1078, 0x3b33, 0x68be, 0xa684, 0x0004,
-       0x0040, 0x4120, 0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105,
-       0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008, 0x0040, 0x412a,
-       0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e, 0x137e, 0x147e, 0x6918,
-       0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x007e,
-       0xa100, 0x681a, 0x007f, 0x8000, 0x8004, 0x0040, 0x414b, 0x20a8,
-       0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80,
-       0x002b, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f, 0x007c, 0x682c,
-       0xa084, 0x0020, 0x00c0, 0x4157, 0x620c, 0x0078, 0x4158, 0x6210,
-       0x6b18, 0x2300, 0xa202, 0x0040, 0x4178, 0x2018, 0xa382, 0x000e,
-       0x0048, 0x4168, 0x0040, 0x4168, 0x2019, 0x000e, 0x0078, 0x416c,
-       0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893, 0x0000,
-       0x7ba2, 0x70b4, 0xa080, 0x008e, 0x781a, 0xa085, 0x0001, 0x007c,
-       0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006, 0x007c,
-       0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x418d, 0xa196,
-       0x000f, 0x0040, 0x418d, 0x6807, 0x0117, 0x6914, 0x1078, 0x3b33,
-       0x6100, 0x8104, 0x00c8, 0x41a8, 0x601c, 0xa005, 0x0040, 0x419c,
-       0x2001, 0x0800, 0x0078, 0x41aa, 0x0d7e, 0x6824, 0x007e, 0x1078,
-       0x45c5, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078, 0x3ac2, 0x0d7f,
-       0x2001, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820,
-       0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4,
-       0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684, 0x0002,
-       0x00c0, 0x41cf, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x001f,
-       0xa805, 0x6816, 0x1078, 0x3b33, 0x68be, 0x0078, 0x41d2, 0x6914,
-       0x1078, 0x3b33, 0x6100, 0x8104, 0x00c8, 0x421c, 0xa184, 0x0300,
-       0x0040, 0x41de, 0x6807, 0x0117, 0x0078, 0x41fc, 0x6004, 0xa005,
-       0x00c0, 0x4205, 0x6807, 0x0117, 0x601c, 0xa005, 0x00c0, 0x41f2,
-       0x0d7e, 0x1078, 0x45c5, 0x6827, 0x0034, 0x2d00, 0x682e, 0x1078,
-       0x3ac2, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x41fc, 0x2031, 0x0400,
-       0x2001, 0x2800, 0x0078, 0x4200, 0x2031, 0x0400, 0x2001, 0x0800,
-       0x71b4, 0xa188, 0x0091, 0x0078, 0x424a, 0x6018, 0xa005, 0x00c0,
-       0x41f2, 0x601c, 0xa005, 0x00c0, 0x41f2, 0x689f, 0x0000, 0x6827,
-       0x003d, 0xa684, 0x0001, 0x0040, 0x4258, 0xa6b5, 0x0800, 0x71b4,
-       0xa188, 0x00ae, 0x0078, 0x4253, 0x6807, 0x0117, 0x2031, 0x0400,
-       0x692c, 0xa18c, 0x00ff, 0xa186, 0x0012, 0x00c0, 0x422d, 0x2001,
-       0x4265, 0x2009, 0x0001, 0x0078, 0x423e, 0xa186, 0x0003, 0x00c0,
-       0x4237, 0x2001, 0x4266, 0x2009, 0x0012, 0x0078, 0x423e, 0x2001,
-       0x0200, 0x71b4, 0xa188, 0x0091, 0x0078, 0x424a, 0x1078, 0x4598,
-       0x78a3, 0x0000, 0x681c, 0xa085, 0x0040, 0x681e, 0x71b4, 0xa188,
-       0x00da, 0xa006, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820,
-       0xa085, 0x8000, 0x6822, 0x6eb6, 0x7e5a, 0x791a, 0x0078, 0x2438,
-       0x6eb6, 0x1078, 0x3ac2, 0x6810, 0x70be, 0x7003, 0x0007, 0x70a3,
-       0x0000, 0x704b, 0x0000, 0x0078, 0x2438, 0x0023, 0x0070, 0x0005,
-       0x0000, 0x0a00, 0x0000, 0x0000, 0x0025, 0x0000, 0x0000, 0x683b,
-       0x0000, 0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x4286, 0x78b8,
-       0xa08c, 0x001f, 0xa084, 0x8000, 0x0040, 0x427f, 0x8108, 0x78d8,
-       0xa100, 0x6836, 0x78dc, 0xa081, 0x0000, 0x683a, 0x007c, 0x7990,
-       0x810f, 0xa5ac, 0x0007, 0x2021, 0x0000, 0xa480, 0x0010, 0x789a,
-       0x79a8, 0xa18c, 0x00ff, 0xa184, 0x0080, 0x00c0, 0x42b5, 0xa182,
-       0x0020, 0x00c8, 0x42cf, 0xa182, 0x0012, 0x00c8, 0x4536, 0x2100,
-       0x1079, 0x42a3, 0x007c, 0x4536, 0x447e, 0x4536, 0x4536, 0x42dc,
-       0x42df, 0x4319, 0x434f, 0x4381, 0x4384, 0x4536, 0x4536, 0x433a,
-       0x43a8, 0x43e2, 0x4536, 0x4536, 0x4409, 0xa18c, 0x001f, 0x6814,
-       0xa084, 0x001f, 0xa106, 0x0040, 0x42cc, 0x70b4, 0xa080, 0x00cd,
-       0x781a, 0x2001, 0x0014, 0x1078, 0x454c, 0x1078, 0x45bc, 0x7003,
-       0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c, 0xa182,
-       0x0024, 0x00c8, 0x4536, 0xa184, 0x0003, 0x1079, 0x42a3, 0x007c,
-       0x4536, 0x4536, 0x4536, 0x4536, 0x1078, 0x4536, 0x007c, 0x2200,
-       0x0079, 0x42e2, 0x440c, 0x440c, 0x4306, 0x4306, 0x4306, 0x4306,
-       0x4306, 0x4306, 0x4306, 0x4306, 0x4304, 0x4306, 0x42fb, 0x4306,
-       0x4306, 0x4306, 0x4306, 0x4306, 0x430e, 0x4311, 0x440c, 0x4311,
-       0x4306, 0x4306, 0x4306, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x36b0,
-       0x077f, 0x0c7f, 0x0078, 0x4306, 0x1078, 0x44d1, 0x6827, 0x02b3,
-       0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x4440, 0x1078, 0x452b,
-       0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078,
-       0x4428, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
-       0x4323, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x45c5, 0x6827,
-       0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3a92, 0x1078,
-       0x4466, 0x2b68, 0x1078, 0x3ac2, 0x0d7f, 0x1078, 0x3ac2, 0x2001,
-       0x0002, 0x007c, 0x1078, 0x4466, 0x2001, 0x0017, 0x1078, 0x454c,
-       0x70a3, 0x0000, 0x2009, 0x5038, 0x200b, 0x0006, 0x70af, 0x0017,
-       0x2009, 0x0200, 0x1078, 0x39d2, 0x2001, 0x0001, 0x007c, 0x2200,
-       0x0079, 0x4352, 0x440c, 0x443d, 0x443d, 0x443d, 0x4373, 0x444d,
-       0x4379, 0x444d, 0x444d, 0x4450, 0x4450, 0x4455, 0x4455, 0x436b,
-       0x436b, 0x443d, 0x443d, 0x444d, 0x443d, 0x4379, 0x440c, 0x4379,
-       0x4379, 0x4379, 0x4379, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001,
-       0x4300, 0x0078, 0x445f, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
-       0x4440, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
-       0x4428, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079, 0x4387, 0x440c,
-       0x43a0, 0x43a0, 0x43a0, 0x43a0, 0x444d, 0x444d, 0x444d, 0x444d,
-       0x444d, 0x444d, 0x444d, 0x444d, 0x43a0, 0x43a0, 0x43a0, 0x43a0,
-       0x444d, 0x43a0, 0x43a0, 0x444d, 0x444d, 0x444d, 0x444d, 0x440c,
-       0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078, 0x4428,
-       0xa684, 0x0004, 0x00c0, 0x43bc, 0x6804, 0xa084, 0x00ff, 0xa086,
-       0x0006, 0x00c0, 0x4536, 0x1078, 0x4466, 0x6807, 0x0117, 0x1078,
-       0x3ac2, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
-       0x4536, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
-       0x43cb, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x45c5, 0x6827,
-       0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3aa1, 0x1078,
-       0x4466, 0x2b68, 0x1078, 0x3ac2, 0x0d7f, 0x1078, 0x3ac2, 0x2001,
-       0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040, 0x4536, 0x2d58,
-       0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0, 0x43f1, 0x6807,
-       0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x45c5, 0x6827, 0x0036,
-       0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ab1, 0x1078, 0x4466,
-       0x2b68, 0x1078, 0x3ac2, 0x0d7f, 0x1078, 0x3ac2, 0x2001, 0x0002,
-       0x007c, 0x1078, 0x4536, 0x007c, 0x70b4, 0xa080, 0x00cd, 0x781a,
-       0x2001, 0x0001, 0x1078, 0x454c, 0x1078, 0x45bc, 0x7003, 0x0000,
-       0x2001, 0x0002, 0x007c, 0x1078, 0x457e, 0x1078, 0x45b5, 0x1078,
-       0x426f, 0x1078, 0x4180, 0x1078, 0x45bc, 0x2001, 0x0001, 0x007c,
-       0x1078, 0x457e, 0x1078, 0x45b5, 0x1078, 0x426f, 0x70b4, 0xa080,
-       0x00cd, 0x781a, 0x2001, 0x0013, 0x1078, 0x454c, 0x1078, 0x45bc,
-       0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x4536, 0x007c,
-       0x1078, 0x457e, 0x1078, 0x45b5, 0x1078, 0x426f, 0x1078, 0x4180,
-       0x1078, 0x45bc, 0x2001, 0x0001, 0x007c, 0x2001, 0x0003, 0x007c,
-       0x1078, 0x44d1, 0x2001, 0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14,
-       0x1078, 0x36b0, 0x077f, 0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078,
-       0x457e, 0x1078, 0x4536, 0x2001, 0x0006, 0x007c, 0x6904, 0xa18c,
-       0x00ff, 0xa186, 0x0007, 0x0040, 0x4471, 0xa186, 0x000f, 0x00c0,
-       0x4475, 0x1078, 0x45b5, 0x1078, 0x426f, 0x70b4, 0xa080, 0x00cd,
-       0x781a, 0x1078, 0x45bc, 0x7003, 0x0000, 0x007c, 0x7aa8, 0xa294,
-       0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x4536,
-       0x1079, 0x448b, 0x007c, 0x4536, 0x448f, 0x4536, 0x44df, 0xa282,
-       0x0003, 0x0040, 0x4496, 0x1078, 0x4536, 0x007c, 0x7da8, 0xa5ac,
-       0x00ff, 0x7ca8, 0xa4a4, 0x00ff, 0xa482, 0x000c, 0x0048, 0x44a4,
-       0x0040, 0x44a4, 0x2021, 0x000c, 0x701c, 0xa502, 0x00c8, 0x44a9,
-       0x751c, 0x1078, 0x451c, 0x852b, 0x852b, 0x1078, 0x372e, 0x0040,
-       0x44b5, 0x1078, 0x44c3, 0x0078, 0x44b9, 0x1078, 0x4518, 0x1078,
-       0x44d1, 0xa6b5, 0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a,
-       0x2001, 0x0004, 0x007c, 0x0c7e, 0x6914, 0x810f, 0xa18c, 0x000f,
-       0x810b, 0x810b, 0x810b, 0xa1e0, 0x5280, 0x1078, 0x3538, 0x0c7f,
-       0x007c, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xa0e0, 0x5280, 0x1078, 0x355f, 0x0c7f, 0x007c, 0xa282,
-       0x0002, 0x00c0, 0x4536, 0x7aa8, 0xa294, 0x00ff, 0xa284, 0xfffe,
-       0x0040, 0x44ec, 0x2011, 0x0001, 0x1078, 0x450a, 0x1078, 0x44fc,
-       0x1078, 0x44d1, 0xa6b5, 0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9,
-       0x781a, 0x2001, 0x0004, 0x007c, 0x0c7e, 0x6814, 0x8007, 0xa084,
-       0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x5280, 0x1078, 0x3604,
-       0x0c7f, 0x007c, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0002,
-       0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab, 0x0004, 0x007c,
-       0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0018, 0x78ab, 0x0001,
-       0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081,
-       0x78ab, 0x0005, 0x007c, 0x2001, 0x0003, 0x1078, 0x4544, 0x70b4,
-       0xa080, 0x00b9, 0x781a, 0x2001, 0x0005, 0x007c, 0x2001, 0x0007,
-       0x1078, 0x4544, 0xa6b5, 0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9,
-       0x781a, 0x2001, 0x0004, 0x007c, 0x789b, 0x0018, 0x78aa, 0x789b,
-       0x0081, 0x78ab, 0x0001, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196,
-       0x0007, 0x0040, 0x455a, 0xa196, 0x000f, 0x0040, 0x455a, 0x1078,
-       0x193d, 0x007c, 0x6924, 0xa194, 0x003f, 0x00c0, 0x4563, 0xa18c,
-       0xffc0, 0xa105, 0x6826, 0x1078, 0x3ac2, 0x691c, 0xa184, 0x0100,
-       0x0040, 0x4572, 0x1078, 0x1b7e, 0x6914, 0x1078, 0x3b33, 0x6204,
-       0x8210, 0x6206, 0x007c, 0x692c, 0x6834, 0x682e, 0xa112, 0x6930,
-       0x6838, 0x6832, 0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e, 0xade0,
-       0x0018, 0x6003, 0x0070, 0x6106, 0x600b, 0x0000, 0x600f, 0x0a00,
-       0x6013, 0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f, 0x0000,
-       0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826, 0x007c,
-       0x157e, 0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0, 0x81ac,
-       0x0040, 0x45a3, 0x53a6, 0xa184, 0x0001, 0x0040, 0x45a9, 0x3304,
-       0x78be, 0x147f, 0x137f, 0x157f, 0x007c, 0x70b0, 0xa005, 0x10c0,
-       0x23ca, 0x70b3, 0x8000, 0x0078, 0x48f7, 0x71b0, 0x81ff, 0x0040,
-       0x45bb, 0x1078, 0x49ed, 0x007c, 0x71b0, 0x81ff, 0x0040, 0x45c4,
-       0x70b3, 0x0000, 0x1078, 0x4633, 0x007c, 0x0c7e, 0x0d7e, 0x1078,
-       0x191a, 0x0c7f, 0x157e, 0x137e, 0x147e, 0x2da0, 0x2c98, 0x20a9,
-       0x0031, 0x53a3, 0x147f, 0x137f, 0x157f, 0x6807, 0x010d, 0x680b,
-       0x0000, 0x7004, 0x8007, 0x681a, 0x6823, 0x0000, 0x681f, 0x0000,
-       0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4, 0xa080, 0x0091, 0x781a,
-       0x0078, 0x2438, 0x70b4, 0xa080, 0x0081, 0x781a, 0x0078, 0x2438,
-       0x70b4, 0xa080, 0x00b9, 0x781a, 0x0078, 0x2438, 0x70b4, 0xa080,
-       0x00c3, 0x781a, 0x0078, 0x2438, 0x6904, 0xa18c, 0x00ff, 0xa196,
-       0x0007, 0x0040, 0x4609, 0xa196, 0x000f, 0x0040, 0x4609, 0x6807,
-       0x0117, 0x2001, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa,
-       0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a,
-       0x71b4, 0xa188, 0x0091, 0x791a, 0x007c, 0x1078, 0x45bc, 0x7848,
-       0xa085, 0x000c, 0x784a, 0x70b4, 0xa080, 0x00cd, 0x781a, 0x2009,
-       0x000b, 0x2001, 0x4400, 0x1078, 0x457e, 0x2001, 0x0013, 0x1078,
-       0x454c, 0x0078, 0x3b60, 0x127e, 0x2091, 0x2200, 0x2049, 0x4633,
-       0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084, 0xfff7,
-       0xa205, 0x0040, 0x4645, 0x0078, 0x464a, 0x7003, 0x0000, 0x127f,
-       0x2000, 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4678, 0x7108,
-       0x8103, 0x00c8, 0x4657, 0x1078, 0x477a, 0x0078, 0x464f, 0x700c,
-       0xa08c, 0x00ff, 0x0040, 0x4678, 0x7004, 0x8004, 0x00c8, 0x466f,
-       0x7014, 0xa005, 0x00c0, 0x466b, 0x7010, 0xa005, 0x0040, 0x466f,
-       0xa102, 0x00c8, 0x464f, 0x7007, 0x0010, 0x0078, 0x4678, 0x8aff,
-       0x0040, 0x4678, 0x1078, 0x49c4, 0x00c0, 0x4672, 0x0040, 0x464f,
-       0x1078, 0x4703, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x017e,
-       0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x468b, 0xa18e,
-       0x000f, 0x00c0, 0x468e, 0x6040, 0x0078, 0x468f, 0x6428, 0x017f,
-       0x84ff, 0x0040, 0x46b9, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
-       0x46c9, 0x273c, 0x87fb, 0x00c0, 0x46a7, 0x0048, 0x46a1, 0x1078,
-       0x23ca, 0x609c, 0xa075, 0x0040, 0x46b9, 0x0078, 0x4694, 0x2704,
-       0xae68, 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0040, 0x46b9,
-       0x8738, 0x2704, 0xa005, 0x00c0, 0x46a8, 0x709c, 0xa075, 0x00c0,
-       0x4694, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015,
-       0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
-       0x0000, 0x0000, 0x46be, 0x46bb, 0x0000, 0x0000, 0x8000, 0x0000,
-       0x46be, 0x0000, 0x46c6, 0x46c3, 0x0000, 0x0000, 0x0000, 0x0000,
-       0x46c6, 0x0000, 0x46c1, 0x46c1, 0x0000, 0x0000, 0x8000, 0x0000,
-       0x46c1, 0x0000, 0x46c7, 0x46c7, 0x0000, 0x0000, 0x0000, 0x0000,
-       0x46c7, 0x127e, 0x2091, 0x2200, 0x2079, 0x5000, 0x2071, 0x0010,
-       0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020,
-       0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000,
-       0x127f, 0x2000, 0x007c, 0x2049, 0x4703, 0x2019, 0x0000, 0x7004,
-       0x8004, 0x00c8, 0x4756, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106,
-       0x00c0, 0x470d, 0xa184, 0x01e0, 0x0040, 0x4718, 0x1078, 0x23ca,
-       0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x4723, 0xa184,
-       0x4000, 0x00c0, 0x470d, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040,
-       0x4731, 0xa386, 0x0008, 0x0040, 0x473c, 0xa386, 0x200c, 0x00c0,
-       0x470d, 0x7200, 0x8204, 0x0048, 0x473c, 0x730c, 0xa384, 0x00ff,
-       0x0040, 0x473c, 0x1078, 0x23ca, 0x7007, 0x0012, 0x7000, 0xa084,
-       0x0001, 0x00c0, 0x4756, 0x7008, 0xa084, 0x01e0, 0x00c0, 0x4756,
-       0x7310, 0x7014, 0xa305, 0x0040, 0x4756, 0x710c, 0xa184, 0x0300,
-       0x00c0, 0x4756, 0xa184, 0x00ff, 0x00c0, 0x4703, 0x7007, 0x0012,
-       0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x475a, 0x7007,
-       0x0012, 0x7108, 0x8103, 0x0048, 0x475f, 0x7003, 0x0000, 0x2049,
-       0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e, 0x2091, 0x2200,
-       0x7108, 0x1078, 0x477a, 0x157f, 0x127f, 0x2091, 0x8001, 0x007f,
-       0x107f, 0x007c, 0x7204, 0x7500, 0x730c, 0xa384, 0x0300, 0x00c0,
-       0x47a1, 0xa184, 0x01e0, 0x00c0, 0x47c5, 0x7108, 0xa184, 0x01e0,
-       0x00c0, 0x47c5, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
-       0x4795, 0xa184, 0x4000, 0x00c0, 0x4785, 0xa184, 0x0007, 0x0079,
-       0x4799, 0x47a3, 0x47b5, 0x47a1, 0x47b5, 0x47a1, 0x4801, 0x47a1,
-       0x47ff, 0x1078, 0x23ca, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002,
-       0x7006, 0x8aff, 0x00c0, 0x47b0, 0x2049, 0x0000, 0x0078, 0x47b4,
-       0x1078, 0x49c4, 0x00c0, 0x47b0, 0x007c, 0x7004, 0xa084, 0x0010,
-       0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x47c0, 0x0078, 0x47c4,
-       0x1078, 0x49c4, 0x00c0, 0x47c0, 0x007c, 0x7007, 0x0012, 0x7108,
-       0x00e0, 0x47c8, 0x2091, 0x6000, 0x00e0, 0x47cc, 0x2091, 0x6000,
-       0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0,
-       0x47d4, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x47d9, 0x7003,
-       0x0000, 0x7000, 0xa005, 0x00c0, 0x47ed, 0x7004, 0xa005, 0x00c0,
-       0x47ed, 0x700c, 0xa005, 0x0040, 0x47ef, 0x0078, 0x47d0, 0x2049,
-       0x0000, 0x1078, 0x37d7, 0x6818, 0xa084, 0x8000, 0x0040, 0x47fa,
-       0x681b, 0x0002, 0x007c, 0x1078, 0x23ca, 0x1078, 0x23ca, 0x1078,
-       0x485d, 0x7210, 0x7114, 0x700c, 0xa09c, 0x00ff, 0x2800, 0xa300,
-       0xa211, 0xa189, 0x0000, 0x1078, 0x485d, 0x2704, 0x2c58, 0xac60,
-       0x6308, 0x2200, 0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305,
-       0x0040, 0x4824, 0x00c8, 0x4824, 0x8412, 0x8210, 0x830a, 0xa189,
-       0x0000, 0x2b60, 0x0078, 0x480b, 0x2b60, 0x8a07, 0x007e, 0x6004,
-       0xa084, 0x0008, 0x0040, 0x4830, 0xa7ba, 0x46c3, 0x0078, 0x4832,
-       0xa7ba, 0x46bb, 0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
-       0x6b8e, 0x7007, 0x0012, 0x1078, 0x4703, 0x007c, 0x8738, 0x2704,
-       0xa005, 0x00c0, 0x4851, 0x609c, 0xa005, 0x0040, 0x485a, 0x2060,
-       0x6004, 0xa084, 0x000f, 0xa080, 0x46c9, 0x203c, 0x87fb, 0x1040,
-       0x23ca, 0x8a51, 0x0040, 0x4859, 0x7008, 0xa084, 0x0003, 0xa086,
-       0x0003, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704,
-       0xa004, 0x00c0, 0x4871, 0x6000, 0xa064, 0x00c0, 0x4868, 0x2d60,
-       0x6004, 0xa084, 0x000f, 0xa080, 0x46d9, 0x203c, 0x87fb, 0x1040,
-       0x23ca, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884,
-       0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084,
-       0x00ff, 0x007e, 0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x488c,
-       0xa0b8, 0x46c3, 0x0078, 0x488e, 0xa0b8, 0x46bb, 0x7e08, 0xa6b5,
-       0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x489c,
-       0xa18e, 0x000f, 0x00c0, 0x48a5, 0x681c, 0xa084, 0x0040, 0x0040,
-       0x48ac, 0xa6b5, 0x0001, 0x0078, 0x48ac, 0x681c, 0xa084, 0x0040,
-       0x0040, 0x48ac, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, 0xa084,
-       0x0004, 0x00c0, 0x48ae, 0x2400, 0xa305, 0x00c0, 0x48b9, 0x0078,
-       0x48df, 0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a,
-       0x6004, 0xa301, 0x701e, 0xa184, 0x0008, 0x0040, 0x48cf, 0x6010,
-       0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208,
-       0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602,
-       0x7007, 0x0001, 0x2b60, 0x1078, 0x483e, 0x0078, 0x48e1, 0x1078,
-       0x49c4, 0x00c0, 0x48df, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
-       0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004,
-       0x00c0, 0x48ed, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e,
-       0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x48f7, 0x7007, 0x0004,
-       0x7004, 0xa084, 0x0004, 0x00c0, 0x4900, 0x7e08, 0xa6b5, 0x000c,
-       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4913, 0xa18e,
-       0x000f, 0x00c0, 0x491e, 0x681c, 0xa084, 0x0040, 0x0040, 0x491a,
-       0xa6b5, 0x0001, 0x6840, 0x2050, 0x0078, 0x4927, 0x681c, 0xa084,
-       0x0020, 0x00c0, 0x4925, 0xa6b5, 0x0001, 0x6828, 0x2050, 0x2d60,
-       0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x46c9, 0x273c, 0x87fb, 0x00c0,
-       0x493b, 0x0048, 0x4935, 0x1078, 0x23ca, 0x689c, 0xa065, 0x0040,
-       0x493f, 0x0078, 0x4928, 0x1078, 0x49c4, 0x00c0, 0x493b, 0x127f,
-       0x2000, 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, 0x2200,
-       0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c,
-       0x00ff, 0xa186, 0x0007, 0x0040, 0x4959, 0xa18e, 0x000f, 0x00c0,
-       0x4962, 0x681c, 0xa084, 0x0040, 0x0040, 0x4969, 0xa6b5, 0x0001,
-       0x0078, 0x4969, 0x681c, 0xa084, 0x0040, 0x0040, 0x4969, 0xa6b5,
-       0x0001, 0x2049, 0x4942, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186,
-       0x0007, 0x0040, 0x4977, 0xa18e, 0x000f, 0x00c0, 0x497a, 0x6840,
-       0x0078, 0x497b, 0x6828, 0x017f, 0xa055, 0x0040, 0x49c1, 0x2d70,
-       0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x46c9, 0x273c, 0x87fb,
-       0x00c0, 0x4995, 0x0048, 0x498e, 0x1078, 0x23ca, 0x709c, 0xa075,
-       0x2060, 0x0040, 0x49c1, 0x0078, 0x4981, 0x2704, 0xae68, 0x6808,
-       0xa422, 0x680c, 0xa31b, 0x0048, 0x49ae, 0x8a51, 0x00c0, 0x49a2,
-       0x1078, 0x23ca, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4996, 0x709c,
-       0xa075, 0x2060, 0x0040, 0x49c1, 0x0078, 0x4981, 0x8422, 0x8420,
-       0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
-       0xa11b, 0x00c8, 0x49bd, 0x1078, 0x23ca, 0x2071, 0x0020, 0x0078,
-       0x48ac, 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x0003, 0xa086,
-       0x0003, 0x0040, 0x49ec, 0x2704, 0xac08, 0x2104, 0x701a, 0x8108,
-       0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108, 0x2104, 0x7016,
-       0x6004, 0xa084, 0x0008, 0x0040, 0x49e3, 0x8108, 0x2104, 0x7022,
-       0x8108, 0x2104, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xa085,
-       0x0001, 0x7006, 0x1078, 0x483e, 0x007c, 0x127e, 0x007e, 0x0d7e,
-       0x2091, 0x2200, 0x2049, 0x49ed, 0x0d7f, 0x087f, 0x7108, 0xa184,
-       0x0003, 0x00c0, 0x4a17, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186,
-       0x0007, 0x0040, 0x4a07, 0xa18e, 0x000f, 0x00c0, 0x4a0a, 0x6840,
-       0x0078, 0x4a0b, 0x6828, 0x017f, 0xa005, 0x0040, 0x4a25, 0x0078,
-       0x464a, 0x0020, 0x4a17, 0x1078, 0x4801, 0x0078, 0x4a25, 0x00a0,
-       0x4a1e, 0x7108, 0x1078, 0x477a, 0x0078, 0x49f6, 0x7007, 0x0010,
-       0x00a0, 0x4a20, 0x7108, 0x1078, 0x477a, 0x7008, 0xa086, 0x0008,
-       0x00c0, 0x49f6, 0x7000, 0xa005, 0x00c0, 0x49f6, 0x7003, 0x0000,
-       0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x127e, 0x147e, 0x137e,
-       0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x4a35,
-       0xad80, 0x0011, 0x20a0, 0x2099, 0x0031, 0x700c, 0xa084, 0x00ff,
-       0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040,
-       0x4a54, 0x8000, 0x80ac, 0x53a5, 0x7007, 0x0004, 0x7004, 0xa084,
-       0x0004, 0x00c0, 0x4a56, 0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000,
-       0x157f, 0x137f, 0x147f, 0x127f, 0x2000, 0x007c, 0x2091, 0x6000,
-       0x2091, 0x8000, 0x78cc, 0xa005, 0x0040, 0x4a7d, 0x7994, 0x70d0,
-       0xa106, 0x00c0, 0x4a7d, 0x7804, 0xa005, 0x0040, 0x4a7d, 0x7807,
-       0x0000, 0x0068, 0x4a7d, 0x2091, 0x4080, 0x7820, 0x8001, 0x7822,
-       0x00c0, 0x4ad8, 0x7824, 0x7822, 0x2069, 0x5040, 0x6800, 0xa084,
-       0x0007, 0x0040, 0x4a9b, 0xa086, 0x0002, 0x0040, 0x4a9b, 0x6834,
-       0xa00d, 0x0040, 0x4a9b, 0x2104, 0xa005, 0x0040, 0x4a9b, 0x8001,
-       0x200a, 0x0040, 0x4b80, 0x7848, 0xa005, 0x0040, 0x4aa9, 0x8001,
-       0x784a, 0x00c0, 0x4aa9, 0x2009, 0x0102, 0x6844, 0x200a, 0x1078,
-       0x21b1, 0x6890, 0xa005, 0x0040, 0x4ab5, 0x8001, 0x6892, 0x00c0,
-       0x4ab5, 0x686f, 0x0000, 0x6873, 0x0001, 0x2061, 0x5300, 0x20a9,
-       0x0100, 0x2009, 0x0002, 0x6034, 0xa005, 0x0040, 0x4acb, 0x8001,
-       0x6036, 0x00c0, 0x4acb, 0x6010, 0xa005, 0x0040, 0x4acb, 0x017e,
-       0x1078, 0x21b1, 0x017f, 0xace0, 0x0010, 0x0070, 0x4ad1, 0x0078,
-       0x4abb, 0x8109, 0x0040, 0x4ad8, 0x20a9, 0x0100, 0x0078, 0x4abb,
-       0x1078, 0x4ae5, 0x1078, 0x4b0a, 0x2009, 0x5051, 0x2104, 0x2009,
-       0x0102, 0x200a, 0x2091, 0x8001, 0x007c, 0x7834, 0x8001, 0x7836,
-       0x00c0, 0x4b09, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005,
-       0x00c0, 0x4af4, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x7300,
-       0x2040, 0x2004, 0xa065, 0x0040, 0x4b09, 0x6024, 0xa005, 0x0040,
-       0x4b05, 0x8001, 0x6026, 0x0040, 0x4b39, 0x6000, 0x2c40, 0x0078,
-       0x4afa, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x4b38, 0x782c,
-       0x782a, 0x7830, 0xa005, 0x00c0, 0x4b17, 0x2001, 0x0200, 0x8001,
-       0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x5300, 0xa298,
-       0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x4b38, 0xa290, 0x0009,
-       0x2204, 0xa005, 0x0040, 0x4b30, 0x8001, 0x2012, 0x00c0, 0x4b38,
-       0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x21b1,
-       0x007c, 0x2069, 0x5040, 0x6800, 0xa005, 0x0040, 0x4b43, 0x6848,
-       0xac06, 0x0040, 0x4b80, 0x601b, 0x0006, 0x60b4, 0xa084, 0x3f00,
-       0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000,
-       0x2042, 0x6714, 0x6f82, 0x1078, 0x1956, 0x6818, 0xa005, 0x0040,
-       0x4b5b, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef, 0x680a, 0x6810,
-       0x8001, 0x00d0, 0x4b65, 0x1078, 0x23ca, 0x6812, 0x602f, 0x0000,
-       0x6033, 0x0000, 0x2c68, 0x1078, 0x1c53, 0x2069, 0x5040, 0x7944,
-       0xa184, 0x0100, 0x2001, 0x0006, 0x686e, 0x00c0, 0x4b7b, 0x6986,
-       0x2001, 0x0004, 0x686e, 0x1078, 0x21ac, 0x2091, 0x8001, 0x007c,
-       0x2069, 0x0100, 0x2009, 0x5040, 0x2104, 0xa084, 0x0007, 0x0040,
-       0x4bdc, 0xa086, 0x0007, 0x00c0, 0x4b96, 0x0d7e, 0x2009, 0x5052,
-       0x216c, 0x1078, 0x3a1a, 0x0d7f, 0x0078, 0x4bdc, 0x2009, 0x5052,
-       0x2164, 0x1078, 0x2375, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00,
-       0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f,
-       0x0000, 0x6033, 0x0000, 0x6830, 0xa084, 0x0040, 0x0040, 0x4bd0,
-       0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040,
-       0x4bbd, 0x0070, 0x4bbd, 0x0078, 0x4bb4, 0x684b, 0x0009, 0x20a9,
-       0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x4bca, 0x0070, 0x4bca,
-       0x0078, 0x4bc1, 0x20a9, 0x00fa, 0x0070, 0x4bd0, 0x0078, 0x4bcc,
-       0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2009, 0x505b,
-       0x200b, 0x0007, 0x784c, 0x784a, 0x2091, 0x8001, 0x007c, 0x2079,
-       0x5000, 0x1078, 0x4c0a, 0x1078, 0x4bee, 0x1078, 0x4bfc, 0x7833,
-       0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x0003,
-       0x2011, 0x5046, 0x2204, 0xa086, 0x003c, 0x0040, 0x4bf9, 0x2019,
-       0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0039, 0x2011, 0x5046,
-       0x2204, 0xa086, 0x003c, 0x0040, 0x4c07, 0x2019, 0x0027, 0x7b36,
-       0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011, 0x5046, 0x2204, 0xa086,
-       0x003c, 0x0040, 0x4c15, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x783f,
-       0x0000, 0x7843, 0x000a, 0x007c, 0x0020, 0x002b, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0014,
-       0x0014, 0x9849, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014,
-       0x0014, 0x0080, 0x000f, 0x0000, 0x0201, 0x0604, 0x0c08, 0x2120,
-       0x4022, 0xf880, 0x0018, 0x300b, 0xa201, 0x0014, 0xa200, 0x0014,
-       0xa200, 0x0214, 0x0000, 0x006c, 0x0002, 0x0014, 0x98d5, 0x009e,
-       0x009b, 0xa202, 0x8838, 0x3806, 0x8839, 0x20c3, 0x0864, 0x9889,
-       0x28c1, 0x9cb6, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
-       0x1856, 0x883a, 0x9865, 0x28f2, 0x9c95, 0x9858, 0x300c, 0x28e1,
-       0x9c95, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
-       0x782c, 0x786d, 0x9879, 0x282b, 0xa207, 0x64a0, 0x67a0, 0x6fc0,
-       0x1814, 0x883b, 0x7822, 0x883e, 0x987d, 0x8576, 0x8677, 0x206b,
-       0x28c1, 0x9cb6, 0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209,
-       0x2901, 0x9891, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c,
-       0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c95, 0x0014, 0xa204,
-       0xa300, 0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e,
-       0x87a9, 0x883f, 0x08e6, 0x9895, 0xf881, 0x9890, 0xc801, 0x0014,
-       0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014,
-       0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014,
-       0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a,
-       0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5,
-       0x8822, 0x0016, 0x8000, 0x2847, 0x1011, 0x98c8, 0x8000, 0xa000,
-       0x2802, 0x1011, 0x98ce, 0x9865, 0x283e, 0x1011, 0x98d2, 0xa20b,
-       0x0017, 0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98df,
-       0x0014, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d,
-       0x3806, 0x0210, 0x9cbb, 0x0704, 0x0000, 0x006c, 0x0002, 0x984f,
-       0x0014, 0x009e, 0x00a0, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211,
-       0x9cd0, 0x8772, 0x8837, 0x2101, 0x987a, 0x10d2, 0x78e2, 0x9cd3,
-       0x9859, 0xd984, 0xf0e2, 0xf0a1, 0x98cd, 0x0014, 0x8831, 0xd166,
-       0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820, 0x987a, 0x2301,
-       0x987a, 0x10d2, 0x78e4, 0x9cd3, 0x8821, 0x8820, 0x9859, 0xf123,
-       0xf142, 0xf101, 0x98c6, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c,
-       0xd99e, 0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9cd0, 0x2001,
-       0x98c5, 0x8201, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x988d,
-       0x3027, 0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cbc,
-       0x6b2a, 0x6902, 0x1834, 0x989d, 0x1814, 0x8010, 0x8592, 0x8026,
-       0x84b9, 0x7021, 0x0014, 0xa300, 0x69e1, 0x9ca9, 0x694b, 0xa213,
-       0x1462, 0xa213, 0x8000, 0x16e1, 0x98b5, 0x8023, 0x16e1, 0x8001,
-       0x10f1, 0x0016, 0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004,
-       0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217, 0x9cbc, 0x0014,
-       0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212,
-       0x9cd0, 0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a, 0x9cd3,
-       0x98c5, 0x8827, 0x300a, 0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2,
-       0x211e, 0x870e, 0xa21d, 0x0014, 0x878e, 0x0016, 0xa21c, 0x1035,
-       0x9891, 0xa210, 0xa000, 0x8010, 0x8592, 0x853b, 0xd044, 0x8022,
-       0x3807, 0x84bb, 0x98ea, 0x8021, 0x3807, 0x84b9, 0x300c, 0x817e,
-       0x872b, 0x8772, 0x9891, 0x0000, 0x0020, 0x002b, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0014,
-       0x0014, 0x9849, 0x0014, 0x0014, 0x98ea, 0x98d5, 0x0014, 0x0014,
-       0x0014, 0x0080, 0x013f, 0x0000, 0x0201, 0x0604, 0x0c08, 0x2120,
-       0x4022, 0xf880, 0x0018, 0x300b, 0xa201, 0x0014, 0xa200, 0x0014,
-       0xa200, 0x0214, 0xa202, 0x8838, 0x3806, 0x8839, 0x20c3, 0x0864,
-       0xa833, 0x28c1, 0x9cb6, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a,
-       0x8300, 0x1856, 0x883a, 0xa804, 0x28f2, 0x9c95, 0xa8f4, 0x300c,
-       0x28e1, 0x9c95, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0, 0x1814,
-       0x883b, 0x782c, 0x786d, 0xa808, 0x282b, 0xa207, 0x64a0, 0x67a0,
-       0x6fc0, 0x1814, 0x883b, 0x7822, 0x883e, 0xa802, 0x8576, 0x8677,
-       0x206b, 0x28c1, 0x9cb6, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e0,
-       0xa209, 0x2901, 0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a,
-       0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c95, 0x0014,
-       0xa204, 0xa300, 0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb,
-       0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec, 0xc801,
-       0x0014, 0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2,
-       0x0014, 0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6,
-       0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160,
-       0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011,
-       0x20d5, 0x8822, 0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc, 0x8000,
-       0xa000, 0x2802, 0x1011, 0xa8fd, 0xa893, 0x283e, 0x1011, 0xa8fd,
-       0xa20b, 0x0017, 0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210,
-       0xa801, 0x0014, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014,
-       0xa20d, 0x3806, 0x0210, 0x9cbb, 0x0704, 0x0017, 0x60ff, 0x300c,
-       0x8720, 0xa211, 0x9d6b, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d2,
-       0x78e2, 0x9d6e, 0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa86c, 0x0014,
-       0x8831, 0xd166, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820,
-       0xa80f, 0x2301, 0xa80d, 0x10d2, 0x78e4, 0x9d6e, 0x8821, 0x8820,
-       0xa8e6, 0xf123, 0xf142, 0xf101, 0xa84f, 0x10d2, 0x70f6, 0x8832,
-       0x8203, 0x870c, 0xd99e, 0x6001, 0x0014, 0x6845, 0x0214, 0xa21b,
-       0x9d6b, 0x2001, 0xa840, 0x8201, 0x1852, 0xd184, 0xd163, 0x8834,
-       0x8001, 0xa801, 0x3027, 0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218,
-       0x6981, 0x9d57, 0x6b2a, 0x6902, 0x1834, 0xa805, 0x1814, 0x8010,
-       0x8592, 0x8026, 0x84b9, 0x7021, 0x0014, 0xa300, 0x69e1, 0x9d44,
-       0x694b, 0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa80c, 0x8023,
-       0x16e1, 0x8001, 0x10f1, 0x0016, 0x6969, 0xa214, 0x61c2, 0x8002,
-       0x14e1, 0x8004, 0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217,
-       0x9d57, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x882c,
-       0x0016, 0xa212, 0x9d6b, 0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424,
-       0xcc1a, 0x9d6e, 0xa8f8, 0x8827, 0x300a, 0x0013, 0x8000, 0x84a4,
-       0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014, 0x878e, 0x0016,
-       0xa21c, 0x1035, 0xa8b4, 0xa210, 0x3807, 0x300c, 0x817e, 0x872b,
-       0x8772, 0xa8ad, 0x0000, 0x8ec6
-};
-
-#endif /* RELOAD_FIRMWARE */
-
-static const unsigned short risc_code_length01 = 0x3f14;
index caa0c3629626c3a6102d28df8164521964a228ca..5b1c12041a4fd054ffb00bed6bb9eefda1665930 100644 (file)
@@ -1,5 +1,13 @@
 /*
- * RAID Attributes
+ * raid_class.c - implementation of a simple raid visualisation class
+ *
+ * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
+ *
+ * This file is licensed under GPLv2
+ *
+ * This class is designed to allow raid attributes to be visualised and
+ * manipulated in a form independent of the underlying raid.  Ultimately this
+ * should work for both hardware and software raids.
  */
 #include <linux/init.h>
 #include <linux/module.h>
@@ -24,7 +32,7 @@ struct raid_internal {
 
 struct raid_component {
        struct list_head node;
-       struct device *dev;
+       struct class_device cdev;
        int num;
 };
 
@@ -74,11 +82,10 @@ static int raid_setup(struct transport_container *tc, struct device *dev,
 
        BUG_ON(class_get_devdata(cdev));
 
-       rd = kmalloc(sizeof(*rd), GFP_KERNEL);
+       rd = kzalloc(sizeof(*rd), GFP_KERNEL);
        if (!rd)
                return -ENOMEM;
 
-       memset(rd, 0, sizeof(*rd));
        INIT_LIST_HEAD(&rd->component_list);
        class_set_devdata(cdev, rd);
                
@@ -90,15 +97,15 @@ static int raid_remove(struct transport_container *tc, struct device *dev,
 {
        struct raid_data *rd = class_get_devdata(cdev);
        struct raid_component *rc, *next;
+       dev_printk(KERN_ERR, dev, "RAID REMOVE\n");
        class_set_devdata(cdev, NULL);
        list_for_each_entry_safe(rc, next, &rd->component_list, node) {
-               char buf[40];
-               snprintf(buf, sizeof(buf), "component-%d", rc->num);
                list_del(&rc->node);
-               sysfs_remove_link(&cdev->kobj, buf);
-               kfree(rc);
+               dev_printk(KERN_ERR, rc->cdev.dev, "RAID COMPONENT REMOVE\n");
+               class_device_unregister(&rc->cdev);
        }
-       kfree(class_get_devdata(cdev));
+       dev_printk(KERN_ERR, dev, "RAID REMOVE DONE\n");
+       kfree(rd);
        return 0;
 }
 
@@ -112,10 +119,11 @@ static struct {
        enum raid_state value;
        char            *name;
 } raid_states[] = {
-       { RAID_ACTIVE, "active" },
-       { RAID_DEGRADED, "degraded" },
-       { RAID_RESYNCING, "resyncing" },
-       { RAID_OFFLINE, "offline" },
+       { RAID_STATE_UNKNOWN, "unknown" },
+       { RAID_STATE_ACTIVE, "active" },
+       { RAID_STATE_DEGRADED, "degraded" },
+       { RAID_STATE_RESYNCING, "resyncing" },
+       { RAID_STATE_OFFLINE, "offline" },
 };
 
 static const char *raid_state_name(enum raid_state state)
@@ -132,6 +140,33 @@ static const char *raid_state_name(enum raid_state state)
        return name;
 }
 
+static struct {
+       enum raid_level value;
+       char *name;
+} raid_levels[] = {
+       { RAID_LEVEL_UNKNOWN, "unknown" },
+       { RAID_LEVEL_LINEAR, "linear" },
+       { RAID_LEVEL_0, "raid0" },
+       { RAID_LEVEL_1, "raid1" },
+       { RAID_LEVEL_3, "raid3" },
+       { RAID_LEVEL_4, "raid4" },
+       { RAID_LEVEL_5, "raid5" },
+       { RAID_LEVEL_6, "raid6" },
+};
+
+static const char *raid_level_name(enum raid_level level)
+{
+       int i;
+       char *name = NULL;
+
+       for (i = 0; i < sizeof(raid_levels)/sizeof(raid_levels[0]); i++) {
+               if (raid_levels[i].value == level) {
+                       name = raid_levels[i].name;
+                       break;
+               }
+       }
+       return name;
+}
 
 #define raid_attr_show_internal(attr, fmt, var, code)                  \
 static ssize_t raid_show_##attr(struct class_device *cdev, char *buf)  \
@@ -161,11 +196,22 @@ static CLASS_DEVICE_ATTR(attr, S_IRUGO, raid_show_##attr, NULL)
 
 #define raid_attr_ro(attr)     raid_attr_ro_internal(attr, )
 #define raid_attr_ro_fn(attr)  raid_attr_ro_internal(attr, ATTR_CODE(attr))
-#define raid_attr_ro_state(attr)       raid_attr_ro_states(attr, attr, ATTR_CODE(attr))
+#define raid_attr_ro_state(attr)       raid_attr_ro_states(attr, attr, )
+#define raid_attr_ro_state_fn(attr)    raid_attr_ro_states(attr, attr, ATTR_CODE(attr))
+
 
-raid_attr_ro(level);
+raid_attr_ro_state(level);
 raid_attr_ro_fn(resync);
-raid_attr_ro_state(state);
+raid_attr_ro_state_fn(state);
+
+static void raid_component_release(struct class_device *cdev)
+{
+       struct raid_component *rc = container_of(cdev, struct raid_component,
+                                                cdev);
+       dev_printk(KERN_ERR, rc->cdev.dev, "COMPONENT RELEASE\n");
+       put_device(rc->cdev.dev);
+       kfree(rc);
+}
 
 void raid_component_add(struct raid_template *r,struct device *raid_dev,
                        struct device *component_dev)
@@ -175,34 +221,36 @@ void raid_component_add(struct raid_template *r,struct device *raid_dev,
                                                      raid_dev);
        struct raid_component *rc;
        struct raid_data *rd = class_get_devdata(cdev);
-       char buf[40];
 
-       rc = kmalloc(sizeof(*rc), GFP_KERNEL);
+       rc = kzalloc(sizeof(*rc), GFP_KERNEL);
        if (!rc)
                return;
 
        INIT_LIST_HEAD(&rc->node);
-       rc->dev = component_dev;
+       class_device_initialize(&rc->cdev);
+       rc->cdev.release = raid_component_release;
+       rc->cdev.dev = get_device(component_dev);
        rc->num = rd->component_count++;
 
-       snprintf(buf, sizeof(buf), "component-%d", rc->num);
+       snprintf(rc->cdev.class_id, sizeof(rc->cdev.class_id),
+                "component-%d", rc->num);
        list_add_tail(&rc->node, &rd->component_list);
-       sysfs_create_link(&cdev->kobj, &component_dev->kobj, buf);
+       rc->cdev.parent = cdev;
+       rc->cdev.class = &raid_class.class;
+       class_device_add(&rc->cdev);
 }
 EXPORT_SYMBOL(raid_component_add);
 
 struct raid_template *
 raid_class_attach(struct raid_function_template *ft)
 {
-       struct raid_internal *i = kmalloc(sizeof(struct raid_internal),
+       struct raid_internal *i = kzalloc(sizeof(struct raid_internal),
                                          GFP_KERNEL);
        int count = 0;
 
        if (unlikely(!i))
                return NULL;
 
-       memset(i, 0, sizeof(*i));
-
        i->f = ft;
 
        i->r.raid_attrs.ac.class = &raid_class.class;
index 93d55233af7be493363f366d204e367a727d10a5..ab7432a5778e278a7ece69777d253911b365646e 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * sata_mv.c - Marvell SATA support
  *
- * Copyright 2005: EMC Corporation, all rights reserved. 
+ * Copyright 2005: EMC Corporation, all rights reserved.
+ * Copyright 2005 Red Hat, Inc.  All rights reserved.
  *
  * Please ALWAYS copy linux-ide@vger.kernel.org on emails.
  *
@@ -36,7 +37,7 @@
 #include <asm/io.h>
 
 #define DRV_NAME       "sata_mv"
-#define DRV_VERSION    "0.25"
+#define DRV_VERSION    "0.5"
 
 enum {
        /* BAR's are enumerated in terms of pci_resource_start() terms */
@@ -50,6 +51,9 @@ enum {
        MV_PCI_REG_BASE         = 0,
        MV_IRQ_COAL_REG_BASE    = 0x18000,      /* 6xxx part only */
        MV_SATAHC0_REG_BASE     = 0x20000,
+       MV_FLASH_CTL            = 0x1046c,
+       MV_GPIO_PORT_CTL        = 0x104f0,
+       MV_RESET_CFG            = 0x180d8,
 
        MV_PCI_REG_SZ           = MV_MAJOR_REG_AREA_SZ,
        MV_SATAHC_REG_SZ        = MV_MAJOR_REG_AREA_SZ,
@@ -72,11 +76,6 @@ enum {
        MV_SG_TBL_SZ            = (16 * MV_MAX_SG_CT),
        MV_PORT_PRIV_DMA_SZ     = (MV_CRQB_Q_SZ + MV_CRPB_Q_SZ + MV_SG_TBL_SZ),
 
-       /* Our DMA boundary is determined by an ePRD being unable to handle
-        * anything larger than 64KB
-        */
-       MV_DMA_BOUNDARY         = 0xffffU,
-
        MV_PORTS_PER_HC         = 4,
        /* == (port / MV_PORTS_PER_HC) to determine HC from 0-7 port */
        MV_PORT_HC_SHIFT        = 2,
@@ -86,16 +85,9 @@ enum {
        /* Host Flags */
        MV_FLAG_DUAL_HC         = (1 << 30),  /* two SATA Host Controllers */
        MV_FLAG_IRQ_COALESCE    = (1 << 29),  /* IRQ coalescing capability */
-       MV_FLAG_GLBL_SFT_RST    = (1 << 28),  /* Global Soft Reset support */
        MV_COMMON_FLAGS         = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                   ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO),
-       MV_6XXX_FLAGS           = (MV_FLAG_IRQ_COALESCE | 
-                                  MV_FLAG_GLBL_SFT_RST),
-
-       chip_504x               = 0,
-       chip_508x               = 1,
-       chip_604x               = 2,
-       chip_608x               = 3,
+       MV_6XXX_FLAGS           = MV_FLAG_IRQ_COALESCE,
 
        CRQB_FLAG_READ          = (1 << 0),
        CRQB_TAG_SHIFT          = 1,
@@ -116,8 +108,19 @@ enum {
        PCI_MASTER_EMPTY        = (1 << 3),
        GLOB_SFT_RST            = (1 << 4),
 
-       PCI_IRQ_CAUSE_OFS       = 0x1d58,
-       PCI_IRQ_MASK_OFS        = 0x1d5c,
+       MV_PCI_MODE             = 0xd00,
+       MV_PCI_EXP_ROM_BAR_CTL  = 0xd2c,
+       MV_PCI_DISC_TIMER       = 0xd04,
+       MV_PCI_MSI_TRIGGER      = 0xc38,
+       MV_PCI_SERR_MASK        = 0xc28,
+       MV_PCI_XBAR_TMOUT       = 0x1d04,
+       MV_PCI_ERR_LOW_ADDRESS  = 0x1d40,
+       MV_PCI_ERR_HIGH_ADDRESS = 0x1d44,
+       MV_PCI_ERR_ATTRIBUTE    = 0x1d48,
+       MV_PCI_ERR_COMMAND      = 0x1d50,
+
+       PCI_IRQ_CAUSE_OFS               = 0x1d58,
+       PCI_IRQ_MASK_OFS                = 0x1d5c,
        PCI_UNMASK_ALL_IRQS     = 0x7fffff,     /* bits 22-0 */
 
        HC_MAIN_IRQ_CAUSE_OFS   = 0x1d60,
@@ -134,7 +137,7 @@ enum {
        SELF_INT                = (1 << 23),
        TWSI_INT                = (1 << 24),
        HC_MAIN_RSVD            = (0x7f << 25), /* bits 31-25 */
-       HC_MAIN_MASKED_IRQS     = (TRAN_LO_DONE | TRAN_HI_DONE | 
+       HC_MAIN_MASKED_IRQS     = (TRAN_LO_DONE | TRAN_HI_DONE |
                                   PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT |
                                   HC_MAIN_RSVD),
 
@@ -153,6 +156,15 @@ enum {
        /* SATA registers */
        SATA_STATUS_OFS         = 0x300,  /* ctrl, err regs follow status */
        SATA_ACTIVE_OFS         = 0x350,
+       PHY_MODE3               = 0x310,
+       PHY_MODE4               = 0x314,
+       PHY_MODE2               = 0x330,
+       MV5_PHY_MODE            = 0x74,
+       MV5_LT_MODE             = 0x30,
+       MV5_PHY_CTL             = 0x0C,
+       SATA_INTERFACE_CTL      = 0x050,
+
+       MV_M2_PREAMP_MASK       = 0x7e0,
 
        /* Port registers */
        EDMA_CFG_OFS            = 0,
@@ -182,17 +194,16 @@ enum {
        EDMA_ERR_LNK_CTRL_TX    = (0x1f << 21),
        EDMA_ERR_LNK_DATA_TX    = (0x1f << 26),
        EDMA_ERR_TRANS_PROTO    = (1 << 31),
-       EDMA_ERR_FATAL          = (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR | 
+       EDMA_ERR_FATAL          = (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR |
                                   EDMA_ERR_DEV_DCON | EDMA_ERR_CRBQ_PAR |
                                   EDMA_ERR_CRPB_PAR | EDMA_ERR_INTRL_PAR |
-                                  EDMA_ERR_IORDY | EDMA_ERR_LNK_CTRL_RX_2 | 
+                                  EDMA_ERR_IORDY | EDMA_ERR_LNK_CTRL_RX_2 |
                                   EDMA_ERR_LNK_DATA_RX |
-                                  EDMA_ERR_LNK_DATA_TX | 
+                                  EDMA_ERR_LNK_DATA_TX |
                                   EDMA_ERR_TRANS_PROTO),
 
        EDMA_REQ_Q_BASE_HI_OFS  = 0x10,
        EDMA_REQ_Q_IN_PTR_OFS   = 0x14,         /* also contains BASE_LO */
-       EDMA_REQ_Q_BASE_LO_MASK = 0xfffffc00U,
 
        EDMA_REQ_Q_OUT_PTR_OFS  = 0x18,
        EDMA_REQ_Q_PTR_SHIFT    = 5,
@@ -200,7 +211,6 @@ enum {
        EDMA_RSP_Q_BASE_HI_OFS  = 0x1c,
        EDMA_RSP_Q_IN_PTR_OFS   = 0x20,
        EDMA_RSP_Q_OUT_PTR_OFS  = 0x24,         /* also contains BASE_LO */
-       EDMA_RSP_Q_BASE_LO_MASK = 0xffffff00U,
        EDMA_RSP_Q_PTR_SHIFT    = 3,
 
        EDMA_CMD_OFS            = 0x28,
@@ -208,14 +218,44 @@ enum {
        EDMA_DS                 = (1 << 1),
        ATA_RST                 = (1 << 2),
 
+       EDMA_IORDY_TMOUT        = 0x34,
+       EDMA_ARB_CFG            = 0x38,
+
        /* Host private flags (hp_flags) */
        MV_HP_FLAG_MSI          = (1 << 0),
+       MV_HP_ERRATA_50XXB0     = (1 << 1),
+       MV_HP_ERRATA_50XXB2     = (1 << 2),
+       MV_HP_ERRATA_60X1B2     = (1 << 3),
+       MV_HP_ERRATA_60X1C0     = (1 << 4),
+       MV_HP_50XX              = (1 << 5),
 
        /* Port private flags (pp_flags) */
        MV_PP_FLAG_EDMA_EN      = (1 << 0),
        MV_PP_FLAG_EDMA_DS_ACT  = (1 << 1),
 };
 
+#define IS_50XX(hpriv) ((hpriv)->hp_flags & MV_HP_50XX)
+#define IS_60XX(hpriv) (((hpriv)->hp_flags & MV_HP_50XX) == 0)
+
+enum {
+       /* Our DMA boundary is determined by an ePRD being unable to handle
+        * anything larger than 64KB
+        */
+       MV_DMA_BOUNDARY         = 0xffffU,
+
+       EDMA_REQ_Q_BASE_LO_MASK = 0xfffffc00U,
+
+       EDMA_RSP_Q_BASE_LO_MASK = 0xffffff00U,
+};
+
+enum chip_type {
+       chip_504x,
+       chip_508x,
+       chip_5080,
+       chip_604x,
+       chip_608x,
+};
+
 /* Command ReQuest Block: 32B */
 struct mv_crqb {
        u32                     sg_addr;
@@ -252,14 +292,37 @@ struct mv_port_priv {
        u32                     pp_flags;
 };
 
+struct mv_port_signal {
+       u32                     amps;
+       u32                     pre;
+};
+
+struct mv_host_priv;
+struct mv_hw_ops {
+       void (*phy_errata)(struct mv_host_priv *hpriv, void __iomem *mmio,
+                          unsigned int port);
+       void (*enable_leds)(struct mv_host_priv *hpriv, void __iomem *mmio);
+       void (*read_preamp)(struct mv_host_priv *hpriv, int idx,
+                          void __iomem *mmio);
+       int (*reset_hc)(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int n_hc);
+       void (*reset_flash)(struct mv_host_priv *hpriv, void __iomem *mmio);
+       void (*reset_bus)(struct pci_dev *pdev, void __iomem *mmio);
+};
+
 struct mv_host_priv {
        u32                     hp_flags;
+       struct mv_port_signal   signal[8];
+       const struct mv_hw_ops  *ops;
 };
 
 static void mv_irq_clear(struct ata_port *ap);
 static u32 mv_scr_read(struct ata_port *ap, unsigned int sc_reg_in);
 static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val);
+static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in);
+static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val);
 static void mv_phy_reset(struct ata_port *ap);
+static void __mv_phy_reset(struct ata_port *ap, int can_sleep);
 static void mv_host_stop(struct ata_host_set *host_set);
 static int mv_port_start(struct ata_port *ap);
 static void mv_port_stop(struct ata_port *ap);
@@ -270,6 +333,29 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
 static void mv_eng_timeout(struct ata_port *ap);
 static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 
+static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
+                          unsigned int port);
+static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio);
+static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx,
+                          void __iomem *mmio);
+static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int n_hc);
+static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio);
+static void mv5_reset_bus(struct pci_dev *pdev, void __iomem *mmio);
+
+static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
+                          unsigned int port);
+static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio);
+static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx,
+                          void __iomem *mmio);
+static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int n_hc);
+static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio);
+static void mv_reset_pci_bus(struct pci_dev *pdev, void __iomem *mmio);
+static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio,
+                            unsigned int port_no);
+static void mv_stop_and_reset(struct ata_port *ap);
+
 static struct scsi_host_template mv_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -278,7 +364,7 @@ static struct scsi_host_template mv_sht = {
        .eh_strategy_handler    = ata_scsi_error,
        .can_queue              = MV_USE_Q_DEPTH,
        .this_id                = ATA_SHT_THIS_ID,
-       .sg_tablesize           = MV_MAX_SG_CT,
+       .sg_tablesize           = MV_MAX_SG_CT / 2,
        .max_sectors            = ATA_MAX_SECTORS,
        .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
        .emulated               = ATA_SHT_EMULATED,
@@ -290,7 +376,34 @@ static struct scsi_host_template mv_sht = {
        .ordered_flush          = 1,
 };
 
-static const struct ata_port_operations mv_ops = {
+static const struct ata_port_operations mv5_ops = {
+       .port_disable           = ata_port_disable,
+
+       .tf_load                = ata_tf_load,
+       .tf_read                = ata_tf_read,
+       .check_status           = ata_check_status,
+       .exec_command           = ata_exec_command,
+       .dev_select             = ata_std_dev_select,
+
+       .phy_reset              = mv_phy_reset,
+
+       .qc_prep                = mv_qc_prep,
+       .qc_issue               = mv_qc_issue,
+
+       .eng_timeout            = mv_eng_timeout,
+
+       .irq_handler            = mv_interrupt,
+       .irq_clear              = mv_irq_clear,
+
+       .scr_read               = mv5_scr_read,
+       .scr_write              = mv5_scr_write,
+
+       .port_start             = mv_port_start,
+       .port_stop              = mv_port_stop,
+       .host_stop              = mv_host_stop,
+};
+
+static const struct ata_port_operations mv6_ops = {
        .port_disable           = ata_port_disable,
 
        .tf_load                = ata_tf_load,
@@ -322,43 +435,52 @@ static struct ata_port_info mv_port_info[] = {
                .sht            = &mv_sht,
                .host_flags     = MV_COMMON_FLAGS,
                .pio_mask       = 0x1f, /* pio0-4 */
-               .udma_mask      = 0,    /* 0x7f (udma0-6 disabled for now) */
-               .port_ops       = &mv_ops,
+               .udma_mask      = 0x7f, /* udma0-6 */
+               .port_ops       = &mv5_ops,
        },
        {  /* chip_508x */
                .sht            = &mv_sht,
                .host_flags     = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
-               .udma_mask      = 0,    /* 0x7f (udma0-6 disabled for now) */
-               .port_ops       = &mv_ops,
+               .udma_mask      = 0x7f, /* udma0-6 */
+               .port_ops       = &mv5_ops,
+       },
+       {  /* chip_5080 */
+               .sht            = &mv_sht,
+               .host_flags     = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .udma_mask      = 0x7f, /* udma0-6 */
+               .port_ops       = &mv5_ops,
        },
        {  /* chip_604x */
                .sht            = &mv_sht,
                .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
-               .port_ops       = &mv_ops,
+               .port_ops       = &mv6_ops,
        },
        {  /* chip_608x */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS | 
+               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
                                   MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
-               .port_ops       = &mv_ops,
+               .port_ops       = &mv6_ops,
        },
 };
 
-static struct pci_device_id mv_pci_tbl[] = {
+static const struct pci_device_id mv_pci_tbl[] = {
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5040), 0, 0, chip_504x},
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5041), 0, 0, chip_504x},
-       {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5080), 0, 0, chip_508x},
+       {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5080), 0, 0, chip_5080},
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5081), 0, 0, chip_508x},
 
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6040), 0, 0, chip_604x},
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6041), 0, 0, chip_604x},
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6080), 0, 0, chip_608x},
        {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6081), 0, 0, chip_608x},
+
+       {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x0241), 0, 0, chip_604x},
        {}                      /* terminate list */
 };
 
@@ -369,6 +491,24 @@ static struct pci_driver mv_pci_driver = {
        .remove                 = ata_pci_remove_one,
 };
 
+static const struct mv_hw_ops mv5xxx_ops = {
+       .phy_errata             = mv5_phy_errata,
+       .enable_leds            = mv5_enable_leds,
+       .read_preamp            = mv5_read_preamp,
+       .reset_hc               = mv5_reset_hc,
+       .reset_flash            = mv5_reset_flash,
+       .reset_bus              = mv5_reset_bus,
+};
+
+static const struct mv_hw_ops mv6xxx_ops = {
+       .phy_errata             = mv6_phy_errata,
+       .enable_leds            = mv6_enable_leds,
+       .read_preamp            = mv6_read_preamp,
+       .reset_hc               = mv6_reset_hc,
+       .reset_flash            = mv6_reset_flash,
+       .reset_bus              = mv_reset_pci_bus,
+};
+
 /*
  * Functions
  */
@@ -384,11 +524,27 @@ static inline void __iomem *mv_hc_base(void __iomem *base, unsigned int hc)
        return (base + MV_SATAHC0_REG_BASE + (hc * MV_SATAHC_REG_SZ));
 }
 
+static inline unsigned int mv_hc_from_port(unsigned int port)
+{
+       return port >> MV_PORT_HC_SHIFT;
+}
+
+static inline unsigned int mv_hardport_from_port(unsigned int port)
+{
+       return port & MV_PORT_MASK;
+}
+
+static inline void __iomem *mv_hc_base_from_port(void __iomem *base,
+                                                unsigned int port)
+{
+       return mv_hc_base(base, mv_hc_from_port(port));
+}
+
 static inline void __iomem *mv_port_base(void __iomem *base, unsigned int port)
 {
-       return (mv_hc_base(base, port >> MV_PORT_HC_SHIFT) +
-               MV_SATAHC_ARBTR_REG_SZ + 
-               ((port & MV_PORT_MASK) * MV_PORT_REG_SZ));
+       return  mv_hc_base_from_port(base, port) +
+               MV_SATAHC_ARBTR_REG_SZ +
+               (mv_hardport_from_port(port) * MV_PORT_REG_SZ);
 }
 
 static inline void __iomem *mv_ap_base(struct ata_port *ap)
@@ -396,9 +552,9 @@ static inline void __iomem *mv_ap_base(struct ata_port *ap)
        return mv_port_base(ap->host_set->mmio_base, ap->port_no);
 }
 
-static inline int mv_get_hc_count(unsigned long hp_flags)
+static inline int mv_get_hc_count(unsigned long host_flags)
 {
-       return ((hp_flags & MV_FLAG_DUAL_HC) ? 2 : 1);
+       return ((host_flags & MV_FLAG_DUAL_HC) ? 2 : 1);
 }
 
 static void mv_irq_clear(struct ata_port *ap)
@@ -450,7 +606,7 @@ static void mv_stop_dma(struct ata_port *ap)
        } else {
                assert(!(EDMA_EN & readl(port_mmio + EDMA_CMD_OFS)));
        }
-       
+
        /* now properly wait for the eDMA to stop */
        for (i = 1000; i > 0; i--) {
                reg = readl(port_mmio + EDMA_CMD_OFS);
@@ -501,7 +657,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port,
                             struct pci_dev *pdev)
 {
 #ifdef ATA_DEBUG
-       void __iomem *hc_base = mv_hc_base(mmio_base, 
+       void __iomem *hc_base = mv_hc_base(mmio_base,
                                           port >> MV_PORT_HC_SHIFT);
        void __iomem *port_base;
        int start_port, num_ports, p, start_hc, num_hcs, hc;
@@ -515,7 +671,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port,
                start_port = port;
                num_ports = num_hcs = 1;
        }
-       DPRINTK("All registers for port(s) %u-%u:\n", start_port, 
+       DPRINTK("All registers for port(s) %u-%u:\n", start_port,
                num_ports > 1 ? num_ports - 1 : start_port);
 
        if (NULL != pdev) {
@@ -582,70 +738,6 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
        }
 }
 
-/**
- *      mv_global_soft_reset - Perform the 6xxx global soft reset
- *      @mmio_base: base address of the HBA
- *
- *      This routine only applies to 6xxx parts.
- *
- *      LOCKING:
- *      Inherited from caller.
- */
-static int mv_global_soft_reset(void __iomem *mmio_base)
-{
-       void __iomem *reg = mmio_base + PCI_MAIN_CMD_STS_OFS;
-       int i, rc = 0;
-       u32 t;
-
-       /* Following procedure defined in PCI "main command and status
-        * register" table.
-        */
-       t = readl(reg);
-       writel(t | STOP_PCI_MASTER, reg);
-
-       for (i = 0; i < 1000; i++) {
-               udelay(1);
-               t = readl(reg);
-               if (PCI_MASTER_EMPTY & t) {
-                       break;
-               }
-       }
-       if (!(PCI_MASTER_EMPTY & t)) {
-               printk(KERN_ERR DRV_NAME ": PCI master won't flush\n");
-               rc = 1;
-               goto done;
-       }
-
-       /* set reset */
-       i = 5;
-       do {
-               writel(t | GLOB_SFT_RST, reg);
-               t = readl(reg);
-               udelay(1);
-       } while (!(GLOB_SFT_RST & t) && (i-- > 0));
-
-       if (!(GLOB_SFT_RST & t)) {
-               printk(KERN_ERR DRV_NAME ": can't set global reset\n");
-               rc = 1;
-               goto done;
-       }
-
-       /* clear reset and *reenable the PCI master* (not mentioned in spec) */
-       i = 5;
-       do {
-               writel(t & ~(GLOB_SFT_RST | STOP_PCI_MASTER), reg);
-               t = readl(reg);
-               udelay(1);
-       } while ((GLOB_SFT_RST & t) && (i-- > 0));
-
-       if (GLOB_SFT_RST & t) {
-               printk(KERN_ERR DRV_NAME ": can't clear global reset\n");
-               rc = 1;
-       }
-done:
-       return rc;
-}
-
 /**
  *      mv_host_stop - Host specific cleanup/stop routine.
  *      @host_set: host data structure
@@ -699,7 +791,7 @@ static int mv_port_start(struct ata_port *ap)
                goto err_out;
        memset(pp, 0, sizeof(*pp));
 
-       mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma, 
+       mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma,
                                 GFP_KERNEL);
        if (!mem)
                goto err_out_pp;
@@ -709,7 +801,7 @@ static int mv_port_start(struct ata_port *ap)
        if (rc)
                goto err_out_priv;
 
-       /* First item in chunk of DMA memory: 
+       /* First item in chunk of DMA memory:
         * 32-slot command request table (CRQB), 32 bytes each in size
         */
        pp->crqb = mem;
@@ -717,7 +809,7 @@ static int mv_port_start(struct ata_port *ap)
        mem += MV_CRQB_Q_SZ;
        mem_dma += MV_CRQB_Q_SZ;
 
-       /* Second item: 
+       /* Second item:
         * 32-slot command response table (CRPB), 8 bytes each in size
         */
        pp->crpb = mem;
@@ -731,18 +823,18 @@ static int mv_port_start(struct ata_port *ap)
        pp->sg_tbl = mem;
        pp->sg_tbl_dma = mem_dma;
 
-       writelfl(EDMA_CFG_Q_DEPTH | EDMA_CFG_RD_BRST_EXT | 
+       writelfl(EDMA_CFG_Q_DEPTH | EDMA_CFG_RD_BRST_EXT |
                 EDMA_CFG_WR_BUFF_LEN, port_mmio + EDMA_CFG_OFS);
 
        writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS);
-       writelfl(pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK, 
+       writelfl(pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK,
                 port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
 
        writelfl(0, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS);
        writelfl(0, port_mmio + EDMA_RSP_Q_IN_PTR_OFS);
 
        writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS);
-       writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK, 
+       writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK,
                 port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
 
        pp->req_producer = pp->rsp_consumer = 0;
@@ -803,20 +895,30 @@ static void mv_fill_sg(struct ata_queued_cmd *qc)
        struct scatterlist *sg;
 
        ata_for_each_sg(sg, qc) {
-               u32 sg_len;
                dma_addr_t addr;
+               u32 sg_len, len, offset;
 
                addr = sg_dma_address(sg);
                sg_len = sg_dma_len(sg);
 
-               pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
-               pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
-               assert(0 == (sg_len & ~MV_DMA_BOUNDARY));
-               pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len);
-               if (ata_sg_is_last(sg, qc))
-                       pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
+               while (sg_len) {
+                       offset = addr & MV_DMA_BOUNDARY;
+                       len = sg_len;
+                       if ((offset + sg_len) > 0x10000)
+                               len = 0x10000 - offset;
+
+                       pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
+                       pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
+                       pp->sg_tbl[i].flags_size = cpu_to_le32(len);
+
+                       sg_len -= len;
+                       addr += len;
+
+                       if (!sg_len && ata_sg_is_last(sg, qc))
+                               pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
 
-               i++;
+                       i++;
+               }
        }
 }
 
@@ -857,7 +959,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
        }
 
        /* the req producer index should be the same as we remember it */
-       assert(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >> 
+       assert(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >>
                 EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) ==
               pp->req_producer);
 
@@ -869,9 +971,9 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
        assert(MV_MAX_Q_DEPTH > qc->tag);
        flags |= qc->tag << CRQB_TAG_SHIFT;
 
-       pp->crqb[pp->req_producer].sg_addr = 
+       pp->crqb[pp->req_producer].sg_addr =
                cpu_to_le32(pp->sg_tbl_dma & 0xffffffff);
-       pp->crqb[pp->req_producer].sg_addr_hi = 
+       pp->crqb[pp->req_producer].sg_addr_hi =
                cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16);
        pp->crqb[pp->req_producer].ctrl_flags = cpu_to_le16(flags);
 
@@ -894,7 +996,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
 #ifdef LIBATA_NCQ              /* FIXME: remove this line when NCQ added */
        case ATA_CMD_FPDMA_READ:
        case ATA_CMD_FPDMA_WRITE:
-               mv_crqb_pack_cmd(cw++, tf->hob_feature, ATA_REG_FEATURE, 0); 
+               mv_crqb_pack_cmd(cw++, tf->hob_feature, ATA_REG_FEATURE, 0);
                mv_crqb_pack_cmd(cw++, tf->feature, ATA_REG_FEATURE, 0);
                break;
 #endif                         /* FIXME: remove this line when NCQ added */
@@ -960,7 +1062,7 @@ static int mv_qc_issue(struct ata_queued_cmd *qc)
               pp->req_producer);
        /* until we do queuing, the queue should be empty at this point */
        assert(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) ==
-              ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >> 
+              ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >>
                 EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK));
 
        mv_inc_q_index(&pp->req_producer);      /* now incr producer index */
@@ -997,15 +1099,15 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
        out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
 
        /* the response consumer index should be the same as we remember it */
-       assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == 
+       assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) ==
               pp->rsp_consumer);
 
        /* increment our consumer index... */
        pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer);
-       
+
        /* and, until we do NCQ, there should only be 1 CRPB waiting */
-       assert(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >> 
-                EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == 
+       assert(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >>
+                EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) ==
               pp->rsp_consumer);
 
        /* write out our inc'd consumer index so EDMA knows we're caught up */
@@ -1053,7 +1155,7 @@ static void mv_err_intr(struct ata_port *ap)
 
        /* check for fatal here and recover if needed */
        if (EDMA_ERR_FATAL & edma_err_cause) {
-               mv_phy_reset(ap);
+               mv_stop_and_reset(ap);
        }
 }
 
@@ -1118,6 +1220,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
                        handled++;
                }
 
+               if (ap &&
+                   (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))
+                       continue;
+
                err_mask = ac_err_mask(ata_status);
 
                shift = port << 1;              /* (port * 2) */
@@ -1129,14 +1235,15 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
                        err_mask |= AC_ERR_OTHER;
                        handled++;
                }
-               
+
                if (handled && ap) {
                        qc = ata_qc_from_tag(ap, ap->active_tag);
                        if (NULL != qc) {
                                VPRINTK("port %u IRQ found for qc, "
                                        "ata_status 0x%x\n", port,ata_status);
                                /* mark qc status appropriately */
-                               ata_qc_complete(qc, err_mask);
+                               if (!(qc->tf.ctl & ATA_NIEN))
+                                       ata_qc_complete(qc, err_mask);
                        }
                }
        }
@@ -1144,7 +1251,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
 }
 
 /**
- *      mv_interrupt - 
+ *      mv_interrupt -
  *      @irq: unused
  *      @dev_instance: private data; in this case the host structure
  *      @regs: unused
@@ -1154,7 +1261,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
  *      routine to handle.  Also check for PCI errors which are only
  *      reported here.
  *
- *      LOCKING: 
+ *      LOCKING:
  *      This routine holds the host_set lock while processing pending
  *      interrupts.
  */
@@ -1200,8 +1307,422 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
        return IRQ_RETVAL(handled);
 }
 
+static void __iomem *mv5_phy_base(void __iomem *mmio, unsigned int port)
+{
+       void __iomem *hc_mmio = mv_hc_base_from_port(mmio, port);
+       unsigned long ofs = (mv_hardport_from_port(port) + 1) * 0x100UL;
+
+       return hc_mmio + ofs;
+}
+
+static unsigned int mv5_scr_offset(unsigned int sc_reg_in)
+{
+       unsigned int ofs;
+
+       switch (sc_reg_in) {
+       case SCR_STATUS:
+       case SCR_ERROR:
+       case SCR_CONTROL:
+               ofs = sc_reg_in * sizeof(u32);
+               break;
+       default:
+               ofs = 0xffffffffU;
+               break;
+       }
+       return ofs;
+}
+
+static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in)
+{
+       void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no);
+       unsigned int ofs = mv5_scr_offset(sc_reg_in);
+
+       if (ofs != 0xffffffffU)
+               return readl(mmio + ofs);
+       else
+               return (u32) ofs;
+}
+
+static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
+{
+       void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no);
+       unsigned int ofs = mv5_scr_offset(sc_reg_in);
+
+       if (ofs != 0xffffffffU)
+               writelfl(val, mmio + ofs);
+}
+
+static void mv5_reset_bus(struct pci_dev *pdev, void __iomem *mmio)
+{
+       u8 rev_id;
+       int early_5080;
+
+       pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
+
+       early_5080 = (pdev->device == 0x5080) && (rev_id == 0);
+
+       if (!early_5080) {
+               u32 tmp = readl(mmio + MV_PCI_EXP_ROM_BAR_CTL);
+               tmp |= (1 << 0);
+               writel(tmp, mmio + MV_PCI_EXP_ROM_BAR_CTL);
+       }
+
+       mv_reset_pci_bus(pdev, mmio);
+}
+
+static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
+{
+       writel(0x0fcfffff, mmio + MV_FLASH_CTL);
+}
+
+static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx,
+                          void __iomem *mmio)
+{
+       void __iomem *phy_mmio = mv5_phy_base(mmio, idx);
+       u32 tmp;
+
+       tmp = readl(phy_mmio + MV5_PHY_MODE);
+
+       hpriv->signal[idx].pre = tmp & 0x1800;  /* bits 12:11 */
+       hpriv->signal[idx].amps = tmp & 0xe0;   /* bits 7:5 */
+}
+
+static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio)
+{
+       u32 tmp;
+
+       writel(0, mmio + MV_GPIO_PORT_CTL);
+
+       /* FIXME: handle MV_HP_ERRATA_50XXB2 errata */
+
+       tmp = readl(mmio + MV_PCI_EXP_ROM_BAR_CTL);
+       tmp |= ~(1 << 0);
+       writel(tmp, mmio + MV_PCI_EXP_ROM_BAR_CTL);
+}
+
+static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
+                          unsigned int port)
+{
+       void __iomem *phy_mmio = mv5_phy_base(mmio, port);
+       const u32 mask = (1<<12) | (1<<11) | (1<<7) | (1<<6) | (1<<5);
+       u32 tmp;
+       int fix_apm_sq = (hpriv->hp_flags & MV_HP_ERRATA_50XXB0);
+
+       if (fix_apm_sq) {
+               tmp = readl(phy_mmio + MV5_LT_MODE);
+               tmp |= (1 << 19);
+               writel(tmp, phy_mmio + MV5_LT_MODE);
+
+               tmp = readl(phy_mmio + MV5_PHY_CTL);
+               tmp &= ~0x3;
+               tmp |= 0x1;
+               writel(tmp, phy_mmio + MV5_PHY_CTL);
+       }
+
+       tmp = readl(phy_mmio + MV5_PHY_MODE);
+       tmp &= ~mask;
+       tmp |= hpriv->signal[port].pre;
+       tmp |= hpriv->signal[port].amps;
+       writel(tmp, phy_mmio + MV5_PHY_MODE);
+}
+
+
+#undef ZERO
+#define ZERO(reg) writel(0, port_mmio + (reg))
+static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio,
+                            unsigned int port)
+{
+       void __iomem *port_mmio = mv_port_base(mmio, port);
+
+       writelfl(EDMA_DS, port_mmio + EDMA_CMD_OFS);
+
+       mv_channel_reset(hpriv, mmio, port);
+
+       ZERO(0x028);    /* command */
+       writel(0x11f, port_mmio + EDMA_CFG_OFS);
+       ZERO(0x004);    /* timer */
+       ZERO(0x008);    /* irq err cause */
+       ZERO(0x00c);    /* irq err mask */
+       ZERO(0x010);    /* rq bah */
+       ZERO(0x014);    /* rq inp */
+       ZERO(0x018);    /* rq outp */
+       ZERO(0x01c);    /* respq bah */
+       ZERO(0x024);    /* respq outp */
+       ZERO(0x020);    /* respq inp */
+       ZERO(0x02c);    /* test control */
+       writel(0xbc, port_mmio + EDMA_IORDY_TMOUT);
+}
+#undef ZERO
+
+#define ZERO(reg) writel(0, hc_mmio + (reg))
+static void mv5_reset_one_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int hc)
+{
+       void __iomem *hc_mmio = mv_hc_base(mmio, hc);
+       u32 tmp;
+
+       ZERO(0x00c);
+       ZERO(0x010);
+       ZERO(0x014);
+       ZERO(0x018);
+
+       tmp = readl(hc_mmio + 0x20);
+       tmp &= 0x1c1c1c1c;
+       tmp |= 0x03030303;
+       writel(tmp, hc_mmio + 0x20);
+}
+#undef ZERO
+
+static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int n_hc)
+{
+       unsigned int hc, port;
+
+       for (hc = 0; hc < n_hc; hc++) {
+               for (port = 0; port < MV_PORTS_PER_HC; port++)
+                       mv5_reset_hc_port(hpriv, mmio,
+                                         (hc * MV_PORTS_PER_HC) + port);
+
+               mv5_reset_one_hc(hpriv, mmio, hc);
+       }
+
+       return 0;
+}
+
+#undef ZERO
+#define ZERO(reg) writel(0, mmio + (reg))
+static void mv_reset_pci_bus(struct pci_dev *pdev, void __iomem *mmio)
+{
+       u32 tmp;
+
+       tmp = readl(mmio + MV_PCI_MODE);
+       tmp &= 0xff00ffff;
+       writel(tmp, mmio + MV_PCI_MODE);
+
+       ZERO(MV_PCI_DISC_TIMER);
+       ZERO(MV_PCI_MSI_TRIGGER);
+       writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT);
+       ZERO(HC_MAIN_IRQ_MASK_OFS);
+       ZERO(MV_PCI_SERR_MASK);
+       ZERO(PCI_IRQ_CAUSE_OFS);
+       ZERO(PCI_IRQ_MASK_OFS);
+       ZERO(MV_PCI_ERR_LOW_ADDRESS);
+       ZERO(MV_PCI_ERR_HIGH_ADDRESS);
+       ZERO(MV_PCI_ERR_ATTRIBUTE);
+       ZERO(MV_PCI_ERR_COMMAND);
+}
+#undef ZERO
+
+static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
+{
+       u32 tmp;
+
+       mv5_reset_flash(hpriv, mmio);
+
+       tmp = readl(mmio + MV_GPIO_PORT_CTL);
+       tmp &= 0x3;
+       tmp |= (1 << 5) | (1 << 6);
+       writel(tmp, mmio + MV_GPIO_PORT_CTL);
+}
+
+/**
+ *      mv6_reset_hc - Perform the 6xxx global soft reset
+ *      @mmio: base address of the HBA
+ *
+ *      This routine only applies to 6xxx parts.
+ *
+ *      LOCKING:
+ *      Inherited from caller.
+ */
+static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
+                       unsigned int n_hc)
+{
+       void __iomem *reg = mmio + PCI_MAIN_CMD_STS_OFS;
+       int i, rc = 0;
+       u32 t;
+
+       /* Following procedure defined in PCI "main command and status
+        * register" table.
+        */
+       t = readl(reg);
+       writel(t | STOP_PCI_MASTER, reg);
+
+       for (i = 0; i < 1000; i++) {
+               udelay(1);
+               t = readl(reg);
+               if (PCI_MASTER_EMPTY & t) {
+                       break;
+               }
+       }
+       if (!(PCI_MASTER_EMPTY & t)) {
+               printk(KERN_ERR DRV_NAME ": PCI master won't flush\n");
+               rc = 1;
+               goto done;
+       }
+
+       /* set reset */
+       i = 5;
+       do {
+               writel(t | GLOB_SFT_RST, reg);
+               t = readl(reg);
+               udelay(1);
+       } while (!(GLOB_SFT_RST & t) && (i-- > 0));
+
+       if (!(GLOB_SFT_RST & t)) {
+               printk(KERN_ERR DRV_NAME ": can't set global reset\n");
+               rc = 1;
+               goto done;
+       }
+
+       /* clear reset and *reenable the PCI master* (not mentioned in spec) */
+       i = 5;
+       do {
+               writel(t & ~(GLOB_SFT_RST | STOP_PCI_MASTER), reg);
+               t = readl(reg);
+               udelay(1);
+       } while ((GLOB_SFT_RST & t) && (i-- > 0));
+
+       if (GLOB_SFT_RST & t) {
+               printk(KERN_ERR DRV_NAME ": can't clear global reset\n");
+               rc = 1;
+       }
+done:
+       return rc;
+}
+
+static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx,
+                          void __iomem *mmio)
+{
+       void __iomem *port_mmio;
+       u32 tmp;
+
+       tmp = readl(mmio + MV_RESET_CFG);
+       if ((tmp & (1 << 0)) == 0) {
+               hpriv->signal[idx].amps = 0x7 << 8;
+               hpriv->signal[idx].pre = 0x1 << 5;
+               return;
+       }
+
+       port_mmio = mv_port_base(mmio, idx);
+       tmp = readl(port_mmio + PHY_MODE2);
+
+       hpriv->signal[idx].amps = tmp & 0x700;  /* bits 10:8 */
+       hpriv->signal[idx].pre = tmp & 0xe0;    /* bits 7:5 */
+}
+
+static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio)
+{
+       writel(0x00000060, mmio + MV_GPIO_PORT_CTL);
+}
+
+static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
+                          unsigned int port)
+{
+       void __iomem *port_mmio = mv_port_base(mmio, port);
+
+       u32 hp_flags = hpriv->hp_flags;
+       int fix_phy_mode2 =
+               hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0);
+       int fix_phy_mode4 =
+               hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0);
+       u32 m2, tmp;
+
+       if (fix_phy_mode2) {
+               m2 = readl(port_mmio + PHY_MODE2);
+               m2 &= ~(1 << 16);
+               m2 |= (1 << 31);
+               writel(m2, port_mmio + PHY_MODE2);
+
+               udelay(200);
+
+               m2 = readl(port_mmio + PHY_MODE2);
+               m2 &= ~((1 << 16) | (1 << 31));
+               writel(m2, port_mmio + PHY_MODE2);
+
+               udelay(200);
+       }
+
+       /* who knows what this magic does */
+       tmp = readl(port_mmio + PHY_MODE3);
+       tmp &= ~0x7F800000;
+       tmp |= 0x2A800000;
+       writel(tmp, port_mmio + PHY_MODE3);
+
+       if (fix_phy_mode4) {
+               u32 m4;
+
+               m4 = readl(port_mmio + PHY_MODE4);
+
+               if (hp_flags & MV_HP_ERRATA_60X1B2)
+                       tmp = readl(port_mmio + 0x310);
+
+               m4 = (m4 & ~(1 << 1)) | (1 << 0);
+
+               writel(m4, port_mmio + PHY_MODE4);
+
+               if (hp_flags & MV_HP_ERRATA_60X1B2)
+                       writel(tmp, port_mmio + 0x310);
+       }
+
+       /* Revert values of pre-emphasis and signal amps to the saved ones */
+       m2 = readl(port_mmio + PHY_MODE2);
+
+       m2 &= ~MV_M2_PREAMP_MASK;
+       m2 |= hpriv->signal[port].amps;
+       m2 |= hpriv->signal[port].pre;
+       m2 &= ~(1 << 16);
+
+       writel(m2, port_mmio + PHY_MODE2);
+}
+
+static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio,
+                            unsigned int port_no)
+{
+       void __iomem *port_mmio = mv_port_base(mmio, port_no);
+
+       writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS);
+
+       if (IS_60XX(hpriv)) {
+               u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL);
+               ifctl |= (1 << 12) | (1 << 7);
+               writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL);
+       }
+
+       udelay(25);             /* allow reset propagation */
+
+       /* Spec never mentions clearing the bit.  Marvell's driver does
+        * clear the bit, however.
+        */
+       writelfl(0, port_mmio + EDMA_CMD_OFS);
+
+       hpriv->ops->phy_errata(hpriv, mmio, port_no);
+
+       if (IS_50XX(hpriv))
+               mdelay(1);
+}
+
+static void mv_stop_and_reset(struct ata_port *ap)
+{
+       struct mv_host_priv *hpriv = ap->host_set->private_data;
+       void __iomem *mmio = ap->host_set->mmio_base;
+
+       mv_stop_dma(ap);
+
+       mv_channel_reset(hpriv, mmio, ap->port_no);
+
+       __mv_phy_reset(ap, 0);
+}
+
+static inline void __msleep(unsigned int msec, int can_sleep)
+{
+       if (can_sleep)
+               msleep(msec);
+       else
+               mdelay(msec);
+}
+
 /**
- *      mv_phy_reset - Perform eDMA reset followed by COMRESET
+ *      __mv_phy_reset - Perform eDMA reset followed by COMRESET
  *      @ap: ATA channel to manipulate
  *
  *      Part of this is taken from __sata_phy_reset and modified to
@@ -1211,41 +1732,47 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
  *      Inherited from caller.  This is coded to safe to call at
  *      interrupt level, i.e. it does not sleep.
  */
-static void mv_phy_reset(struct ata_port *ap)
+static void __mv_phy_reset(struct ata_port *ap, int can_sleep)
 {
+       struct mv_port_priv *pp = ap->private_data;
+       struct mv_host_priv *hpriv = ap->host_set->private_data;
        void __iomem *port_mmio = mv_ap_base(ap);
        struct ata_taskfile tf;
        struct ata_device *dev = &ap->device[0];
        unsigned long timeout;
+       int retry = 5;
+       u32 sstatus;
 
        VPRINTK("ENTER, port %u, mmio 0x%p\n", ap->port_no, port_mmio);
 
-       mv_stop_dma(ap);
-
-       writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS);
-       udelay(25);             /* allow reset propagation */
-
-       /* Spec never mentions clearing the bit.  Marvell's driver does
-        * clear the bit, however.
-        */
-       writelfl(0, port_mmio + EDMA_CMD_OFS);
-
-       VPRINTK("S-regs after ATA_RST: SStat 0x%08x SErr 0x%08x "
+       DPRINTK("S-regs after ATA_RST: SStat 0x%08x SErr 0x%08x "
                "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS),
                mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL));
 
-       /* proceed to init communications via the scr_control reg */
+       /* Issue COMRESET via SControl */
+comreset_retry:
        scr_write_flush(ap, SCR_CONTROL, 0x301);
-       mdelay(1);
+       __msleep(1, can_sleep);
+
        scr_write_flush(ap, SCR_CONTROL, 0x300);
-       timeout = jiffies + (HZ * 1);
+       __msleep(20, can_sleep);
+
+       timeout = jiffies + msecs_to_jiffies(200);
        do {
-               mdelay(10);
-               if ((scr_read(ap, SCR_STATUS) & 0xf) != 1)
+               sstatus = scr_read(ap, SCR_STATUS) & 0x3;
+               if ((sstatus == 3) || (sstatus == 0))
                        break;
+
+               __msleep(1, can_sleep);
        } while (time_before(jiffies, timeout));
 
-       VPRINTK("S-regs after PHY wake: SStat 0x%08x SErr 0x%08x "
+       /* work around errata */
+       if (IS_60XX(hpriv) &&
+           (sstatus != 0x0) && (sstatus != 0x113) && (sstatus != 0x123) &&
+           (retry-- > 0))
+               goto comreset_retry;
+
+       DPRINTK("S-regs after PHY wake: SStat 0x%08x SErr 0x%08x "
                "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS),
                mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL));
 
@@ -1259,6 +1786,21 @@ static void mv_phy_reset(struct ata_port *ap)
        }
        ap->cbl = ATA_CBL_SATA;
 
+       /* even after SStatus reflects that device is ready,
+        * it seems to take a while for link to be fully
+        * established (and thus Status no longer 0x80/0x7F),
+        * so we poll a bit for that, here.
+        */
+       retry = 20;
+       while (1) {
+               u8 drv_stat = ata_check_status(ap);
+               if ((drv_stat != 0x80) && (drv_stat != 0x7f))
+                       break;
+               __msleep(500, can_sleep);
+               if (retry-- <= 0)
+                       break;
+       }
+
        tf.lbah = readb((void __iomem *) ap->ioaddr.lbah_addr);
        tf.lbam = readb((void __iomem *) ap->ioaddr.lbam_addr);
        tf.lbal = readb((void __iomem *) ap->ioaddr.lbal_addr);
@@ -1269,9 +1811,19 @@ static void mv_phy_reset(struct ata_port *ap)
                VPRINTK("Port disabled post-sig: No device present.\n");
                ata_port_disable(ap);
        }
+
+       writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+
+       pp->pp_flags &= ~MV_PP_FLAG_EDMA_EN;
+
        VPRINTK("EXIT\n");
 }
 
+static void mv_phy_reset(struct ata_port *ap)
+{
+       __mv_phy_reset(ap, 1);
+}
+
 /**
  *      mv_eng_timeout - Routine called by libata when SCSI times out I/O
  *      @ap: ATA channel to manipulate
@@ -1289,16 +1841,16 @@ static void mv_eng_timeout(struct ata_port *ap)
 
        printk(KERN_ERR "ata%u: Entering mv_eng_timeout\n",ap->id);
        DPRINTK("All regs @ start of eng_timeout\n");
-       mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no, 
+       mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no,
                         to_pci_dev(ap->host_set->dev));
 
        qc = ata_qc_from_tag(ap, ap->active_tag);
         printk(KERN_ERR "mmio_base %p ap %p qc %p scsi_cmnd %p &cmnd %p\n",
-              ap->host_set->mmio_base, ap, qc, qc->scsicmd, 
+              ap->host_set->mmio_base, ap, qc, qc->scsicmd,
               &qc->scsicmd->cmnd);
 
        mv_err_intr(ap);
-       mv_phy_reset(ap);
+       mv_stop_and_reset(ap);
 
        if (!qc) {
                printk(KERN_ERR "ata%u: BUG: timeout without command\n",
@@ -1334,17 +1886,17 @@ static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
        unsigned long shd_base = (unsigned long) port_mmio + SHD_BLK_OFS;
        unsigned serr_ofs;
 
-       /* PIO related setup 
+       /* PIO related setup
         */
        port->data_addr = shd_base + (sizeof(u32) * ATA_REG_DATA);
-       port->error_addr = 
+       port->error_addr =
                port->feature_addr = shd_base + (sizeof(u32) * ATA_REG_ERR);
        port->nsect_addr = shd_base + (sizeof(u32) * ATA_REG_NSECT);
        port->lbal_addr = shd_base + (sizeof(u32) * ATA_REG_LBAL);
        port->lbam_addr = shd_base + (sizeof(u32) * ATA_REG_LBAM);
        port->lbah_addr = shd_base + (sizeof(u32) * ATA_REG_LBAH);
        port->device_addr = shd_base + (sizeof(u32) * ATA_REG_DEVICE);
-       port->status_addr = 
+       port->status_addr =
                port->command_addr = shd_base + (sizeof(u32) * ATA_REG_STATUS);
        /* special case: control/altstatus doesn't have ATA_REG_ address */
        port->altstatus_addr = port->ctl_addr = shd_base + SHD_CTL_AST_OFS;
@@ -1360,14 +1912,92 @@ static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
        /* unmask all EDMA error interrupts */
        writelfl(~0, port_mmio + EDMA_ERR_IRQ_MASK_OFS);
 
-       VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n", 
+       VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n",
                readl(port_mmio + EDMA_CFG_OFS),
                readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS),
                readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS));
 }
 
+static int mv_chip_id(struct pci_dev *pdev, struct mv_host_priv *hpriv,
+                     unsigned int board_idx)
+{
+       u8 rev_id;
+       u32 hp_flags = hpriv->hp_flags;
+
+       pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
+
+       switch(board_idx) {
+       case chip_5080:
+               hpriv->ops = &mv5xxx_ops;
+               hp_flags |= MV_HP_50XX;
+
+               switch (rev_id) {
+               case 0x1:
+                       hp_flags |= MV_HP_ERRATA_50XXB0;
+                       break;
+               case 0x3:
+                       hp_flags |= MV_HP_ERRATA_50XXB2;
+                       break;
+               default:
+                       dev_printk(KERN_WARNING, &pdev->dev,
+                          "Applying 50XXB2 workarounds to unknown rev\n");
+                       hp_flags |= MV_HP_ERRATA_50XXB2;
+                       break;
+               }
+               break;
+
+       case chip_504x:
+       case chip_508x:
+               hpriv->ops = &mv5xxx_ops;
+               hp_flags |= MV_HP_50XX;
+
+               switch (rev_id) {
+               case 0x0:
+                       hp_flags |= MV_HP_ERRATA_50XXB0;
+                       break;
+               case 0x3:
+                       hp_flags |= MV_HP_ERRATA_50XXB2;
+                       break;
+               default:
+                       dev_printk(KERN_WARNING, &pdev->dev,
+                          "Applying B2 workarounds to unknown rev\n");
+                       hp_flags |= MV_HP_ERRATA_50XXB2;
+                       break;
+               }
+               break;
+
+       case chip_604x:
+       case chip_608x:
+               hpriv->ops = &mv6xxx_ops;
+
+               switch (rev_id) {
+               case 0x7:
+                       hp_flags |= MV_HP_ERRATA_60X1B2;
+                       break;
+               case 0x9:
+                       hp_flags |= MV_HP_ERRATA_60X1C0;
+                       break;
+               default:
+                       dev_printk(KERN_WARNING, &pdev->dev,
+                                  "Applying B2 workarounds to unknown rev\n");
+                       hp_flags |= MV_HP_ERRATA_60X1B2;
+                       break;
+               }
+               break;
+
+       default:
+               printk(KERN_ERR DRV_NAME ": BUG: invalid board index %u\n", board_idx);
+               return 1;
+       }
+
+       hpriv->hp_flags = hp_flags;
+
+       return 0;
+}
+
 /**
- *      mv_host_init - Perform some early initialization of the host.
+ *      mv_init_host - Perform some early initialization of the host.
+ *     @pdev: host PCI device
  *      @probe_ent: early data struct representing the host
  *
  *      If possible, do an early global reset of the host.  Then do
@@ -1376,23 +2006,48 @@ static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
  *      LOCKING:
  *      Inherited from caller.
  */
-static int mv_host_init(struct ata_probe_ent *probe_ent)
+static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent,
+                       unsigned int board_idx)
 {
        int rc = 0, n_hc, port, hc;
        void __iomem *mmio = probe_ent->mmio_base;
-       void __iomem *port_mmio;
+       struct mv_host_priv *hpriv = probe_ent->private_data;
 
-       if ((MV_FLAG_GLBL_SFT_RST & probe_ent->host_flags) && 
-           mv_global_soft_reset(probe_ent->mmio_base)) {
-               rc = 1;
+       /* global interrupt mask */
+       writel(0, mmio + HC_MAIN_IRQ_MASK_OFS);
+
+       rc = mv_chip_id(pdev, hpriv, board_idx);
+       if (rc)
                goto done;
-       }
 
        n_hc = mv_get_hc_count(probe_ent->host_flags);
        probe_ent->n_ports = MV_PORTS_PER_HC * n_hc;
 
+       for (port = 0; port < probe_ent->n_ports; port++)
+               hpriv->ops->read_preamp(hpriv, port, mmio);
+
+       rc = hpriv->ops->reset_hc(hpriv, mmio, n_hc);
+       if (rc)
+               goto done;
+
+       hpriv->ops->reset_flash(hpriv, mmio);
+       hpriv->ops->reset_bus(pdev, mmio);
+       hpriv->ops->enable_leds(hpriv, mmio);
+
        for (port = 0; port < probe_ent->n_ports; port++) {
-               port_mmio = mv_port_base(mmio, port);
+               if (IS_60XX(hpriv)) {
+                       void __iomem *port_mmio = mv_port_base(mmio, port);
+
+                       u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL);
+                       ifctl |= (1 << 12);
+                       writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL);
+               }
+
+               hpriv->ops->phy_errata(hpriv, mmio, port);
+       }
+
+       for (port = 0; port < probe_ent->n_ports; port++) {
+               void __iomem *port_mmio = mv_port_base(mmio, port);
                mv_port_init(&probe_ent->port[port], port_mmio);
        }
 
@@ -1416,11 +2071,12 @@ static int mv_host_init(struct ata_probe_ent *probe_ent)
        writelfl(~HC_MAIN_MASKED_IRQS, mmio + HC_MAIN_IRQ_MASK_OFS);
 
        VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x "
-               "PCI int cause/mask=0x%08x/0x%08x\n", 
+               "PCI int cause/mask=0x%08x/0x%08x\n",
                readl(mmio + HC_MAIN_IRQ_CAUSE_OFS),
                readl(mmio + HC_MAIN_IRQ_MASK_OFS),
                readl(mmio + PCI_IRQ_CAUSE_OFS),
                readl(mmio + PCI_IRQ_MASK_OFS));
+
 done:
        return rc;
 }
@@ -1456,7 +2112,7 @@ static void mv_print_info(struct ata_probe_ent *probe_ent)
 
        dev_printk(KERN_INFO, &pdev->dev,
               "%u slots %u ports %s mode IRQ via %s\n",
-              (unsigned)MV_MAX_Q_DEPTH, probe_ent->n_ports, 
+              (unsigned)MV_MAX_Q_DEPTH, probe_ent->n_ports,
               scc_s, (MV_HP_FLAG_MSI & hpriv->hp_flags) ? "MSI" : "INTx");
 }
 
@@ -1526,7 +2182,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        probe_ent->private_data = hpriv;
 
        /* initialize adapter */
-       rc = mv_host_init(probe_ent);
+       rc = mv_init_host(pdev, probe_ent, board_idx);
        if (rc) {
                goto err_out_hpriv;
        }
index 37a4fae95ed4ffe738dd5412ca240f6506d6eafa..4954896dfdb9bb5026fa7401fd436f5d74014e81 100644 (file)
@@ -137,7 +137,7 @@ enum nv_host_type
        CK804
 };
 
-static struct pci_device_id nv_pci_tbl[] = {
+static const struct pci_device_id nv_pci_tbl[] = {
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE2 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,
index 9edc9d91efc3b73c970e710f228caa09d13df3ca..8a8e3e3ef0ed3bbaebe61e9713cfaab005f47820 100644 (file)
@@ -46,7 +46,7 @@
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
-#define DRV_VERSION    "1.02"
+#define DRV_VERSION    "1.03"
 
 
 enum {
@@ -193,7 +193,7 @@ static struct ata_port_info pdc_port_info[] = {
        },
 };
 
-static struct pci_device_id pdc_ata_pci_tbl[] = {
+static const struct pci_device_id pdc_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PROMISE, 0x3371, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_2037x },
        { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
index d274ab2357812924a1beb7aad481112cd17dcd4b..a8987f5ff5ccac5fac723cfc1138fd033bdf8422 100644 (file)
@@ -41,7 +41,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_qstor"
-#define DRV_VERSION    "0.04"
+#define DRV_VERSION    "0.05"
 
 enum {
        QS_PORTS                = 4,
@@ -184,7 +184,7 @@ static struct ata_port_info qs_port_info[] = {
        },
 };
 
-static struct pci_device_id qs_ata_pci_tbl[] = {
+static const struct pci_device_id qs_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PDC, 0x2068, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_2068_idx },
 
@@ -268,7 +268,7 @@ static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
        writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
 }
 
-static void qs_fill_sg(struct ata_queued_cmd *qc)
+static unsigned int qs_fill_sg(struct ata_queued_cmd *qc)
 {
        struct scatterlist *sg;
        struct ata_port *ap = qc->ap;
@@ -296,6 +296,8 @@ static void qs_fill_sg(struct ata_queued_cmd *qc)
                                        (unsigned long long)addr, len);
                nelem++;
        }
+
+       return nelem;
 }
 
 static void qs_qc_prep(struct ata_queued_cmd *qc)
@@ -304,6 +306,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
        u8 dflags = QS_DF_PORD, *buf = pp->pkt;
        u8 hflags = QS_HF_DAT | QS_HF_IEN | QS_HF_VLD;
        u64 addr;
+       unsigned int nelem;
 
        VPRINTK("ENTER\n");
 
@@ -313,7 +316,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
                return;
        }
 
-       qs_fill_sg(qc);
+       nelem = qs_fill_sg(qc);
 
        if ((qc->tf.flags & ATA_TFLAG_WRITE))
                hflags |= QS_HF_DIRO;
@@ -324,7 +327,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
        buf[ 0] = QS_HCB_HDR;
        buf[ 1] = hflags;
        *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE);
-       *(__le32 *)(&buf[ 8]) = cpu_to_le32(qc->n_elem);
+       *(__le32 *)(&buf[ 8]) = cpu_to_le32(nelem);
        addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES;
        *(__le64 *)(&buf[16]) = cpu_to_le64(addr);
 
index d0e3c3c6c25f4e6b107cda45055bf978b88ea233..36091868560dca76686d1e4a32aa7b5af78d0263 100644 (file)
@@ -87,7 +87,7 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static void sil_post_set_mode (struct ata_port *ap);
 
 
-static struct pci_device_id sil_pci_tbl[] = {
+static const struct pci_device_id sil_pci_tbl[] = {
        { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w },
        { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w },
        { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
index 4682a50650b4914e0b219d46ba90cbb4e998c229..e0d6f194f54f50217b047083300c32133b35e18e 100644 (file)
@@ -5,17 +5,6 @@
  *
  * Based on preview driver from Silicon Image.
  *
- * NOTE: No NCQ/ATAPI support yet.  The preview driver didn't support
- * NCQ nor ATAPI, and, unfortunately, I couldn't find out how to make
- * those work.  Enabling those shouldn't be difficult.  Basic
- * structure is all there (in libata-dev tree).  If you have any
- * information about this hardware, please contact me or linux-ide.
- * Info is needed on...
- *
- * - How to issue tagged commands and turn on sactive on issue accordingly.
- * - Where to put an ATAPI command and how to tell the device to send it.
- * - How to enable/use 64bit.
- *
  * 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, or (at your option) any
@@ -42,7 +31,7 @@
 #include <asm/io.h>
 
 #define DRV_NAME       "sata_sil24"
-#define DRV_VERSION    "0.22"  /* Silicon Image's preview driver was 0.10 */
+#define DRV_VERSION    "0.23"
 
 /*
  * Port request block (PRB) 32 bytes
@@ -139,6 +128,7 @@ enum {
        PORT_CS_DEV_RST         = (1 << 1), /* device reset */
        PORT_CS_INIT            = (1 << 2), /* port initialize */
        PORT_CS_IRQ_WOC         = (1 << 3), /* interrupt write one to clear */
+       PORT_CS_CDB16           = (1 << 5), /* 0=12b cdb, 1=16b cdb */
        PORT_CS_RESUME          = (1 << 6), /* port resume */
        PORT_CS_32BIT_ACTV      = (1 << 10), /* 32-bit activation */
        PORT_CS_PM_EN           = (1 << 13), /* port multiplier enable */
@@ -188,11 +178,29 @@ enum {
        PORT_CERR_XFR_PCIPERR   = 35, /* PSD ecode 11 - PCI prity err during transfer */
        PORT_CERR_SENDSERVICE   = 36, /* FIS received while sending service */
 
+       /* bits of PRB control field */
+       PRB_CTRL_PROTOCOL       = (1 << 0), /* override def. ATA protocol */
+       PRB_CTRL_PACKET_READ    = (1 << 4), /* PACKET cmd read */
+       PRB_CTRL_PACKET_WRITE   = (1 << 5), /* PACKET cmd write */
+       PRB_CTRL_NIEN           = (1 << 6), /* Mask completion irq */
+       PRB_CTRL_SRST           = (1 << 7), /* Soft reset request (ign BSY?) */
+
+       /* PRB protocol field */
+       PRB_PROT_PACKET         = (1 << 0),
+       PRB_PROT_TCQ            = (1 << 1),
+       PRB_PROT_NCQ            = (1 << 2),
+       PRB_PROT_READ           = (1 << 3),
+       PRB_PROT_WRITE          = (1 << 4),
+       PRB_PROT_TRANSPARENT    = (1 << 5),
+
        /*
         * Other constants
         */
        SGE_TRM                 = (1 << 31), /* Last SGE in chain */
-       PRB_SOFT_RST            = (1 << 7),  /* Soft reset request (ign BSY?) */
+       SGE_LNK                 = (1 << 30), /* linked list
+                                               Points to SGT, not SGE */
+       SGE_DRD                 = (1 << 29), /* discard data read (/dev/null)
+                                               data address ignored */
 
        /* board id */
        BID_SIL3124             = 0,
@@ -202,11 +210,22 @@ enum {
        IRQ_STAT_4PORTS         = 0xf,
 };
 
-struct sil24_cmd_block {
+struct sil24_ata_block {
        struct sil24_prb prb;
        struct sil24_sge sge[LIBATA_MAX_PRD];
 };
 
+struct sil24_atapi_block {
+       struct sil24_prb prb;
+       u8 cdb[16];
+       struct sil24_sge sge[LIBATA_MAX_PRD - 1];
+};
+
+union sil24_cmd_block {
+       struct sil24_ata_block ata;
+       struct sil24_atapi_block atapi;
+};
+
 /*
  * ap->private_data
  *
@@ -214,7 +233,7 @@ struct sil24_cmd_block {
  * here from the previous interrupt.
  */
 struct sil24_port_priv {
-       struct sil24_cmd_block *cmd_block;      /* 32 cmd blocks */
+       union sil24_cmd_block *cmd_block;       /* 32 cmd blocks */
        dma_addr_t cmd_block_dma;               /* DMA base addr for them */
        struct ata_taskfile tf;                 /* Cached taskfile registers */
 };
@@ -225,6 +244,7 @@ struct sil24_host_priv {
        void __iomem *port_base;        /* port registers (4 * 8192 bytes @BAR2) */
 };
 
+static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev);
 static u8 sil24_check_status(struct ata_port *ap);
 static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
 static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val);
@@ -240,7 +260,7 @@ static void sil24_port_stop(struct ata_port *ap);
 static void sil24_host_stop(struct ata_host_set *host_set);
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 
-static struct pci_device_id sil24_pci_tbl[] = {
+static const struct pci_device_id sil24_pci_tbl[] = {
        { 0x1095, 0x3124, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3124 },
        { 0x1095, 0x3132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3132 },
        { 0x1095, 0x3131, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3131 },
@@ -278,6 +298,8 @@ static struct scsi_host_template sil24_sht = {
 static const struct ata_port_operations sil24_ops = {
        .port_disable           = ata_port_disable,
 
+       .dev_config             = sil24_dev_config,
+
        .check_status           = sil24_check_status,
        .check_altstatus        = sil24_check_status,
        .dev_select             = ata_noop_dev_select,
@@ -314,7 +336,7 @@ static struct ata_port_info sil24_port_info[] = {
        {
                .sht            = &sil24_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO |
+                                 ATA_FLAG_SRST | ATA_FLAG_MMIO |
                                  ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -325,7 +347,7 @@ static struct ata_port_info sil24_port_info[] = {
        {
                .sht            = &sil24_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO |
+                                 ATA_FLAG_SRST | ATA_FLAG_MMIO |
                                  ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -336,7 +358,7 @@ static struct ata_port_info sil24_port_info[] = {
        {
                .sht            = &sil24_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO |
+                                 ATA_FLAG_SRST | ATA_FLAG_MMIO |
                                  ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -345,6 +367,16 @@ static struct ata_port_info sil24_port_info[] = {
        },
 };
 
+static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev)
+{
+       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+
+       if (ap->cdb_len == 16)
+               writel(PORT_CS_CDB16, port + PORT_CTRL_STAT);
+       else
+               writel(PORT_CS_CDB16, port + PORT_CTRL_CLR);
+}
+
 static inline void sil24_update_tf(struct ata_port *ap)
 {
        struct sil24_port_priv *pp = ap->private_data;
@@ -396,22 +428,73 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
        *tf = pp->tf;
 }
 
-static void sil24_phy_reset(struct ata_port *ap)
+static int sil24_issue_SRST(struct ata_port *ap)
 {
-       __sata_phy_reset(ap);
+       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       struct sil24_port_priv *pp = ap->private_data;
+       struct sil24_prb *prb = &pp->cmd_block[0].ata.prb;
+       dma_addr_t paddr = pp->cmd_block_dma;
+       u32 irq_enable, irq_stat;
+       int cnt;
+
+       /* temporarily turn off IRQs during SRST */
+       irq_enable = readl(port + PORT_IRQ_ENABLE_SET);
+       writel(irq_enable, port + PORT_IRQ_ENABLE_CLR);
+
        /*
-        * No ATAPI yet.  Just unconditionally indicate ATA device.
-        * If ATAPI device is attached, it will fail ATA_CMD_ID_ATA
-        * and libata core will ignore the device.
+        * XXX: Not sure whether the following sleep is needed or not.
+        * The original driver had it.  So....
         */
-       if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
-               ap->device[0].class = ATA_DEV_ATA;
+       msleep(10);
+
+       prb->ctrl = PRB_CTRL_SRST;
+       prb->fis[1] = 0; /* no PM yet */
+
+       writel((u32)paddr, port + PORT_CMD_ACTIVATE);
+
+       for (cnt = 0; cnt < 100; cnt++) {
+               irq_stat = readl(port + PORT_IRQ_STAT);
+               writel(irq_stat, port + PORT_IRQ_STAT);         /* clear irq */
+
+               irq_stat >>= PORT_IRQ_RAW_SHIFT;
+               if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR))
+                       break;
+
+               msleep(1);
+       }
+
+       /* restore IRQs */
+       writel(irq_enable, port + PORT_IRQ_ENABLE_SET);
+
+       if (!(irq_stat & PORT_IRQ_COMPLETE))
+               return -1;
+
+       /* update TF */
+       sil24_update_tf(ap);
+       return 0;
+}
+
+static void sil24_phy_reset(struct ata_port *ap)
+{
+       struct sil24_port_priv *pp = ap->private_data;
+
+       __sata_phy_reset(ap);
+       if (ap->flags & ATA_FLAG_PORT_DISABLED)
+               return;
+
+       if (sil24_issue_SRST(ap) < 0) {
+               printk(KERN_ERR DRV_NAME
+                      " ata%u: SRST failed, disabling port\n", ap->id);
+               ap->ops->port_disable(ap);
+               return;
+       }
+
+       ap->device->class = ata_dev_classify(&pp->tf);
 }
 
 static inline void sil24_fill_sg(struct ata_queued_cmd *qc,
-                                struct sil24_cmd_block *cb)
+                                struct sil24_sge *sge)
 {
-       struct sil24_sge *sge = cb->sge;
        struct scatterlist *sg;
        unsigned int idx = 0;
 
@@ -432,23 +515,47 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct sil24_port_priv *pp = ap->private_data;
-       struct sil24_cmd_block *cb = pp->cmd_block + qc->tag;
-       struct sil24_prb *prb = &cb->prb;
+       union sil24_cmd_block *cb = pp->cmd_block + qc->tag;
+       struct sil24_prb *prb;
+       struct sil24_sge *sge;
 
        switch (qc->tf.protocol) {
        case ATA_PROT_PIO:
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
+               prb = &cb->ata.prb;
+               sge = cb->ata.sge;
+               prb->ctrl = 0;
+               break;
+
+       case ATA_PROT_ATAPI:
+       case ATA_PROT_ATAPI_DMA:
+       case ATA_PROT_ATAPI_NODATA:
+               prb = &cb->atapi.prb;
+               sge = cb->atapi.sge;
+               memset(cb->atapi.cdb, 0, 32);
+               memcpy(cb->atapi.cdb, qc->cdb, ap->cdb_len);
+
+               if (qc->tf.protocol != ATA_PROT_ATAPI_NODATA) {
+                       if (qc->tf.flags & ATA_TFLAG_WRITE)
+                               prb->ctrl = PRB_CTRL_PACKET_WRITE;
+                       else
+                               prb->ctrl = PRB_CTRL_PACKET_READ;
+               } else
+                       prb->ctrl = 0;
+
                break;
+
        default:
-               /* ATAPI isn't supported yet */
+               prb = NULL;     /* shut up, gcc */
+               sge = NULL;
                BUG();
        }
 
        ata_tf_to_fis(&qc->tf, prb->fis, 0);
 
        if (qc->flags & ATA_QCFLAG_DMAMAP)
-               sil24_fill_sg(qc, cb);
+               sil24_fill_sg(qc, sge);
 }
 
 static int sil24_qc_issue(struct ata_queued_cmd *qc)
@@ -467,6 +574,31 @@ static void sil24_irq_clear(struct ata_port *ap)
        /* unused */
 }
 
+static int __sil24_restart_controller(void __iomem *port)
+{
+       u32 tmp;
+       int cnt;
+
+       writel(PORT_CS_INIT, port + PORT_CTRL_STAT);
+
+       /* Max ~10ms */
+       for (cnt = 0; cnt < 10000; cnt++) {
+               tmp = readl(port + PORT_CTRL_STAT);
+               if (tmp & PORT_CS_RDY)
+                       return 0;
+               udelay(1);
+       }
+
+       return -1;
+}
+
+static void sil24_restart_controller(struct ata_port *ap)
+{
+       if (__sil24_restart_controller((void __iomem *)ap->ioaddr.cmd_addr))
+               printk(KERN_ERR DRV_NAME
+                      " ata%u: failed to restart controller\n", ap->id);
+}
+
 static int __sil24_reset_controller(void __iomem *port)
 {
        int cnt;
@@ -486,7 +618,11 @@ static int __sil24_reset_controller(void __iomem *port)
 
        if (tmp & PORT_CS_DEV_RST)
                return -1;
-       return 0;
+
+       if (tmp & PORT_CS_RDY)
+               return 0;
+
+       return __sil24_restart_controller(port);
 }
 
 static void sil24_reset_controller(struct ata_port *ap)
@@ -548,9 +684,15 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
        if (serror)
                writel(serror, port + PORT_SERROR);
 
-       printk(KERN_ERR DRV_NAME " ata%u: error interrupt on port%d\n"
-              "  stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n",
-              ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror);
+       /*
+        * Don't log ATAPI device errors.  They're supposed to happen
+        * and any serious errors will be logged using sense data by
+        * the SCSI layer.
+        */
+       if (ap->device[0].class != ATA_DEV_ATAPI || cmd_err > PORT_CERR_SDB)
+               printk("ata%u: error interrupt on port%d\n"
+                      "  stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n",
+                      ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror);
 
        if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) {
                /*
@@ -558,6 +700,7 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
                 */
                sil24_update_tf(ap);
                err_mask = ac_err_mask(pp->tf.command);
+               sil24_restart_controller(ap);
        } else {
                /*
                 * Other errors.  libata currently doesn't have any
@@ -565,12 +708,11 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
                 * ATA_ERR.
                 */
                err_mask = AC_ERR_OTHER;
+               sil24_reset_controller(ap);
        }
 
        if (qc)
                ata_qc_complete(qc, err_mask);
-
-       sil24_reset_controller(ap);
 }
 
 static inline void sil24_host_intr(struct ata_port *ap)
@@ -646,7 +788,7 @@ static int sil24_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host_set->dev;
        struct sil24_port_priv *pp;
-       struct sil24_cmd_block *cb;
+       union sil24_cmd_block *cb;
        size_t cb_size = sizeof(*cb);
        dma_addr_t cb_dma;
        int rc = -ENOMEM;
@@ -687,6 +829,7 @@ static void sil24_port_stop(struct ata_port *ap)
        struct sil24_port_priv *pp = ap->private_data;
 
        sil24_cblk_free(pp, dev);
+       ata_pad_free(ap, dev);
        kfree(pp);
 }
 
index 42d7c4e925014d2a382f4ee81117a9d62917e318..32e12620b1625a7f206284a5e85d195118d5baca 100644 (file)
@@ -67,7 +67,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 
-static struct pci_device_id sis_pci_tbl[] = {
+static const struct pci_device_id sis_pci_tbl[] = {
        { PCI_VENDOR_ID_SI, 0x180, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sis_180 },
        { PCI_VENDOR_ID_SI, 0x181, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sis_180 },
        { PCI_VENDOR_ID_SI, 0x182, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sis_180 },
index 9895d1caefcf34c1b53ec93fc6875ff3a3dbe3f2..6e7f7c83a75ae52409d1b41a9e397ce19a2d5437 100644 (file)
@@ -54,7 +54,7 @@
 #endif /* CONFIG_PPC_OF */
 
 #define DRV_NAME       "sata_svw"
-#define DRV_VERSION    "1.06"
+#define DRV_VERSION    "1.07"
 
 /* Taskfile registers offsets */
 #define K2_SATA_TF_CMD_OFFSET          0x00
@@ -466,7 +466,7 @@ err_out:
  * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
  * controller
  * */
-static struct pci_device_id k2_sata_pci_tbl[] = {
+static const struct pci_device_id k2_sata_pci_tbl[] = {
        { 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
        { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
        { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
index d5a38784352b9bf7adfa396d279f2f27e71d6b6a..dcc3ad9a9d6e24cff6a2e236e749b44c64630a31 100644 (file)
@@ -46,7 +46,7 @@
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_sx4"
-#define DRV_VERSION    "0.7"
+#define DRV_VERSION    "0.8"
 
 
 enum {
@@ -229,7 +229,7 @@ static struct ata_port_info pdc_port_info[] = {
 
 };
 
-static struct pci_device_id pdc_sata_pci_tbl[] = {
+static const struct pci_device_id pdc_sata_pci_tbl[] = {
        { PCI_VENDOR_ID_PROMISE, 0x6622, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20621 },
        { }     /* terminate list */
index cf0baaa4e045ab3e36545e05882978e8431bef13..b2422a0f25c89755b8b8bacfe11d9ce0c1e455be 100644 (file)
@@ -55,7 +55,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static u32 uli_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 
-static struct pci_device_id uli_pci_tbl[] = {
+static const struct pci_device_id uli_pci_tbl[] = {
        { PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5289 },
        { PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5287 },
        { PCI_VENDOR_ID_AL, 0x5281, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5281 },
index ab19d2ba2a4bf163b0e70332475d1f493707f9e4..c76215692da2079302a01cd50cf120531d953b38 100644 (file)
@@ -75,7 +75,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 
-static struct pci_device_id svia_pci_tbl[] = {
+static const struct pci_device_id svia_pci_tbl[] = {
        { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
        { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
 
index ce8a2fd7da84d577b4c0154fe9e215323f1c828e..fcfa486965b4035b6106f02fec92be1b3007935d 100644 (file)
@@ -47,7 +47,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_vsc"
-#define DRV_VERSION    "1.0"
+#define DRV_VERSION    "1.1"
 
 /* Interrupt register offsets (from chip base address) */
 #define VSC_SATA_INT_STAT_OFFSET       0x00
@@ -400,7 +400,7 @@ err_out:
  * 0x8086/0x3200 is the Intel 31244, which is supposed to be identical
  * compatibility is untested as of yet
  */
-static struct pci_device_id vsc_sata_pci_tbl[] = {
+static const struct pci_device_id vsc_sata_pci_tbl[] = {
        { 0x1725, 0x7174, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
        { 0x8086, 0x3200, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
        { }
index b61fb1295b8bcc1cb5263ba417e01ebf3b6a70d6..3ded9daaf4a01c21732f7e7d4b3fb67d5e19fda4 100644 (file)
@@ -178,7 +178,7 @@ struct sdebug_queued_cmd {
 };
 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
 
-static Scsi_Host_Template sdebug_driver_template = {
+static struct scsi_host_template sdebug_driver_template = {
        .proc_info =            scsi_debug_proc_info,
        .name =                 "SCSI DEBUG",
        .info =                 scsi_debug_info,
index 0c5b02d4c7f85dc963181baa0e3583fe52a1e262..18c5d252301441b287735e74b0dfae07c48b75af 100644 (file)
@@ -416,44 +416,16 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
        return FAILED;
 }
 
-/**
- * scsi_eh_times_out - timeout function for error handling.
- * @scmd:      Cmd that is timing out.
- *
- * Notes:
- *    During error handling, the kernel thread will be sleeping waiting
- *    for some action to complete on the device.  our only job is to
- *    record that it timed out, and to wake up the thread.
- **/
-static void scsi_eh_times_out(struct scsi_cmnd *scmd)
-{
-       scmd->eh_eflags |= SCSI_EH_REC_TIMEOUT;
-       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd:%p\n", __FUNCTION__,
-                                         scmd));
-
-       up(scmd->device->host->eh_action);
-}
-
 /**
  * scsi_eh_done - Completion function for error handling.
  * @scmd:      Cmd that is done.
  **/
 static void scsi_eh_done(struct scsi_cmnd *scmd)
 {
-       /*
-        * if the timeout handler is already running, then just set the
-        * flag which says we finished late, and return.  we have no
-        * way of stopping the timeout handler from running, so we must
-        * always defer to it.
-        */
-       if (del_timer(&scmd->eh_timeout)) {
-               scmd->request->rq_status = RQ_SCSI_DONE;
-
-               SCSI_LOG_ERROR_RECOVERY(3, printk("%s scmd: %p result: %x\n",
-                                          __FUNCTION__, scmd, scmd->result));
-
-               up(scmd->device->host->eh_action);
-       }
+       SCSI_LOG_ERROR_RECOVERY(3,
+               printk("%s scmd: %p result: %x\n",
+                       __FUNCTION__, scmd, scmd->result));
+       complete(scmd->device->host->eh_action);
 }
 
 /**
@@ -461,10 +433,6 @@ static void scsi_eh_done(struct scsi_cmnd *scmd)
  * @scmd:      SCSI Cmd to send.
  * @timeout:   Timeout for cmd.
  *
- * Notes:
- *    The initialization of the structures is quite a bit different in
- *    this case, and furthermore, there is a different completion handler
- *    vs scsi_dispatch_cmd.
  * Return value:
  *    SUCCESS or FAILED or NEEDS_RETRY
  **/
@@ -472,24 +440,16 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout)
 {
        struct scsi_device *sdev = scmd->device;
        struct Scsi_Host *shost = sdev->host;
-       DECLARE_MUTEX_LOCKED(sem);
+       DECLARE_COMPLETION(done);
+       unsigned long timeleft;
        unsigned long flags;
-       int rtn = SUCCESS;
+       int rtn;
 
-       /*
-        * we will use a queued command if possible, otherwise we will
-        * emulate the queuing and calling of completion function ourselves.
-        */
        if (sdev->scsi_level <= SCSI_2)
                scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) |
                        (sdev->lun << 5 & 0xe0);
 
-       scsi_add_timer(scmd, timeout, scsi_eh_times_out);
-
-       /*
-        * set up the semaphore so we wait for the command to complete.
-        */
-       shost->eh_action = &sem;
+       shost->eh_action = &done;
        scmd->request->rq_status = RQ_SCSI_BUSY;
 
        spin_lock_irqsave(shost->host_lock, flags);
@@ -497,47 +457,29 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout)
        shost->hostt->queuecommand(scmd, scsi_eh_done);
        spin_unlock_irqrestore(shost->host_lock, flags);
 
-       down(&sem);
-       scsi_log_completion(scmd, SUCCESS);
+       timeleft = wait_for_completion_timeout(&done, timeout);
 
+       scmd->request->rq_status = RQ_SCSI_DONE;
        shost->eh_action = NULL;
 
-       /*
-        * see if timeout.  if so, tell the host to forget about it.
-        * in other words, we don't want a callback any more.
-        */
-       if (scmd->eh_eflags & SCSI_EH_REC_TIMEOUT) {
-               scmd->eh_eflags &= ~SCSI_EH_REC_TIMEOUT;
-
-               /*
-                * as far as the low level driver is
-                * concerned, this command is still active, so
-                * we must give the low level driver a chance
-                * to abort it. (db) 
-                *
-                * FIXME(eric) - we are not tracking whether we could
-                * abort a timed out command or not.  not sure how
-                * we should treat them differently anyways.
-                */
-               if (shost->hostt->eh_abort_handler)
-                       shost->hostt->eh_abort_handler(scmd);
-                       
-               scmd->request->rq_status = RQ_SCSI_DONE;
-               rtn = FAILED;
-       }
+       scsi_log_completion(scmd, SUCCESS);
 
-       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd: %p, rtn:%x\n",
-                                         __FUNCTION__, scmd, rtn));
+       SCSI_LOG_ERROR_RECOVERY(3,
+               printk("%s: scmd: %p, timeleft: %ld\n",
+                       __FUNCTION__, scmd, timeleft));
 
        /*
-        * now examine the actual status codes to see whether the command
-        * actually did complete normally.
+        * If there is time left scsi_eh_done got called, and we will
+        * examine the actual status codes to see whether the command
+        * actually did complete normally, else tell the host to forget
+        * about this command.
         */
-       if (rtn == SUCCESS) {
+       if (timeleft) {
                rtn = scsi_eh_completed_normally(scmd);
                SCSI_LOG_ERROR_RECOVERY(3,
                        printk("%s: scsi_eh_completed_normally %x\n",
                               __FUNCTION__, rtn));
+
                switch (rtn) {
                case SUCCESS:
                case NEEDS_RETRY:
@@ -547,6 +489,15 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout)
                        rtn = FAILED;
                        break;
                }
+       } else {
+               /*
+                * FIXME(eric) - we are not tracking whether we could
+                * abort a timed out command or not.  not sure how
+                * we should treat them differently anyways.
+                */
+               if (shost->hostt->eh_abort_handler)
+                       shost->hostt->eh_abort_handler(scmd);
+               rtn = FAILED;
        }
 
        return rtn;
@@ -1571,50 +1522,41 @@ static void scsi_unjam_host(struct Scsi_Host *shost)
 }
 
 /**
- * scsi_error_handler - Handle errors/timeouts of SCSI cmds.
+ * scsi_error_handler - SCSI error handler thread
  * @data:      Host for which we are running.
  *
  * Notes:
- *    This is always run in the context of a kernel thread.  The idea is
- *    that we start this thing up when the kernel starts up (one per host
- *    that we detect), and it immediately goes to sleep and waits for some
- *    event (i.e. failure).  When this takes place, we have the job of
- *    trying to unjam the bus and restarting things.
+ *    This is the main error handling loop.  This is run as a kernel thread
+ *    for every SCSI host and handles all error handling activity.
  **/
 int scsi_error_handler(void *data)
 {
-       struct Scsi_Host *shost = (struct Scsi_Host *) data;
-       int rtn;
+       struct Scsi_Host *shost = data;
 
        current->flags |= PF_NOFREEZE;
 
-       
        /*
-        * Note - we always use TASK_INTERRUPTIBLE even if the module
-        * was loaded as part of the kernel.  The reason is that
-        * UNINTERRUPTIBLE would cause this thread to be counted in
-        * the load average as a running process, and an interruptible
-        * wait doesn't.
+        * We use TASK_INTERRUPTIBLE so that the thread is not
+        * counted against the load average as a running process.
+        * We never actually get interrupted because kthread_run
+        * disables singal delivery for the created thread.
         */
        set_current_state(TASK_INTERRUPTIBLE);
        while (!kthread_should_stop()) {
                if (shost->host_failed == 0 ||
                    shost->host_failed != shost->host_busy) {
-                       SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler"
-                                                         " scsi_eh_%d"
-                                                         " sleeping\n",
-                                                         shost->host_no));
+                       SCSI_LOG_ERROR_RECOVERY(1,
+                               printk("Error handler scsi_eh_%d sleeping\n",
+                                       shost->host_no));
                        schedule();
                        set_current_state(TASK_INTERRUPTIBLE);
                        continue;
                }
 
                __set_current_state(TASK_RUNNING);
-               SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler"
-                                                 " scsi_eh_%d waking"
-                                                 " up\n",shost->host_no));
-
-               shost->eh_active = 1;
+               SCSI_LOG_ERROR_RECOVERY(1,
+                       printk("Error handler scsi_eh_%d waking up\n",
+                               shost->host_no));
 
                /*
                 * We have a host that is failing for some reason.  Figure out
@@ -1622,12 +1564,10 @@ int scsi_error_handler(void *data)
                 * If we fail, we end up taking the thing offline.
                 */
                if (shost->hostt->eh_strategy_handler) 
-                       rtn = shost->hostt->eh_strategy_handler(shost);
+                       shost->hostt->eh_strategy_handler(shost);
                else
                        scsi_unjam_host(shost);
 
-               shost->eh_active = 0;
-
                /*
                 * Note - if the above fails completely, the action is to take
                 * individual devices offline and flush the queue of any
@@ -1638,15 +1578,10 @@ int scsi_error_handler(void *data)
                scsi_restart_operations(shost);
                set_current_state(TASK_INTERRUPTIBLE);
        }
-
        __set_current_state(TASK_RUNNING);
 
-       SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d"
-                                         " exiting\n",shost->host_no));
-
-       /*
-        * Make sure that nobody tries to wake us up again.
-        */
+       SCSI_LOG_ERROR_RECOVERY(1,
+               printk("Error handler scsi_eh_%d exiting\n", shost->host_no));
        shost->ehandler = NULL;
        return 0;
 }
index e40c8b66da40fe80ab6a1167ed29b1e9e62fa3d9..ce9d73a292e2a0f273992efd56e7cb7370f2bbc0 100644 (file)
@@ -254,55 +254,6 @@ void scsi_do_req(struct scsi_request *sreq, const void *cmnd,
 }
 EXPORT_SYMBOL(scsi_do_req);
 
-/* This is the end routine we get to if a command was never attached
- * to the request.  Simply complete the request without changing
- * rq_status; this will cause a DRIVER_ERROR. */
-static void scsi_wait_req_end_io(struct request *req)
-{
-       BUG_ON(!req->waiting);
-
-       complete(req->waiting);
-}
-
-void scsi_wait_req(struct scsi_request *sreq, const void *cmnd, void *buffer,
-                  unsigned bufflen, int timeout, int retries)
-{
-       DECLARE_COMPLETION(wait);
-       int write = (sreq->sr_data_direction == DMA_TO_DEVICE);
-       struct request *req;
-
-       req = blk_get_request(sreq->sr_device->request_queue, write,
-                             __GFP_WAIT);
-       if (bufflen && blk_rq_map_kern(sreq->sr_device->request_queue, req,
-                                      buffer, bufflen, __GFP_WAIT)) {
-               sreq->sr_result = DRIVER_ERROR << 24;
-               blk_put_request(req);
-               return;
-       }
-
-       req->flags |= REQ_NOMERGE;
-       req->waiting = &wait;
-       req->end_io = scsi_wait_req_end_io;
-       req->cmd_len = COMMAND_SIZE(((u8 *)cmnd)[0]);
-       req->sense = sreq->sr_sense_buffer;
-       req->sense_len = 0;
-       memcpy(req->cmd, cmnd, req->cmd_len);
-       req->timeout = timeout;
-       req->flags |= REQ_BLOCK_PC;
-       req->rq_disk = NULL;
-       blk_insert_request(sreq->sr_device->request_queue, req,
-                          sreq->sr_data_direction == DMA_TO_DEVICE, NULL);
-       wait_for_completion(&wait);
-       sreq->sr_request->waiting = NULL;
-       sreq->sr_result = req->errors;
-       if (req->errors)
-               sreq->sr_result |= (DRIVER_ERROR << 24);
-
-       blk_put_request(req);
-}
-
-EXPORT_SYMBOL(scsi_wait_req);
-
 /**
  * scsi_execute - insert request and wait for the result
  * @sdev:      scsi device
@@ -591,10 +542,17 @@ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
 
 void scsi_next_command(struct scsi_cmnd *cmd)
 {
-       struct request_queue *q = cmd->device->request_queue;
+       struct scsi_device *sdev = cmd->device;
+       struct request_queue *q = sdev->request_queue;
+
+       /* need to hold a reference on the device before we let go of the cmd */
+       get_device(&sdev->sdev_gendev);
 
        scsi_put_command(cmd);
        scsi_run_queue(q);
+
+       /* ok to remove device now */
+       put_device(&sdev->sdev_gendev);
 }
 
 void scsi_run_host_queues(struct Scsi_Host *shost)
index d05f778d31a8b42b7b44aca4c507a016bdec4477..d632d9e1493cb1fe83b9e1171fd9e9a1fba875d3 100644 (file)
@@ -22,7 +22,6 @@ struct Scsi_Host;
  * Scsi Error Handler Flags
  */
 #define SCSI_EH_CANCEL_CMD     0x0001  /* Cancel this cmd */
-#define SCSI_EH_REC_TIMEOUT    0x0002  /* EH retry timed out */
 
 #define SCSI_SENSE_VALID(scmd) \
        (((scmd)->sense_buffer[0] & 0x70) == 0x70)
index 7eb3a2d40dc5258d5f552cdf878ecae351668785..374853df9cca10fb733b9eff4ffc8aa373ee5ffc 100644 (file)
@@ -9,7 +9,7 @@
  * global variable (boot or module load time) settings.
  *
  * A specific LUN is scanned via an INQUIRY command; if the LUN has a
- * device attached, a Scsi_Device is allocated and setup for it.
+ * device attached, a scsi_device is allocated and setup for it.
  *
  * For every id of every channel on the given host:
  *
@@ -17,7 +17,7 @@
  *     device or storage attached to LUN 0):
  *
  *             If LUN 0 has a device attached, allocate and setup a
- *             Scsi_Device for it.
+ *             scsi_device for it.
  *
  *             If target is SCSI-3 or up, issue a REPORT LUN, and scan
  *             all of the LUNs returned by the REPORT LUN; else,
@@ -441,7 +441,7 @@ void scsi_target_reap(struct scsi_target *starget)
  *
  *     If the INQUIRY is successful, zero is returned and the
  *     INQUIRY data is in @inq_result; the scsi_level and INQUIRY length
- *     are copied to the Scsi_Device any flags value is stored in *@bflags.
+ *     are copied to the scsi_device any flags value is stored in *@bflags.
  **/
 static int scsi_probe_lun(struct scsi_device *sdev, char *inq_result,
                          int result_len, int *bflags)
@@ -509,8 +509,8 @@ static int scsi_probe_lun(struct scsi_device *sdev, char *inq_result,
                /*
                 * Get any flags for this device.
                 *
-                * XXX add a bflags to Scsi_Device, and replace the
-                * corresponding bit fields in Scsi_Device, so bflags
+                * XXX add a bflags to scsi_device, and replace the
+                * corresponding bit fields in scsi_device, so bflags
                 * need not be passed as an argument.
                 */
                *bflags = scsi_get_device_flags(sdev, &inq_result[8],
@@ -592,21 +592,21 @@ static int scsi_probe_lun(struct scsi_device *sdev, char *inq_result,
 }
 
 /**
- * scsi_add_lun - allocate and fully initialze a Scsi_Device
- * @sdevscan:  holds information to be stored in the new Scsi_Device
- * @sdevnew:   store the address of the newly allocated Scsi_Device
+ * scsi_add_lun - allocate and fully initialze a scsi_device
+ * @sdevscan:  holds information to be stored in the new scsi_device
+ * @sdevnew:   store the address of the newly allocated scsi_device
  * @inq_result:        holds the result of a previous INQUIRY to the LUN
  * @bflags:    black/white list flag
  *
  * Description:
- *     Allocate and initialize a Scsi_Device matching sdevscan. Optionally
+ *     Allocate and initialize a scsi_device matching sdevscan. Optionally
  *     set fields based on values in *@bflags. If @sdevnew is not
- *     NULL, store the address of the new Scsi_Device in *@sdevnew (needed
+ *     NULL, store the address of the new scsi_device in *@sdevnew (needed
  *     when scanning a particular LUN).
  *
  * Return:
- *     SCSI_SCAN_NO_RESPONSE: could not allocate or setup a Scsi_Device
- *     SCSI_SCAN_LUN_PRESENT: a new Scsi_Device was allocated and initialized
+ *     SCSI_SCAN_NO_RESPONSE: could not allocate or setup a scsi_device
+ *     SCSI_SCAN_LUN_PRESENT: a new scsi_device was allocated and initialized
  **/
 static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
 {
@@ -674,7 +674,7 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
         *
         * The above is vague, as it implies that we could treat 001 and
         * 011 the same. Stay compatible with previous code, and create a
-        * Scsi_Device for a PQ of 1
+        * scsi_device for a PQ of 1
         *
         * Don't set the device offline here; rather let the upper
         * level drivers eval the PQ to decide whether they should
@@ -784,8 +784,8 @@ static inline void scsi_destroy_sdev(struct scsi_device *sdev)
  * scsi_probe_and_add_lun - probe a LUN, if a LUN is found add it
  * @starget:   pointer to target device structure
  * @lun:       LUN of target device
- * @sdevscan:  probe the LUN corresponding to this Scsi_Device
- * @sdevnew:   store the value of any new Scsi_Device allocated
+ * @sdevscan:  probe the LUN corresponding to this scsi_device
+ * @sdevnew:   store the value of any new scsi_device allocated
  * @bflagsp:   store bflags here if not NULL
  *
  * Description:
@@ -793,10 +793,10 @@ static inline void scsi_destroy_sdev(struct scsi_device *sdev)
  *     allocate and set it up by calling scsi_add_lun.
  *
  * Return:
- *     SCSI_SCAN_NO_RESPONSE: could not allocate or setup a Scsi_Device
+ *     SCSI_SCAN_NO_RESPONSE: could not allocate or setup a scsi_device
  *     SCSI_SCAN_TARGET_PRESENT: target responded, but no device is
  *         attached at the LUN
- *     SCSI_SCAN_LUN_PRESENT: a new Scsi_Device was allocated and initialized
+ *     SCSI_SCAN_LUN_PRESENT: a new scsi_device was allocated and initialized
  **/
 static int scsi_probe_and_add_lun(struct scsi_target *starget,
                                  uint lun, int *bflagsp,
@@ -1046,7 +1046,7 @@ EXPORT_SYMBOL(int_to_scsilun);
 
 /**
  * scsi_report_lun_scan - Scan using SCSI REPORT LUN results
- * @sdevscan:  scan the host, channel, and id of this Scsi_Device
+ * @sdevscan:  scan the host, channel, and id of this scsi_device
  *
  * Description:
  *     If @sdevscan is for a SCSI-3 or up device, send a REPORT LUN
@@ -1074,6 +1074,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags,
        struct scsi_sense_hdr sshdr;
        struct scsi_device *sdev;
        struct Scsi_Host *shost = dev_to_shost(&starget->dev);
+       int ret = 0;
 
        /*
         * Only support SCSI-3 and up devices if BLIST_NOREPORTLUN is not set.
@@ -1169,8 +1170,8 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags,
                /*
                 * The device probably does not support a REPORT LUN command
                 */
-               kfree(lun_data);
-               return 1;
+               ret = 1;
+               goto out_err;
        }
 
        /*
@@ -1238,6 +1239,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags,
                }
        }
 
+ out_err:
        kfree(lun_data);
  out:
        scsi_device_put(sdev);
@@ -1246,7 +1248,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags,
                 * the sdev we used didn't appear in the report luns scan
                 */
                scsi_destroy_sdev(sdev);
-       return 0;
+       return ret;
 }
 
 struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel,
@@ -1472,16 +1474,16 @@ void scsi_forget_host(struct Scsi_Host *shost)
 /*
  * Function:    scsi_get_host_dev()
  *
- * Purpose:     Create a Scsi_Device that points to the host adapter itself.
+ * Purpose:     Create a scsi_device that points to the host adapter itself.
  *
- * Arguments:   SHpnt   - Host that needs a Scsi_Device
+ * Arguments:   SHpnt   - Host that needs a scsi_device
  *
  * Lock status: None assumed.
  *
- * Returns:     The Scsi_Device or NULL
+ * Returns:     The scsi_device or NULL
  *
  * Notes:
- *     Attach a single Scsi_Device to the Scsi_Host - this should
+ *     Attach a single scsi_device to the Scsi_Host - this should
  *     be made to look like a "pseudo-device" that points to the
  *     HA itself.
  *
@@ -1518,7 +1520,7 @@ EXPORT_SYMBOL(scsi_get_host_dev);
  *
  * Purpose:     Free a scsi_device that points to the host adapter itself.
  *
- * Arguments:   SHpnt   - Host that needs a Scsi_Device
+ * Arguments:   SHpnt   - Host that needs a scsi_device
  *
  * Lock status: None assumed.
  *
index 72a6550a056c9dc14ba33f2383a04b7fb9711d99..46349293de088603099405b48884fe505f665188 100644 (file)
@@ -691,16 +691,19 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
 
 void __scsi_remove_device(struct scsi_device *sdev)
 {
+       struct device *dev = &sdev->sdev_gendev;
+
        if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0)
                return;
 
        class_device_unregister(&sdev->sdev_classdev);
-       device_del(&sdev->sdev_gendev);
+       transport_remove_device(dev);
+       device_del(dev);
        scsi_device_set_state(sdev, SDEV_DEL);
        if (sdev->host->hostt->slave_destroy)
                sdev->host->hostt->slave_destroy(sdev);
-       transport_unregister_device(&sdev->sdev_gendev);
-       put_device(&sdev->sdev_gendev);
+       transport_destroy_device(dev);
+       put_device(dev);
 }
 
 /**
index 6c431323581cb675cb1d47467201c4804ea310d0..29f038b42f6085d83c9e58962b7ab6a6b54b0c4f 100644 (file)
@@ -1,6 +1,3 @@
 
-typedef struct scsi_host_template Scsi_Host_Template;
-typedef struct scsi_device Scsi_Device;
 typedef struct scsi_cmnd Scsi_Cmnd;
 typedef struct scsi_request Scsi_Request;
-typedef struct scsi_pointer Scsi_Pointer;
index bb5b242ac6b497f8abf3e7cab9da6f1cfc296ebd..8613a1317712c9d40df22c26dc546d1c8b6aea28 100644 (file)
@@ -769,20 +769,16 @@ static void sd_end_flush(request_queue_t *q, struct request *flush_rq)
 static int sd_prepare_flush(request_queue_t *q, struct request *rq)
 {
        struct scsi_device *sdev = q->queuedata;
-       struct scsi_disk *sdkp = scsi_disk_get_from_dev(&sdev->sdev_gendev);
-       int ret = 0;
+       struct scsi_disk *sdkp = dev_get_drvdata(&sdev->sdev_gendev);
 
-       if (sdkp) {
-               if (sdkp->WCE) {
-                       memset(rq->cmd, 0, sizeof(rq->cmd));
-                       rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
-                       rq->timeout = SD_TIMEOUT;
-                       rq->cmd[0] = SYNCHRONIZE_CACHE;
-                       ret = 1;
-               }
-               scsi_disk_put(sdkp);
-       }
-       return ret;
+       if (!sdkp || !sdkp->WCE)
+               return 0;
+
+       memset(rq->cmd, 0, sizeof(rq->cmd));
+       rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
+       rq->timeout = SD_TIMEOUT;
+       rq->cmd[0] = SYNCHRONIZE_CACHE;
+       return 1;
 }
 
 static void sd_rescan(struct device *dev)
index a0cace9aeb7991aae6abd9d0ab2e408d36b45d95..0ff83ddf13fe149d4ba736f4a13bcf1aa82b799a 100644 (file)
@@ -418,7 +418,7 @@ static inline void borken_wait (void)
 #define ULOOP( i ) for (clock = i*8;;)
 #define TIMEOUT (!(clock--))
 
-int __init seagate_st0x_detect (Scsi_Host_Template * tpnt)
+int __init seagate_st0x_detect (struct scsi_host_template * tpnt)
 {
        struct Scsi_Host *instance;
        int i, j;
@@ -1649,7 +1649,7 @@ static int seagate_st0x_release(struct Scsi_Host *shost)
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .detect                 = seagate_st0x_detect,
        .release                = seagate_st0x_release,
        .info                   = seagate_st0x_info,
index 8889ff1a6b20c861d09ef099d76df854728ac476..fb5f380fa4b39957f8f9bba3ffb05ba25f43d8d7 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef _SEAGATE_H
 #define SEAGATE_H
 
-static int seagate_st0x_detect(Scsi_Host_Template *);
+static int seagate_st0x_detect(struct scsi_host_template *);
 static int seagate_st0x_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 
 static int seagate_st0x_abort(Scsi_Cmnd *);
index f37147f8f7bfa2494d560f1a044132a6a3038ca3..bf2ceb54354c50d3dabbb4f1730cbb39f36d19e2 100644 (file)
@@ -217,7 +217,7 @@ static inline void init_hpc_chain(struct hpc_data *hd)
 }
 
 static struct Scsi_Host * __init sgiwd93_setup_scsi(
-       Scsi_Host_Template *SGIblows, int unit, int irq,
+       struct scsi_host_template *SGIblows, int unit, int irq,
        struct hpc3_scsiregs *hregs, unsigned char *wdregs)
 {
        struct ip22_hostdata *hdata;
@@ -265,7 +265,7 @@ out_unregister:
        return NULL;
 }
 
-int __init sgiwd93_detect(Scsi_Host_Template *SGIblows)
+int __init sgiwd93_detect(struct scsi_host_template *SGIblows)
 {
        int found = 0;
 
@@ -324,7 +324,7 @@ static int sgiwd93_bus_reset(Scsi_Cmnd *cmd)
  * arguments not with pointers.  So this is going to blow up beautyfully
  * on 64-bit systems with memory outside the compat address spaces.
  */
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "SGIWD93",
        .name                   = "SGI WD93",
        .detect                 = sgiwd93_detect,
index 7e19589e71a06c33d6cf94558c390b0b88f14457..c041bfd56e12c4cc87ed3e906bbbdc7460528274 100644 (file)
  */
 
 static struct Scsi_Host *first_instance = NULL;
-static Scsi_Host_Template *the_template = NULL;
+static struct scsi_host_template *the_template = NULL;
 
 /* Macros ease life... :-) */
 #define        SETUP_HOSTDATA(in)                              \
index e3ea99f23d60187dbc3c2a7e3ec0f160ca3f8f9e..837173415d4c8442ae7bb036be84452b7c1d615e 100644 (file)
@@ -185,7 +185,7 @@ static inline void sun3_udc_write(unsigned short val, unsigned char reg)
 static struct Scsi_Host *default_instance;
 
 /*
- * Function : int sun3scsi_detect(Scsi_Host_Template * tpnt)
+ * Function : int sun3scsi_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : initializes mac NCR5380 driver based on the
  *     command line / compile time port and irq definitions.
@@ -196,7 +196,7 @@ static struct Scsi_Host *default_instance;
  *
  */
  
-int sun3scsi_detect(Scsi_Host_Template * tpnt)
+int sun3scsi_detect(struct scsi_host_template * tpnt)
 {
        unsigned long ioaddr;
        static int called = 0;
@@ -621,7 +621,7 @@ static int sun3scsi_dma_finish(int write_flag)
        
 #include "sun3_NCR5380.c"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = SUN3_SCSI_NAME,
        .detect                 = sun3scsi_detect,
        .release                = sun3scsi_release,
index 155282b92a950cf6f5d96dfb02fecbc57ed8dbed..834dab4280199c3a719ca6f23cd240378f0ea134 100644 (file)
@@ -48,7 +48,7 @@
 #define IOBASE_SUN3_VMESCSI 0xff200000
 
 static int sun3scsi_abort (Scsi_Cmnd *);
-static int sun3scsi_detect (Scsi_Host_Template *);
+static int sun3scsi_detect (struct scsi_host_template *);
 static const char *sun3scsi_info (struct Scsi_Host *);
 static int sun3scsi_bus_reset(Scsi_Cmnd *);
 static int sun3scsi_queue_command (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index 9acb5ddebb07435ea4d09be73c9fe76f53dd027a..008a82ab8521e9142bc4845e0f03298a7645ca75 100644 (file)
@@ -127,7 +127,7 @@ static inline void sun3scsi_write(int reg, int value)
 static struct Scsi_Host *default_instance;
 
 /*
- * Function : int sun3scsi_detect(Scsi_Host_Template * tpnt)
+ * Function : int sun3scsi_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : initializes mac NCR5380 driver based on the
  *     command line / compile time port and irq definitions.
@@ -138,7 +138,7 @@ static struct Scsi_Host *default_instance;
  *
  */
  
-static int sun3scsi_detect(Scsi_Host_Template * tpnt)
+static int sun3scsi_detect(struct scsi_host_template * tpnt)
 {
        unsigned long ioaddr, irq = 0;
        static int called = 0;
@@ -564,7 +564,7 @@ static int sun3scsi_dma_finish(int write_flag)
 
 #include "sun3_NCR5380.c"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                   = SUN3_SCSI_NAME,
        .detect                 = sun3scsi_detect,
        .release                = sun3scsi_release,
index 09d7639079b4897500e65f4eb1a64147403ebb27..cc990bed9683a61f9b9a5488710c9f8206807277 100644 (file)
@@ -47,7 +47,7 @@ static void dma_advance_sg (Scsi_Cmnd *sp);
 /* Detecting ESP chips on the machine.  This is the simple and easy
  * version.
  */
-int sun3x_esp_detect(Scsi_Host_Template *tpnt)
+int sun3x_esp_detect(struct scsi_host_template *tpnt)
 {
        struct NCR_ESP *esp;
        struct ConfigDev *esp_dev;
@@ -367,7 +367,7 @@ static int sun3x_esp_release(struct Scsi_Host *instance)
 
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name              = "sun3x_esp",
        .proc_info              = &esp_proc_info,
        .name                   = "Sun ESP 100/100a/200",
index 93dc7b665ccffcf5c4e6917dd54e17b484795541..8640253d6215051c16d5603d9c818f079f8de621 100644 (file)
@@ -633,7 +633,7 @@ static void sym53c416_probe(void)
        }
 }
 
-int __init sym53c416_detect(Scsi_Host_Template *tpnt)
+int __init sym53c416_detect(struct scsi_host_template *tpnt)
 {
        unsigned long flags;
        struct Scsi_Host * shpnt = NULL;
@@ -849,7 +849,7 @@ module_param_array(sym53c416_3, uint, NULL, 0);
 
 #endif
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name =            "sym53c416",
        .name =                 "Symbios Logic 53c416",
        .detect =               sym53c416_detect,
index fd6b120d38c4224e16c13b09e32d8084ed198fad..77860d0748ffc4d7c1eca48167f146427186524e 100644 (file)
@@ -22,7 +22,7 @@
 
 #define SYM53C416_SCSI_ID 7
 
-static int sym53c416_detect(Scsi_Host_Template *);
+static int sym53c416_detect(struct scsi_host_template *);
 static const char *sym53c416_info(struct Scsi_Host *);
 static int sym53c416_release(struct Scsi_Host *);
 static int sym53c416_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
index f4b780e35cb66b8299bcb7bf37951012123ff5e3..21305fc91479c039c514568c29edd265fdd45e21 100644 (file)
@@ -183,7 +183,7 @@ void __init t128_setup(char *str, int *ints){
 }
 
 /* 
- * Function : int t128_detect(Scsi_Host_Template * tpnt)
+ * Function : int t128_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : detects and initializes T128,T128F, or T228 controllers
  *     that were autoprobed, overridden on the LILO command line, 
@@ -195,7 +195,7 @@ void __init t128_setup(char *str, int *ints){
  *
  */
 
-int __init t128_detect(Scsi_Host_Template * tpnt){
+int __init t128_detect(struct scsi_host_template * tpnt){
     static int current_override = 0, current_base = 0;
     struct Scsi_Host *instance;
     unsigned long base;
@@ -430,7 +430,7 @@ MODULE_LICENSE("GPL");
 
 #include "NCR5380.c"
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name           = "Trantor T128/T128F/T228",
        .detect         = t128_detect,
        .release        = t128_release,
index 596f3a32a1c61ffbf64e1c593159bdc8e6e3d208..646e840266e29fb2b6a0fce71aef1906386b279f 100644 (file)
@@ -95,7 +95,7 @@
 static int t128_abort(Scsi_Cmnd *);
 static int t128_biosparam(struct scsi_device *, struct block_device *,
                          sector_t, int*);
-static int t128_detect(Scsi_Host_Template *);
+static int t128_detect(struct scsi_host_template *);
 static int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int t128_bus_reset(Scsi_Cmnd *);
 
index 1ce29ba683eb72a8953adb95cd9fa0e2d660d83c..33cd90fc657b839d0659768e4f013ccb88b9e4f7 100644 (file)
  *  clustering is enabled. ENABLE_CLUSTERING provides a performance increase
  *  up to 50% on sequential access.
  *
- *  Since the Scsi_Host_Template structure is shared among all 14F and 34F,
+ *  Since the struct scsi_host_template structure is shared among all 14F and 34F,
  *  the last setting of use_clustering is in effect for all of these boards.
  *
  *  Here a sample configuration using two U14F boards:
index 486551bd54baf16b1f7603492d2bedd31e3e497a..e681681ab7a2c91e88efc933eb66c8b0e807fd02 100644 (file)
@@ -343,7 +343,7 @@ static void log_ultrastor_abort(struct ultrastor_config *config,
 }
 #endif
 
-static int ultrastor_14f_detect(Scsi_Host_Template * tpnt)
+static int ultrastor_14f_detect(struct scsi_host_template * tpnt)
 {
     size_t i;
     unsigned char in_byte, version_byte = 0;
@@ -525,7 +525,7 @@ out_release_port:
     return FALSE;
 }
 
-static int ultrastor_24f_detect(Scsi_Host_Template * tpnt)
+static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
 {
   int i;
   struct Scsi_Host * shpnt = NULL;
@@ -637,7 +637,7 @@ static int ultrastor_24f_detect(Scsi_Host_Template * tpnt)
   return FALSE;
 }
 
-static int ultrastor_detect(Scsi_Host_Template * tpnt)
+static int ultrastor_detect(struct scsi_host_template * tpnt)
 {
        tpnt->proc_name = "ultrastor";
        return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
@@ -1184,7 +1184,7 @@ static irqreturn_t do_ultrastor_interrupt(int irq, void *dev_id,
 
 MODULE_LICENSE("GPL");
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name              = "UltraStor 14F/24F/34F",
        .detect            = ultrastor_detect,
        .release           = ultrastor_release,
index 0a0f8df9e8712ffb293bccb02bd374948b93c679..da759a11deffe6491ee80c21a1f53df4d479b4d1 100644 (file)
@@ -13,7 +13,7 @@
 #ifndef _ULTRASTOR_H
 #define _ULTRASTOR_H
 
-static int ultrastor_detect(Scsi_Host_Template *);
+static int ultrastor_detect(struct scsi_host_template *);
 static const char *ultrastor_info(struct Scsi_Host * shpnt);
 static int ultrastor_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
 static int ultrastor_abort(Scsi_Cmnd *);
index 2efb317153ce19a8ca7d974c3b18b03bddb62c60..67e9afa000c135bdcd8b621dc39677e36e575945 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/keyboard.h>
 #include <linux/init.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
 
@@ -1343,7 +1344,7 @@ static void show_serial_version(void)
        printk("MC68328 serial driver version 1.00\n");
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
 /* Serial Power management
  *  The console (currently fixed at line 0) is a special case for power
  *  management because the kernel is so chatty. The console will be 
@@ -1393,7 +1394,7 @@ void startup_console(void)
        struct m68k_serial *info = &m68k_soft[0];
        startup(info);
 }
-#endif
+#endif /* CONFIG_PM_LEGACY */
 
 
 static struct tty_operations rs_ops = {
@@ -1486,7 +1487,7 @@ rs68328_init(void)
                            IRQ_FLG_STD,
                            "M68328_UART", NULL))
                 panic("Unable to attach 68328 serial interrupt\n");
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
            serial_pm[i] = pm_register(PM_SYS_DEV, PM_SYS_COM, serial_pm_callback);
            if (serial_pm[i])
                    serial_pm[i]->data = info;
index 98820603e75fd2a4a7b27206817744d60c10f833..e08510d09ff6fa6ef26ec6832781b6dd90ef9b2a 100644 (file)
@@ -999,7 +999,10 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
        serial_outp(up, UART_MCR, save_mcr);
        serial8250_clear_fifos(up);
        (void)serial_in(up, UART_RX);
-       serial_outp(up, UART_IER, 0);
+       if (up->capabilities & UART_CAP_UUE)
+               serial_outp(up, UART_IER, UART_IER_UUE);
+       else
+               serial_outp(up, UART_IER, 0);
 
  out:  
        spin_unlock_irqrestore(&up->port.lock, flags);
@@ -2381,9 +2384,9 @@ void serial8250_resume_port(int line)
  * list is terminated with a zero flags entry, which means we expect
  * all entries to have at least UPF_BOOT_AUTOCONF set.
  */
-static int __devinit serial8250_probe(struct device *dev)
+static int __devinit serial8250_probe(struct platform_device *dev)
 {
-       struct plat_serial8250_port *p = dev->platform_data;
+       struct plat_serial8250_port *p = dev->dev.platform_data;
        struct uart_port port;
        int ret, i;
 
@@ -2399,12 +2402,12 @@ static int __devinit serial8250_probe(struct device *dev)
                port.flags      = p->flags;
                port.mapbase    = p->mapbase;
                port.hub6       = p->hub6;
-               port.dev        = dev;
+               port.dev        = &dev->dev;
                if (share_irqs)
                        port.flags |= UPF_SHARE_IRQ;
                ret = serial8250_register_port(&port);
                if (ret < 0) {
-                       dev_err(dev, "unable to register port at index %d "
+                       dev_err(&dev->dev, "unable to register port at index %d "
                                "(IO%lx MEM%lx IRQ%d): %d\n", i,
                                p->iobase, p->mapbase, p->irq, ret);
                }
@@ -2415,54 +2418,55 @@ static int __devinit serial8250_probe(struct device *dev)
 /*
  * Remove serial ports registered against a platform device.
  */
-static int __devexit serial8250_remove(struct device *dev)
+static int __devexit serial8250_remove(struct platform_device *dev)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.dev == dev)
+               if (up->port.dev == &dev->dev)
                        serial8250_unregister_port(i);
        }
        return 0;
 }
 
-static int serial8250_suspend(struct device *dev, pm_message_t state)
+static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.type != PORT_UNKNOWN && up->port.dev == dev)
+               if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
                        uart_suspend_port(&serial8250_reg, &up->port);
        }
 
        return 0;
 }
 
-static int serial8250_resume(struct device *dev)
+static int serial8250_resume(struct platform_device *dev)
 {
        int i;
 
        for (i = 0; i < UART_NR; i++) {
                struct uart_8250_port *up = &serial8250_ports[i];
 
-               if (up->port.type != PORT_UNKNOWN && up->port.dev == dev)
+               if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
                        uart_resume_port(&serial8250_reg, &up->port);
        }
 
        return 0;
 }
 
-static struct device_driver serial8250_isa_driver = {
-       .name           = "serial8250",
-       .bus            = &platform_bus_type,
+static struct platform_driver serial8250_isa_driver = {
        .probe          = serial8250_probe,
        .remove         = __devexit_p(serial8250_remove),
        .suspend        = serial8250_suspend,
        .resume         = serial8250_resume,
+       .driver         = {
+               .name   = "serial8250",
+       },
 };
 
 /*
@@ -2608,7 +2612,7 @@ static int __init serial8250_init(void)
 
        serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
 
-       ret = driver_register(&serial8250_isa_driver);
+       ret = platform_driver_register(&serial8250_isa_driver);
        if (ret == 0)
                goto out;
 
@@ -2630,7 +2634,7 @@ static void __exit serial8250_exit(void)
         */
        serial8250_isa_devs = NULL;
 
-       driver_unregister(&serial8250_isa_driver);
+       platform_driver_unregister(&serial8250_isa_driver);
        platform_device_unregister(isa_dev);
 
        uart_unregister_driver(&serial8250_reg);
index 5d8660a42b77e1a77e805c433e632c34d98a32c5..b79ed0665d519f199c6bb16cf946d42bd7626754 100644 (file)
@@ -323,6 +323,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "USR9180",              0       },
        /* U.S. Robotics 56K Voice INT PnP*/
        {       "USR9190",              0       },
+       /* HP Compaq Tablet PC tc1100 Wacom tablet */
+       {       "WACF005",              0       },
        /* Rockwell's (PORALiNK) 33600 INT PNP */
        {       "WCI0003",              0       },
        /* Unkown PnP modems */
index ff36f0c9fdad7f152144bd31a0ede55a5cf72290..ad47c1b84c3f0677f0d6459c89294e4eb912d331 100644 (file)
@@ -507,7 +507,7 @@ config SERIAL_SUNSU_CONSOLE
 
 config SERIAL_MUX
        tristate "Serial MUX support"
-       depends on PARISC
+       depends on GSC
        select SERIAL_CORE
        default y
        ---help---
index 25825f2aba2279abc005ab49c11cfd59c9ab5390..987d22b53c220966152eb22a2b92b07d00517f07 100644 (file)
@@ -7,7 +7,7 @@
  *  Based on ppc8xx.c by Thomas Gleixner
  *  Based on drivers/serial/amba.c by Russell King
  *
- *  Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
+ *  Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
  *              Pantelis Antoniou (panto@intracom.gr) (CPM1)
  *
  *  Copyright (C) 2004 Freescale Semiconductor, Inc.
index 4b0786e7eb7ff6ba2ca3b85b4887badef8d72938..d789ee55cbb762c5f17c942af6dade7180d1dbd0 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  Driver for CPM (SCC/SMC) serial ports; CPM1 definitions
  *
- *  Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
+ *  Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
  *              Pantelis Antoniou (panto@intracom.gr) (CPM1)
  *
  *  Copyright (C) 2004 Freescale Semiconductor, Inc.
index 15ad58d94889f431bfc4899dea71a65b1d2f7e86..fd9e53ed3feb934a2efea256f76cb13f5e9aa546 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  Driver for CPM (SCC/SMC) serial ports; CPM2 definitions
  *
- *  Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
+ *  Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
  *              Pantelis Antoniou (panto@intracom.gr) (CPM1)
  * 
  *  Copyright (C) 2004 Freescale Semiconductor, Inc.
index e63b9dffc8d7304ecd6fcfaa2b363ffd07838131..4d8516d1bb71692d217e50ab5934c8862643b3ab 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * dz.c: Serial port driver for DECStations equiped 
+ * dz.c: Serial port driver for DECStations equiped
  *       with the DZ chipset.
  *
- * Copyright (C) 1998 Olivier A. D. Lebaillif 
- *             
+ * Copyright (C) 1998 Olivier A. D. Lebaillif
+ *
  * Email: olivier.lebaillif@ifrsys.com
  *
  * [31-AUG-98] triemer
  * removed base_addr code - moving address assignment to setup.c
  * Changed name of dz_init to rs_init to be consistent with tc code
  * [13-NOV-98] triemer fixed code to receive characters
- *    after patches by harald to irq code.  
+ *    after patches by harald to irq code.
  * [09-JAN-99] triemer minor fix for schedule - due to removal of timeout
  *            field from "current" - somewhere between 2.1.121 and 2.1.131
  Qua Jun 27 15:02:26 BRT 2001
  * [27-JUN-2001] Arnaldo Carvalho de Melo <acme@conectiva.com.br> - cleanups
- *  
- * Parts (C) 1999 David Airlie, airlied@linux.ie 
- * [07-SEP-99] Bugfixes 
+ *
+ * Parts (C) 1999 David Airlie, airlied@linux.ie
+ * [07-SEP-99] Bugfixes
  *
  * [06-Jan-2002] Russell King <rmk@arm.linux.org.uk>
  * Converted to new serial core
@@ -64,7 +64,7 @@ static struct dz_port dz_ports[DZ_NB_PORT];
 
 #ifdef DEBUG_DZ
 /*
- * debugging code to send out chars via prom 
+ * debugging code to send out chars via prom
  */
 static void debug_console(const char *s, int count)
 {
@@ -82,7 +82,7 @@ static void debug_console(const char *s, int count)
  * ------------------------------------------------------------
  * dz_in () and dz_out ()
  *
- * These routines are used to access the registers of the DZ 
+ * These routines are used to access the registers of the DZ
  * chip, hiding relocation differences between implementation.
  * ------------------------------------------------------------
  */
@@ -106,8 +106,8 @@ static inline void dz_out(struct dz_port *dport, unsigned offset,
  * ------------------------------------------------------------
  * rs_stop () and rs_start ()
  *
- * These routines are called before setting or resetting 
- * tty->stopped. They enable or disable transmitter interrupts, 
+ * These routines are called before setting or resetting
+ * tty->stopped. They enable or disable transmitter interrupts,
  * as necessary.
  * ------------------------------------------------------------
  */
@@ -156,17 +156,17 @@ static void dz_enable_ms(struct uart_port *port)
 
 /*
  * ------------------------------------------------------------
- * Here starts the interrupt handling routines.  All of the 
- * following subroutines are declared as inline and are folded 
- * into dz_interrupt.  They were separated out for readability's 
- * sake. 
+ * Here starts the interrupt handling routines.  All of the
+ * following subroutines are declared as inline and are folded
+ * into dz_interrupt.  They were separated out for readability's
+ * sake.
  *
  * Note: rs_interrupt() is a "fast" interrupt, which means that it
  * runs with interrupts turned off.  People who may want to modify
  * rs_interrupt() should try to keep the interrupt handler as fast as
  * possible.  After you are done making modifications, it is not a bad
  * idea to do:
- * 
+ *
  *     make drivers/serial/dz.s
  *
  * and look at the resulting assemble code in dz.s.
@@ -403,7 +403,7 @@ static void dz_set_mctrl(struct uart_port *uport, unsigned int mctrl)
  * startup ()
  *
  * various initialization tasks
- * ------------------------------------------------------------------- 
+ * -------------------------------------------------------------------
  */
 static int dz_startup(struct uart_port *uport)
 {
@@ -430,13 +430,13 @@ static int dz_startup(struct uart_port *uport)
        return 0;
 }
 
-/* 
+/*
  * -------------------------------------------------------------------
  * shutdown ()
  *
  * This routine will shutdown a serial port; interrupts are disabled, and
  * DTR is dropped if the hangup on close termio flag is on.
- * ------------------------------------------------------------------- 
+ * -------------------------------------------------------------------
  */
 static void dz_shutdown(struct uart_port *uport)
 {
@@ -451,7 +451,7 @@ static void dz_shutdown(struct uart_port *uport)
  *          release the bus after transmitting. This must be done when
  *          the transmit shift register is empty, not be done when the
  *          transmit holding register is empty.  This functionality
- *          allows an RS485 driver to be written in user space. 
+ *          allows an RS485 driver to be written in user space.
  */
 static unsigned int dz_tx_empty(struct uart_port *uport)
 {
@@ -645,9 +645,9 @@ static void __init dz_init_ports(void)
 
        if (mips_machtype == MACH_DS23100 ||
            mips_machtype == MACH_DS5100)
-               base = (unsigned long) KN01_DZ11_BASE;
+               base = CKSEG1ADDR(KN01_SLOT_BASE + KN01_DZ11);
        else
-               base = (unsigned long) KN02_DZ11_BASE;
+               base = CKSEG1ADDR(KN02_SLOT_BASE + KN02_DZ11);
 
        for (i = 0, dport = dz_ports; i < DZ_NB_PORT; i++, dport++) {
                spin_lock_init(&dport->port.lock);
@@ -695,13 +695,13 @@ static void dz_console_put_char(struct dz_port *dport, unsigned char ch)
 
        spin_unlock_irqrestore(&dport->port.lock, flags);
 }
-/* 
+/*
  * -------------------------------------------------------------------
  * dz_console_print ()
  *
  * dz_console_print is registered for printk.
  * The console must be locked when we get here.
- * ------------------------------------------------------------------- 
+ * -------------------------------------------------------------------
  */
 static void dz_console_print(struct console *cons,
                             const char *str,
index 4a54ff5847003855e7643e3f57f64eb0947bb0eb..355cd93a8a873aa277dbcc65bf3d4c41c5f49d0e 100644 (file)
@@ -921,9 +921,9 @@ static struct uart_driver imx_reg = {
        .cons           = IMX_CONSOLE,
 };
 
-static int serial_imx_suspend(struct device *_dev, pm_message_t state)
+static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
 {
-        struct imx_port *sport = dev_get_drvdata(_dev);
+        struct imx_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_suspend_port(&imx_reg, &sport->port);
@@ -931,9 +931,9 @@ static int serial_imx_suspend(struct device *_dev, pm_message_t state)
         return 0;
 }
 
-static int serial_imx_resume(struct device *_dev)
+static int serial_imx_resume(struct platform_device *dev)
 {
-        struct imx_port *sport = dev_get_drvdata(_dev);
+        struct imx_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_resume_port(&imx_reg, &sport->port);
@@ -941,21 +941,19 @@ static int serial_imx_resume(struct device *_dev)
         return 0;
 }
 
-static int serial_imx_probe(struct device *_dev)
+static int serial_imx_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-
-       imx_ports[dev->id].port.dev = _dev;
+       imx_ports[dev->id].port.dev = &dev->dev;
        uart_add_one_port(&imx_reg, &imx_ports[dev->id].port);
-       dev_set_drvdata(_dev, &imx_ports[dev->id]);
+       platform_set_drvdata(dev, &imx_ports[dev->id]);
        return 0;
 }
 
-static int serial_imx_remove(struct device *_dev)
+static int serial_imx_remove(struct platform_device *dev)
 {
-       struct imx_port *sport = dev_get_drvdata(_dev);
+       struct imx_port *sport = platform_get_drvdata(dev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (sport)
                uart_remove_one_port(&imx_reg, &sport->port);
@@ -963,14 +961,15 @@ static int serial_imx_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver serial_imx_driver = {
-        .name           = "imx-uart",
-        .bus            = &platform_bus_type,
+static struct platform_driver serial_imx_driver = {
         .probe          = serial_imx_probe,
         .remove         = serial_imx_remove,
 
        .suspend        = serial_imx_suspend,
        .resume         = serial_imx_resume,
+       .driver         = {
+               .name   = "imx-uart",
+       },
 };
 
 static int __init imx_serial_init(void)
@@ -985,7 +984,7 @@ static int __init imx_serial_init(void)
        if (ret)
                return ret;
 
-       ret = driver_register(&serial_imx_driver);
+       ret = platform_driver_register(&serial_imx_driver);
        if (ret != 0)
                uart_unregister_driver(&imx_reg);
 
index 0dd08a09e7e693aded568a69ae827ca436534a7d..b8727d9bf690d7322007301c70646d8ebd136860 100644 (file)
@@ -717,16 +717,15 @@ static struct uart_driver mpc52xx_uart_driver = {
 /* ======================================================================== */
 
 static int __devinit
-mpc52xx_uart_probe(struct device *dev)
+mpc52xx_uart_probe(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct resource *res = pdev->resource;
+       struct resource *res = dev->resource;
 
        struct uart_port *port = NULL;
        int i, idx, ret;
 
        /* Check validity & presence */
-       idx = pdev->id;
+       idx = dev->id;
        if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
                return -EINVAL;
 
@@ -749,7 +748,7 @@ mpc52xx_uart_probe(struct device *dev)
        port->ops       = &mpc52xx_uart_ops;
 
        /* Search for IRQ and mapbase */
-       for (i=0 ; i<pdev->num_resources ; i++, res++) {
+       for (i=0 ; i<dev->num_resources ; i++, res++) {
                if (res->flags & IORESOURCE_MEM)
                        port->mapbase = res->start;
                else if (res->flags & IORESOURCE_IRQ)
@@ -761,17 +760,17 @@ mpc52xx_uart_probe(struct device *dev)
        /* Add the port to the uart sub-system */
        ret = uart_add_one_port(&mpc52xx_uart_driver, port);
        if (!ret)
-               dev_set_drvdata(dev, (void*)port);
+               platform_set_drvdata(dev, (void*)port);
 
        return ret;
 }
 
 static int
-mpc52xx_uart_remove(struct device *dev)
+mpc52xx_uart_remove(struct platform_device *dev)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (port)
                uart_remove_one_port(&mpc52xx_uart_driver, port);
@@ -781,9 +780,9 @@ mpc52xx_uart_remove(struct device *dev)
 
 #ifdef CONFIG_PM
 static int
-mpc52xx_uart_suspend(struct device *dev, pm_message_t state)
+mpc52xx_uart_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
        if (sport)
                uart_suspend_port(&mpc52xx_uart_driver, port);
@@ -792,9 +791,9 @@ mpc52xx_uart_suspend(struct device *dev, pm_message_t state)
 }
 
 static int
-mpc52xx_uart_resume(struct device *dev)
+mpc52xx_uart_resume(struct platform_device *dev)
 {
-       struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev);
+       struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
 
        if (port)
                uart_resume_port(&mpc52xx_uart_driver, port);
@@ -803,15 +802,16 @@ mpc52xx_uart_resume(struct device *dev)
 }
 #endif
 
-static struct device_driver mpc52xx_uart_platform_driver = {
-       .name           = "mpc52xx-psc",
-       .bus            = &platform_bus_type,
+static struct platform_driver mpc52xx_uart_platform_driver = {
        .probe          = mpc52xx_uart_probe,
        .remove         = mpc52xx_uart_remove,
 #ifdef CONFIG_PM
        .suspend        = mpc52xx_uart_suspend,
        .resume         = mpc52xx_uart_resume,
 #endif
+       .driver         = {
+               .name   = "mpc52xx-psc",
+       },
 };
 
 
@@ -828,7 +828,7 @@ mpc52xx_uart_init(void)
 
        ret = uart_register_driver(&mpc52xx_uart_driver);
        if (ret == 0) {
-               ret = driver_register(&mpc52xx_uart_platform_driver);
+               ret = platform_driver_register(&mpc52xx_uart_platform_driver);
                if (ret)
                        uart_unregister_driver(&mpc52xx_uart_driver);
        }
@@ -839,7 +839,7 @@ mpc52xx_uart_init(void)
 static void __exit
 mpc52xx_uart_exit(void)
 {
-       driver_unregister(&mpc52xx_uart_platform_driver);
+       platform_driver_unregister(&mpc52xx_uart_platform_driver);
        uart_unregister_driver(&mpc52xx_uart_driver);
 }
 
index ba8838b234da7b89cfa2575a8689034b5b2cb3e9..8f83e4007ecdf787fa9d890c37571afe41e2a43f 100644 (file)
@@ -1551,15 +1551,14 @@ mpsc_shared_unmap_regs(void)
 }
 
 static int
-mpsc_shared_drv_probe(struct device *dev)
+mpsc_shared_drv_probe(struct platform_device *dev)
 {
-       struct platform_device          *pd = to_platform_device(dev);
        struct mpsc_shared_pdata        *pdata;
        int                              rc = -ENODEV;
 
-       if (pd->id == 0) {
-               if (!(rc = mpsc_shared_map_regs(pd)))  {
-                       pdata = (struct mpsc_shared_pdata *)dev->platform_data;
+       if (dev->id == 0) {
+               if (!(rc = mpsc_shared_map_regs(dev)))  {
+                       pdata = (struct mpsc_shared_pdata *)dev->dev.platform_data;
 
                        mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val;
                        mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val;
@@ -1577,12 +1576,11 @@ mpsc_shared_drv_probe(struct device *dev)
 }
 
 static int
-mpsc_shared_drv_remove(struct device *dev)
+mpsc_shared_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
        int     rc = -ENODEV;
 
-       if (pd->id == 0) {
+       if (dev->id == 0) {
                mpsc_shared_unmap_regs();
                mpsc_shared_regs.MPSC_MRR_m = 0;
                mpsc_shared_regs.MPSC_RCRR_m = 0;
@@ -1595,11 +1593,12 @@ mpsc_shared_drv_remove(struct device *dev)
        return rc;
 }
 
-static struct device_driver mpsc_shared_driver = {
-       .name   = MPSC_SHARED_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mpsc_shared_driver = {
        .probe  = mpsc_shared_drv_probe,
        .remove = mpsc_shared_drv_remove,
+       .driver = {
+               .name = MPSC_SHARED_NAME,
+       },
 };
 
 /*
@@ -1732,19 +1731,18 @@ mpsc_drv_get_platform_data(struct mpsc_port_info *pi,
 }
 
 static int
-mpsc_drv_probe(struct device *dev)
+mpsc_drv_probe(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
        struct mpsc_port_info   *pi;
        int                     rc = -ENODEV;
 
-       pr_debug("mpsc_drv_probe: Adding MPSC %d\n", pd->id);
+       pr_debug("mpsc_drv_probe: Adding MPSC %d\n", dev->id);
 
-       if (pd->id < MPSC_NUM_CTLRS) {
-               pi = &mpsc_ports[pd->id];
+       if (dev->id < MPSC_NUM_CTLRS) {
+               pi = &mpsc_ports[dev->id];
 
-               if (!(rc = mpsc_drv_map_regs(pi, pd))) {
-                       mpsc_drv_get_platform_data(pi, pd, pd->id);
+               if (!(rc = mpsc_drv_map_regs(pi, dev))) {
+                       mpsc_drv_get_platform_data(pi, dev, dev->id);
 
                        if (!(rc = mpsc_make_ready(pi)))
                                if (!(rc = uart_add_one_port(&mpsc_reg,
@@ -1764,27 +1762,26 @@ mpsc_drv_probe(struct device *dev)
 }
 
 static int
-mpsc_drv_remove(struct device *dev)
+mpsc_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pd = to_platform_device(dev);
+       pr_debug("mpsc_drv_exit: Removing MPSC %d\n", dev->id);
 
-       pr_debug("mpsc_drv_exit: Removing MPSC %d\n", pd->id);
-
-       if (pd->id < MPSC_NUM_CTLRS) {
-               uart_remove_one_port(&mpsc_reg, &mpsc_ports[pd->id].port);
-               mpsc_release_port((struct uart_port *)&mpsc_ports[pd->id].port);
-               mpsc_drv_unmap_regs(&mpsc_ports[pd->id]);
+       if (dev->id < MPSC_NUM_CTLRS) {
+               uart_remove_one_port(&mpsc_reg, &mpsc_ports[dev->id].port);
+               mpsc_release_port((struct uart_port *)&mpsc_ports[dev->id].port);
+               mpsc_drv_unmap_regs(&mpsc_ports[dev->id]);
                return 0;
        }
        else
                return -ENODEV;
 }
 
-static struct device_driver mpsc_driver = {
-       .name   = MPSC_CTLR_NAME,
-       .bus    = &platform_bus_type,
+static struct platform_driver mpsc_driver = {
        .probe  = mpsc_drv_probe,
        .remove = mpsc_drv_remove,
+       .driver = {
+               .name = MPSC_CTLR_NAME,
+       },
 };
 
 static int __init
@@ -1798,9 +1795,9 @@ mpsc_drv_init(void)
        memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs));
 
        if (!(rc = uart_register_driver(&mpsc_reg))) {
-               if (!(rc = driver_register(&mpsc_shared_driver))) {
-                       if ((rc = driver_register(&mpsc_driver))) {
-                               driver_unregister(&mpsc_shared_driver);
+               if (!(rc = platform_driver_register(&mpsc_shared_driver))) {
+                       if ((rc = platform_driver_register(&mpsc_driver))) {
+                               platform_driver_unregister(&mpsc_shared_driver);
                                uart_unregister_driver(&mpsc_reg);
                        }
                }
@@ -1815,8 +1812,8 @@ mpsc_drv_init(void)
 static void __exit
 mpsc_drv_exit(void)
 {
-       driver_unregister(&mpsc_driver);
-       driver_unregister(&mpsc_shared_driver);
+       platform_driver_unregister(&mpsc_driver);
+       platform_driver_unregister(&mpsc_shared_driver);
        uart_unregister_driver(&mpsc_reg);
        memset(mpsc_ports, 0, sizeof(mpsc_ports));
        memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs));
index 660bae5ba179bf87a5197905265f726f00b0165d..7633132a10aab7d553f96f156d2af34affb5ceda 100644 (file)
@@ -65,8 +65,8 @@ static struct uart_driver mux_driver = {
 
 static struct timer_list mux_timer;
 
-#define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET)
-#define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET)
+#define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET)
+#define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET)
 #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8
 
 /**
@@ -79,10 +79,7 @@ static struct timer_list mux_timer;
  */
 static unsigned int mux_tx_empty(struct uart_port *port)
 {
-       unsigned int cnt = __raw_readl((unsigned long)port->membase 
-                               + IO_DCOUNT_REG_OFFSET);
-
-       return cnt ? 0 : TIOCSER_TEMT;
+       return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT;
 } 
 
 /**
@@ -218,8 +215,7 @@ static void mux_read(struct uart_port *port)
        __u32 start_count = port->icount.rx;
 
        while(1) {
-               data = __raw_readl((unsigned long)port->membase
-                                               + IO_DATA_REG_OFFSET);
+               data = __raw_readl(port->membase + IO_DATA_REG_OFFSET);
 
                if (MUX_STATUS(data))
                        continue;
@@ -481,6 +477,13 @@ static int __init mux_probe(struct parisc_device *dev)
                port->ops       = &mux_pops;
                port->flags     = UPF_BOOT_AUTOCONF;
                port->line      = port_cnt;
+
+               /* The port->timeout needs to match what is present in
+                * uart_wait_until_sent in serial_core.c.  Otherwise
+                * the time spent in msleep_interruptable will be very
+                * long, causing the appearance of a console hang.
+                */
+               port->timeout   = HZ / 50;
                spin_lock_init(&port->lock);
                status = uart_add_one_port(&mux_driver, port);
                BUG_ON(status);
index 16b2f9417af9560aa040034357f06a383495b5b6..ff5e6309d682c132a455b5b285bfcd96af1b3cc2 100644 (file)
@@ -805,9 +805,9 @@ static struct uart_driver serial_pxa_reg = {
        .cons           = PXA_CONSOLE,
 };
 
-static int serial_pxa_suspend(struct device *_dev, pm_message_t state)
+static int serial_pxa_suspend(struct platform_device *dev, pm_message_t state)
 {
-        struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+        struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_suspend_port(&serial_pxa_reg, &sport->port);
@@ -815,9 +815,9 @@ static int serial_pxa_suspend(struct device *_dev, pm_message_t state)
         return 0;
 }
 
-static int serial_pxa_resume(struct device *_dev)
+static int serial_pxa_resume(struct platform_device *dev)
 {
-        struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+        struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
         if (sport)
                 uart_resume_port(&serial_pxa_reg, &sport->port);
@@ -825,21 +825,19 @@ static int serial_pxa_resume(struct device *_dev)
         return 0;
 }
 
-static int serial_pxa_probe(struct device *_dev)
+static int serial_pxa_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
-
-       serial_pxa_ports[dev->id].port.dev = _dev;
+       serial_pxa_ports[dev->id].port.dev = &dev->dev;
        uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port);
-       dev_set_drvdata(_dev, &serial_pxa_ports[dev->id]);
+       platform_set_drvdata(dev, &serial_pxa_ports[dev->id]);
        return 0;
 }
 
-static int serial_pxa_remove(struct device *_dev)
+static int serial_pxa_remove(struct platform_device *dev)
 {
-       struct uart_pxa_port *sport = dev_get_drvdata(_dev);
+       struct uart_pxa_port *sport = platform_get_drvdata(dev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if (sport)
                uart_remove_one_port(&serial_pxa_reg, &sport->port);
@@ -847,14 +845,15 @@ static int serial_pxa_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver serial_pxa_driver = {
-        .name           = "pxa2xx-uart",
-        .bus            = &platform_bus_type,
+static struct platform_driver serial_pxa_driver = {
         .probe          = serial_pxa_probe,
         .remove         = serial_pxa_remove,
 
        .suspend        = serial_pxa_suspend,
        .resume         = serial_pxa_resume,
+       .driver         = {
+               .name   = "pxa2xx-uart",
+       },
 };
 
 int __init serial_pxa_init(void)
@@ -865,7 +864,7 @@ int __init serial_pxa_init(void)
        if (ret != 0)
                return ret;
 
-       ret = driver_register(&serial_pxa_driver);
+       ret = platform_driver_register(&serial_pxa_driver);
        if (ret != 0)
                uart_unregister_driver(&serial_pxa_reg);
 
@@ -874,7 +873,7 @@ int __init serial_pxa_init(void)
 
 void __exit serial_pxa_exit(void)
 {
-        driver_unregister(&serial_pxa_driver);
+       platform_driver_unregister(&serial_pxa_driver);
        uart_unregister_driver(&serial_pxa_reg);
 }
 
index 036792328d499d4f6286174855897e4bb021ece1..47681c4654e4d110d1cd76ea4d37752881de8b0c 100644 (file)
@@ -1092,14 +1092,13 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
 
 static int probe_index = 0;
 
-static int s3c24xx_serial_probe(struct device *_dev,
+static int s3c24xx_serial_probe(struct platform_device *dev,
                                struct s3c24xx_uart_info *info)
 {
        struct s3c24xx_uart_port *ourport;
-       struct platform_device *dev = to_platform_device(_dev);
        int ret;
 
-       dbg("s3c24xx_serial_probe(%p, %p) %d\n", _dev, info, probe_index);
+       dbg("s3c24xx_serial_probe(%p, %p) %d\n", dev, info, probe_index);
 
        ourport = &s3c24xx_serial_ports[probe_index];
        probe_index++;
@@ -1112,7 +1111,7 @@ static int s3c24xx_serial_probe(struct device *_dev,
 
        dbg("%s: adding port\n", __FUNCTION__);
        uart_add_one_port(&s3c24xx_uart_drv, &ourport->port);
-       dev_set_drvdata(_dev, &ourport->port);
+       platform_set_drvdata(dev, &ourport->port);
 
        return 0;
 
@@ -1120,9 +1119,9 @@ static int s3c24xx_serial_probe(struct device *_dev,
        return ret;
 }
 
-static int s3c24xx_serial_remove(struct device *_dev)
+static int s3c24xx_serial_remove(struct platform_device *dev)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(_dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
 
        if (port)
                uart_remove_one_port(&s3c24xx_uart_drv, port);
@@ -1134,9 +1133,9 @@ static int s3c24xx_serial_remove(struct device *_dev)
 
 #ifdef CONFIG_PM
 
-static int s3c24xx_serial_suspend(struct device *dev, pm_message_t state)
+static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
 
        if (port)
                uart_suspend_port(&s3c24xx_uart_drv, port);
@@ -1144,9 +1143,9 @@ static int s3c24xx_serial_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c24xx_serial_resume(struct device *dev)
+static int s3c24xx_serial_resume(struct platform_device *dev)
 {
-       struct uart_port *port = s3c24xx_dev_to_port(dev);
+       struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
        struct s3c24xx_uart_port *ourport = to_ourport(port);
 
        if (port) {
@@ -1165,11 +1164,11 @@ static int s3c24xx_serial_resume(struct device *dev)
 #define s3c24xx_serial_resume  NULL
 #endif
 
-static int s3c24xx_serial_init(struct device_driver *drv,
+static int s3c24xx_serial_init(struct platform_driver *drv,
                               struct s3c24xx_uart_info *info)
 {
        dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
-       return driver_register(drv);
+       return platform_driver_register(drv);
 }
 
 
@@ -1228,19 +1227,20 @@ static struct s3c24xx_uart_info s3c2400_uart_inf = {
        .reset_port     = s3c2400_serial_resetport,
 };
 
-static int s3c2400_serial_probe(struct device *dev)
+static int s3c2400_serial_probe(struct platform_device *dev)
 {
        return s3c24xx_serial_probe(dev, &s3c2400_uart_inf);
 }
 
-static struct device_driver s3c2400_serial_drv = {
-       .name           = "s3c2400-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2400_serial_drv = {
        .probe          = s3c2400_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2400-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static inline int s3c2400_serial_init(void)
@@ -1250,7 +1250,7 @@ static inline int s3c2400_serial_init(void)
 
 static inline void s3c2400_serial_exit(void)
 {
-       driver_unregister(&s3c2400_serial_drv);
+       platform_driver_unregister(&s3c2400_serial_drv);
 }
 
 #define s3c2400_uart_inf_at &s3c2400_uart_inf
@@ -1332,19 +1332,20 @@ static struct s3c24xx_uart_info s3c2410_uart_inf = {
 
 /* device management */
 
-static int s3c2410_serial_probe(struct device *dev)
+static int s3c2410_serial_probe(struct platform_device *dev)
 {
        return s3c24xx_serial_probe(dev, &s3c2410_uart_inf);
 }
 
-static struct device_driver s3c2410_serial_drv = {
-       .name           = "s3c2410-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410_serial_drv = {
        .probe          = s3c2410_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2410-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static inline int s3c2410_serial_init(void)
@@ -1354,7 +1355,7 @@ static inline int s3c2410_serial_init(void)
 
 static inline void s3c2410_serial_exit(void)
 {
-       driver_unregister(&s3c2410_serial_drv);
+       platform_driver_unregister(&s3c2410_serial_drv);
 }
 
 #define s3c2410_uart_inf_at &s3c2410_uart_inf
@@ -1493,20 +1494,21 @@ static struct s3c24xx_uart_info s3c2440_uart_inf = {
 
 /* device management */
 
-static int s3c2440_serial_probe(struct device *dev)
+static int s3c2440_serial_probe(struct platform_device *dev)
 {
        dbg("s3c2440_serial_probe: dev=%p\n", dev);
        return s3c24xx_serial_probe(dev, &s3c2440_uart_inf);
 }
 
-static struct device_driver s3c2440_serial_drv = {
-       .name           = "s3c2440-uart",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2440_serial_drv = {
        .probe          = s3c2440_serial_probe,
        .remove         = s3c24xx_serial_remove,
        .suspend        = s3c24xx_serial_suspend,
        .resume         = s3c24xx_serial_resume,
+       .driver         = {
+               .name   = "s3c2440-uart",
+               .owner  = THIS_MODULE,
+       },
 };
 
 
@@ -1517,7 +1519,7 @@ static inline int s3c2440_serial_init(void)
 
 static inline void s3c2440_serial_exit(void)
 {
-       driver_unregister(&s3c2440_serial_drv);
+       platform_driver_unregister(&s3c2440_serial_drv);
 }
 
 #define s3c2440_uart_inf_at &s3c2440_uart_inf
index ed618cc7ae96e132ffcb5e9e32cfbe8de2d22675..0e3daf6d7b502575f05baf78d90bb7f37919f2d2 100644 (file)
@@ -156,7 +156,7 @@ static void sa1100_stop_tx(struct uart_port *port)
 }
 
 /*
- * interrupts may not be disabled on entry
+ * port locked and interrupts disabled
  */
 static void sa1100_start_tx(struct uart_port *port)
 {
@@ -164,11 +164,9 @@ static void sa1100_start_tx(struct uart_port *port)
        unsigned long flags;
        u32 utcr3;
 
-       spin_lock_irqsave(&sport->port.lock, flags);
        utcr3 = UART_GET_UTCR3(sport);
        sport->port.read_status_mask |= UTSR0_TO_SM(UTSR0_TFS);
        UART_PUT_UTCR3(sport, utcr3 | UTCR3_TIE);
-       spin_unlock_irqrestore(&sport->port.lock, flags);
 }
 
 /*
@@ -834,9 +832,9 @@ static struct uart_driver sa1100_reg = {
        .cons                   = SA1100_CONSOLE,
 };
 
-static int sa1100_serial_suspend(struct device *_dev, pm_message_t state)
+static int sa1100_serial_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(dev);
 
        if (sport)
                uart_suspend_port(&sa1100_reg, &sport->port);
@@ -844,9 +842,9 @@ static int sa1100_serial_suspend(struct device *_dev, pm_message_t state)
        return 0;
 }
 
-static int sa1100_serial_resume(struct device *_dev)
+static int sa1100_serial_resume(struct platform_device *dev)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(dev);
 
        if (sport)
                uart_resume_port(&sa1100_reg, &sport->port);
@@ -854,9 +852,8 @@ static int sa1100_serial_resume(struct device *_dev)
        return 0;
 }
 
-static int sa1100_serial_probe(struct device *_dev)
+static int sa1100_serial_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct resource *res = dev->resource;
        int i;
 
@@ -869,9 +866,9 @@ static int sa1100_serial_probe(struct device *_dev)
                        if (sa1100_ports[i].port.mapbase != res->start)
                                continue;
 
-                       sa1100_ports[i].port.dev = _dev;
+                       sa1100_ports[i].port.dev = &dev->dev;
                        uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
-                       dev_set_drvdata(_dev, &sa1100_ports[i]);
+                       platform_set_drvdata(dev, &sa1100_ports[i]);
                        break;
                }
        }
@@ -879,11 +876,11 @@ static int sa1100_serial_probe(struct device *_dev)
        return 0;
 }
 
-static int sa1100_serial_remove(struct device *_dev)
+static int sa1100_serial_remove(struct platform_device *pdev)
 {
-       struct sa1100_port *sport = dev_get_drvdata(_dev);
+       struct sa1100_port *sport = platform_get_drvdata(pdev);
 
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        if (sport)
                uart_remove_one_port(&sa1100_reg, &sport->port);
@@ -891,13 +888,14 @@ static int sa1100_serial_remove(struct device *_dev)
        return 0;
 }
 
-static struct device_driver sa11x0_serial_driver = {
-       .name           = "sa11x0-uart",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa11x0_serial_driver = {
        .probe          = sa1100_serial_probe,
        .remove         = sa1100_serial_remove,
        .suspend        = sa1100_serial_suspend,
        .resume         = sa1100_serial_resume,
+       .driver         = {
+               .name   = "sa11x0-uart",
+       },
 };
 
 static int __init sa1100_serial_init(void)
@@ -910,7 +908,7 @@ static int __init sa1100_serial_init(void)
 
        ret = uart_register_driver(&sa1100_reg);
        if (ret == 0) {
-               ret = driver_register(&sa11x0_serial_driver);
+               ret = platform_driver_register(&sa11x0_serial_driver);
                if (ret)
                        uart_unregister_driver(&sa1100_reg);
        }
@@ -919,7 +917,7 @@ static int __init sa1100_serial_init(void)
 
 static void __exit sa1100_serial_exit(void)
 {
-       driver_unregister(&sa11x0_serial_driver);
+       platform_driver_unregister(&sa11x0_serial_driver);
        uart_unregister_driver(&sa1100_reg);
 }
 
index 427a23858076ffe03fcf9a166b7ca852a37533cb..2331296e1e17b068db98d8097bd85e1c80341898 100644 (file)
@@ -209,33 +209,45 @@ static void uart_shutdown(struct uart_state *state)
        struct uart_info *info = state->info;
        struct uart_port *port = state->port;
 
-       if (!(info->flags & UIF_INITIALIZED))
-               return;
-
        /*
-        * Turn off DTR and RTS early.
+        * Set the TTY IO error marker
         */
-       if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
-               uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
+       if (info->tty)
+               set_bit(TTY_IO_ERROR, &info->tty->flags);
 
-       /*
-        * clear delta_msr_wait queue to avoid mem leaks: we may free
-        * the irq here so the queue might never be woken up.  Note
-        * that we won't end up waiting on delta_msr_wait again since
-        * any outstanding file descriptors should be pointing at
-        * hung_up_tty_fops now.
-        */
-       wake_up_interruptible(&info->delta_msr_wait);
+       if (info->flags & UIF_INITIALIZED) {
+               info->flags &= ~UIF_INITIALIZED;
 
-       /*
-        * Free the IRQ and disable the port.
-        */
-       port->ops->shutdown(port);
+               /*
+                * Turn off DTR and RTS early.
+                */
+               if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
+                       uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
+
+               /*
+                * clear delta_msr_wait queue to avoid mem leaks: we may free
+                * the irq here so the queue might never be woken up.  Note
+                * that we won't end up waiting on delta_msr_wait again since
+                * any outstanding file descriptors should be pointing at
+                * hung_up_tty_fops now.
+                */
+               wake_up_interruptible(&info->delta_msr_wait);
+
+               /*
+                * Free the IRQ and disable the port.
+                */
+               port->ops->shutdown(port);
+
+               /*
+                * Ensure that the IRQ handler isn't running on another CPU.
+                */
+               synchronize_irq(port->irq);
+       }
 
        /*
-        * Ensure that the IRQ handler isn't running on another CPU.
+        * kill off our tasklet
         */
-       synchronize_irq(port->irq);
+       tasklet_kill(&info->tlet);
 
        /*
         * Free the transmit buffer page.
@@ -244,15 +256,6 @@ static void uart_shutdown(struct uart_state *state)
                free_page((unsigned long)info->xmit.buf);
                info->xmit.buf = NULL;
        }
-
-       /*
-        * kill off our tasklet
-        */
-       tasklet_kill(&info->tlet);
-       if (info->tty)
-               set_bit(TTY_IO_ERROR, &info->tty->flags);
-
-       info->flags &= ~UIF_INITIALIZED;
 }
 
 /**
@@ -1928,14 +1931,25 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port)
 
        if (state->info && state->info->flags & UIF_INITIALIZED) {
                struct uart_ops *ops = port->ops;
+               int ret;
 
                ops->set_mctrl(port, 0);
-               ops->startup(port);
-               uart_change_speed(state, NULL);
-               spin_lock_irq(&port->lock);
-               ops->set_mctrl(port, port->mctrl);
-               ops->start_tx(port);
-               spin_unlock_irq(&port->lock);
+               ret = ops->startup(port);
+               if (ret == 0) {
+                       uart_change_speed(state, NULL);
+                       spin_lock_irq(&port->lock);
+                       ops->set_mctrl(port, port->mctrl);
+                       ops->start_tx(port);
+                       spin_unlock_irq(&port->lock);
+               } else {
+                       /*
+                        * Failed to resume - maybe hardware went away?
+                        * Clear the "initialized" flag so we won't try
+                        * to call the low level drivers shutdown method.
+                        */
+                       state->info->flags &= ~UIF_INITIALIZED;
+                       uart_shutdown(state);
+               }
        }
 
        up(&state->sem);
index 01696b3e3f619f5b80aa9fcea4dfe4c4540790bb..865d4dea65df9b4d131bac4f50fe496246c9b535 100644 (file)
@@ -924,7 +924,7 @@ static struct uart_driver siu_uart_driver = {
        .cons           = SERIAL_VR41XX_CONSOLE,
 };
 
-static int siu_probe(struct device *dev)
+static int siu_probe(struct platform_device *dev)
 {
        struct uart_port *port;
        int num, i, retval;
@@ -941,7 +941,7 @@ static int siu_probe(struct device *dev)
        for (i = 0; i < num; i++) {
                port = &siu_uart_ports[i];
                port->ops = &siu_uart_ops;
-               port->dev = dev;
+               port->dev = &dev->dev;
 
                retval = uart_add_one_port(&siu_uart_driver, port);
                if (retval < 0) {
@@ -958,14 +958,14 @@ static int siu_probe(struct device *dev)
        return 0;
 }
 
-static int siu_remove(struct device *dev)
+static int siu_remove(struct platform_device *dev)
 {
        struct uart_port *port;
        int i;
 
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
-               if (port->dev == dev) {
+               if (port->dev == &dev->dev) {
                        uart_remove_one_port(&siu_uart_driver, port);
                        port->dev = NULL;
                }
@@ -976,7 +976,7 @@ static int siu_remove(struct device *dev)
        return 0;
 }
 
-static int siu_suspend(struct device *dev, pm_message_t state)
+static int siu_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct uart_port *port;
        int i;
@@ -984,7 +984,7 @@ static int siu_suspend(struct device *dev, pm_message_t state)
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
                if ((port->type == PORT_VR41XX_SIU ||
-                    port->type == PORT_VR41XX_DSIU) && port->dev == dev)
+                    port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev)
                        uart_suspend_port(&siu_uart_driver, port);
 
        }
@@ -992,7 +992,7 @@ static int siu_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int siu_resume(struct device *dev)
+static int siu_resume(struct platform_device *dev)
 {
        struct uart_port *port;
        int i;
@@ -1000,7 +1000,7 @@ static int siu_resume(struct device *dev)
        for (i = 0; i < siu_uart_driver.nr; i++) {
                port = &siu_uart_ports[i];
                if ((port->type == PORT_VR41XX_SIU ||
-                    port->type == PORT_VR41XX_DSIU) && port->dev == dev)
+                    port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev)
                        uart_resume_port(&siu_uart_driver, port);
        }
 
@@ -1009,13 +1009,14 @@ static int siu_resume(struct device *dev)
 
 static struct platform_device *siu_platform_device;
 
-static struct device_driver siu_device_driver = {
-       .name           = "SIU",
-       .bus            = &platform_bus_type,
+static struct platform_driver siu_device_driver = {
        .probe          = siu_probe,
        .remove         = siu_remove,
        .suspend        = siu_suspend,
        .resume         = siu_resume,
+       .driver         = {
+               .name   = "SIU",
+       },
 };
 
 static int __devinit vr41xx_siu_init(void)
@@ -1026,7 +1027,7 @@ static int __devinit vr41xx_siu_init(void)
        if (IS_ERR(siu_platform_device))
                return PTR_ERR(siu_platform_device);
 
-       retval = driver_register(&siu_device_driver);
+       retval = platform_driver_register(&siu_device_driver);
        if (retval < 0)
                platform_device_unregister(siu_platform_device);
 
@@ -1035,7 +1036,7 @@ static int __devinit vr41xx_siu_init(void)
 
 static void __devexit vr41xx_siu_exit(void)
 {
-       driver_unregister(&siu_device_driver);
+       platform_driver_unregister(&siu_device_driver);
 
        platform_device_unregister(siu_platform_device);
 }
index c52af73a251b629d8ae07ff9317f0a4dd2d94a78..6756d0fab6fefc4d421becb5783d4276a1ead518 100644 (file)
@@ -6,7 +6,7 @@
  *
  * DECstation changes
  * Copyright (C) 1998-2000 Harald Koerfgen
- * Copyright (C) 2000, 2001, 2002, 2003, 2004  Maciej W. Rozycki
+ * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005  Maciej W. Rozycki
  *
  * For the rest of the code the original Copyright applies:
  * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
@@ -55,6 +55,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
+#include <linux/spinlock.h>
 #ifdef CONFIG_SERIAL_DEC_CONSOLE
 #include <linux/console.h>
 #endif
@@ -63,7 +64,6 @@
 #include <asm/pgtable.h>
 #include <asm/irq.h>
 #include <asm/system.h>
-#include <asm/uaccess.h>
 #include <asm/bootinfo.h>
 
 #include <asm/dec/interrupts.h>
@@ -128,6 +128,8 @@ static struct zs_parms ds_parms = {
 
 #define BUS_PRESENT (DS_BUS_PRESENT)
 
+DEFINE_SPINLOCK(zs_lock);
+
 struct dec_zschannel zs_channels[NUM_CHANNELS];
 struct dec_serial zs_soft[NUM_CHANNELS];
 int zs_channels_found;
@@ -159,8 +161,6 @@ static unsigned char zs_init_regs[16] __initdata = {
        0                               /* write 15 */
 };
 
-DECLARE_TASK_QUEUE(tq_zs_serial);
-
 static struct tty_driver *serial_driver;
 
 /* serial subtype definitions */
@@ -294,8 +294,7 @@ static inline void zs_rtsdtr(struct dec_serial *info, int which, int set)
 {
         unsigned long flags;
 
-
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
        if (info->zs_channel != info->zs_chan_a) {
                if (set) {
                        info->zs_chan_a->curregs[5] |= (which & (RTS | DTR));
@@ -304,7 +303,7 @@ static inline void zs_rtsdtr(struct dec_serial *info, int which, int set)
                }
                write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]);
        }
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 /* Utility routines for the Zilog */
@@ -345,12 +344,10 @@ static inline void rs_recv_clear(struct dec_zschannel *zsc)
  * This routine is used by the interrupt handler to schedule
  * processing in the software interrupt portion of the driver.
  */
-static _INLINE_ void rs_sched_event(struct dec_serial *info,
-                                 int event)
+static _INLINE_ void rs_sched_event(struct dec_serial *info, int event)
 {
        info->event |= 1 << event;
-       queue_task(&info->tqueue, &tq_zs_serial);
-       mark_bh(SERIAL_BH);
+       tasklet_schedule(&info->tlet);
 }
 
 static _INLINE_ void receive_chars(struct dec_serial *info,
@@ -497,9 +494,10 @@ static _INLINE_ void status_handle(struct dec_serial *info)
 /*
  * This is the serial driver's generic interrupt routine
  */
-void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
+static irqreturn_t rs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
        struct dec_serial *info = (struct dec_serial *) dev_id;
+       irqreturn_t status = IRQ_NONE;
        unsigned char zs_intreg;
        int shift;
 
@@ -521,6 +519,8 @@ void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
                if ((zs_intreg & CHAN_IRQMASK) == 0)
                        break;
 
+               status = IRQ_HANDLED;
+
                if (zs_intreg & CHBRxIP) {
                        receive_chars(info, regs);
                }
@@ -534,6 +534,8 @@ void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 
        /* Why do we need this ? */
        write_zsreg(info->zs_channel, 0, RES_H_IUS);
+
+       return status;
 }
 
 #ifdef ZS_DEBUG_REGS
@@ -578,12 +580,12 @@ static void rs_stop(struct tty_struct *tty)
                return;
 
 #if 1
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
        if (info->zs_channel->curregs[5] & TxENAB) {
                info->zs_channel->curregs[5] &= ~TxENAB;
                write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]);
        }
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 #endif
 }
 
@@ -595,7 +597,7 @@ static void rs_start(struct tty_struct *tty)
        if (serial_paranoia_check(info, tty->name, "rs_start"))
                return;
 
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
 #if 1
        if (info->xmit_cnt && info->xmit_buf && !(info->zs_channel->curregs[5] & TxENAB)) {
                info->zs_channel->curregs[5] |= TxENAB;
@@ -606,7 +608,7 @@ static void rs_start(struct tty_struct *tty)
                transmit_chars(info);
        }
 #endif
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 /*
@@ -618,12 +620,8 @@ static void rs_start(struct tty_struct *tty)
  * interrupt driver proper are done; the interrupt driver schedules
  * them using rs_sched_event(), and they get done here.
  */
-static void do_serial_bh(void)
-{
-       run_task_queue(&tq_zs_serial);
-}
 
-static void do_softint(void *private_)
+static void do_softint(unsigned long private_)
 {
        struct dec_serial       *info = (struct dec_serial *) private_;
        struct tty_struct       *tty;
@@ -634,10 +632,11 @@ static void do_softint(void *private_)
 
        if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
                tty_wakeup(tty);
+               wake_up_interruptible(&tty->write_wait);
        }
 }
 
-int zs_startup(struct dec_serial * info)
+static int zs_startup(struct dec_serial * info)
 {
        unsigned long flags;
 
@@ -650,7 +649,7 @@ int zs_startup(struct dec_serial * info)
                        return -ENOMEM;
        }
 
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
 
 #ifdef SERIAL_DEBUG_OPEN
        printk("starting up ttyS%d (irq %d)...", info->line, info->irq);
@@ -706,7 +705,7 @@ int zs_startup(struct dec_serial * info)
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 
        info->flags |= ZILOG_INITIALIZED;
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
        return 0;
 }
 
@@ -726,7 +725,7 @@ static void shutdown(struct dec_serial * info)
               info->irq);
 #endif
 
-       save_flags(flags); cli(); /* Disable interrupts */
+       spin_lock_irqsave(&zs_lock, flags);
 
        if (info->xmit_buf) {
                free_page((unsigned long) info->xmit_buf);
@@ -749,7 +748,7 @@ static void shutdown(struct dec_serial * info)
                set_bit(TTY_IO_ERROR, &info->tty->flags);
 
        info->flags &= ~ZILOG_INITIALIZED;
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 /*
@@ -785,7 +784,7 @@ static void change_speed(struct dec_serial *info)
                        i += 15;
        }
 
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
        info->zs_baud = baud_table[i];
        if (info->zs_baud) {
                brg = BPS_TO_BRG(info->zs_baud, zs_parms->clock/info->clk_divisor);
@@ -858,7 +857,7 @@ static void change_speed(struct dec_serial *info)
        /* Load up the new values */
        load_zsregs(info->zs_channel, info->zs_channel->curregs);
 
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 static void rs_flush_chars(struct tty_struct *tty)
@@ -874,9 +873,9 @@ static void rs_flush_chars(struct tty_struct *tty)
                return;
 
        /* Enable transmitter */
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
        transmit_chars(info);
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 static int rs_write(struct tty_struct * tty,
@@ -892,26 +891,17 @@ static int rs_write(struct tty_struct * tty,
        if (!tty || !info->xmit_buf)
                return 0;
 
-       save_flags(flags);
        while (1) {
-               cli();
+               spin_lock_irqsave(&zs_lock, flags);
                c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
                                   SERIAL_XMIT_SIZE - info->xmit_head));
                if (c <= 0)
                        break;
 
-               if (from_user) {
-                       down(&tmp_buf_sem);
-                       copy_from_user(tmp_buf, buf, c);
-                       c = min(c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                      SERIAL_XMIT_SIZE - info->xmit_head));
-                       memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
-                       up(&tmp_buf_sem);
-               } else
-                       memcpy(info->xmit_buf + info->xmit_head, buf, c);
+               memcpy(info->xmit_buf + info->xmit_head, buf, c);
                info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
                info->xmit_cnt += c;
-               restore_flags(flags);
+               spin_unlock_irqrestore(&zs_lock, flags);
                buf += c;
                count -= c;
                total += c;
@@ -920,7 +910,7 @@ static int rs_write(struct tty_struct * tty,
        if (info->xmit_cnt && !tty->stopped && !info->tx_stopped
            && !info->tx_active)
                transmit_chars(info);
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
        return total;
 }
 
@@ -952,9 +942,9 @@ static void rs_flush_buffer(struct tty_struct *tty)
 
        if (serial_paranoia_check(info, tty->name, "rs_flush_buffer"))
                return;
-       cli();
+       spin_lock_irq(&zs_lock);
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
-       sti();
+       spin_unlock_irq(&zs_lock);
        tty_wakeup(tty);
 }
 
@@ -982,11 +972,11 @@ static void rs_throttle(struct tty_struct * tty)
                return;
 
        if (I_IXOFF(tty)) {
-               save_flags(flags); cli();
+               spin_lock_irqsave(&zs_lock, flags);
                info->x_char = STOP_CHAR(tty);
                if (!info->tx_active)
                        transmit_chars(info);
-               restore_flags(flags);
+               spin_unlock_irqrestore(&zs_lock, flags);
        }
 
        if (C_CRTSCTS(tty)) {
@@ -1010,7 +1000,7 @@ static void rs_unthrottle(struct tty_struct * tty)
                return;
 
        if (I_IXOFF(tty)) {
-               save_flags(flags); cli();
+               spin_lock_irqsave(&zs_lock, flags);
                if (info->x_char)
                        info->x_char = 0;
                else {
@@ -1018,7 +1008,7 @@ static void rs_unthrottle(struct tty_struct * tty)
                        if (!info->tx_active)
                                transmit_chars(info);
                }
-               restore_flags(flags);
+               spin_unlock_irqrestore(&zs_lock, flags);
        }
 
        if (C_CRTSCTS(tty)) {
@@ -1111,9 +1101,9 @@ static int get_lsr_info(struct dec_serial * info, unsigned int *value)
 {
        unsigned char status;
 
-       cli();
+       spin_lock(&zs_lock);
        status = read_zsreg(info->zs_channel, 0);
-       sti();
+       spin_unlock_irq(&zs_lock);
        put_user(status,value);
        return 0;
 }
@@ -1136,11 +1126,11 @@ static int rs_tiocmget(struct tty_struct *tty, struct file *file)
        if (info->zs_channel == info->zs_chan_a)
                result = 0;
        else {
-               cli();
+               spin_lock(&zs_lock);
                control = info->zs_chan_a->curregs[5];
                status_a = read_zsreg(info->zs_chan_a, 0);
                status_b = read_zsreg(info->zs_channel, 0);
-               sti();
+               spin_unlock_irq(&zs_lock);
                result =  ((control  & RTS) ? TIOCM_RTS: 0)
                        | ((control  & DTR) ? TIOCM_DTR: 0)
                        | ((status_b & DCD) ? TIOCM_CAR: 0)
@@ -1155,8 +1145,6 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
                        unsigned int set, unsigned int clear)
 {
        struct dec_serial * info = (struct dec_serial *)tty->driver_data;
-       int error;
-       unsigned int arg, bits;
 
        if (info->hook)
                return -ENODEV;
@@ -1170,8 +1158,7 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
        if (info->zs_channel == info->zs_chan_a)
                return 0;
 
-       get_user(arg, value);
-       cli();
+       spin_lock(&zs_lock);
        if (set & TIOCM_RTS)
                info->zs_chan_a->curregs[5] |= RTS;
        if (set & TIOCM_DTR)
@@ -1181,7 +1168,7 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
        if (clear & TIOCM_DTR)
                info->zs_chan_a->curregs[5] &= ~DTR;
        write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]);
-       sti();
+       spin_unlock_irq(&zs_lock);
        return 0;
 }
 
@@ -1198,19 +1185,18 @@ static void rs_break(struct tty_struct *tty, int break_state)
        if (!info->port)
                return;
 
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
        if (break_state == -1)
                info->zs_channel->curregs[5] |= SND_BRK;
        else
                info->zs_channel->curregs[5] &= ~SND_BRK;
        write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]);
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 static int rs_ioctl(struct tty_struct *tty, struct file * file,
                    unsigned int cmd, unsigned long arg)
 {
-       int error;
        struct dec_serial * info = (struct dec_serial *)tty->driver_data;
 
        if (info->hook)
@@ -1287,10 +1273,10 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
        if (!info || serial_paranoia_check(info, tty->name, "rs_close"))
                return;
 
-       save_flags(flags); cli();
+       spin_lock_irqsave(&zs_lock, flags);
 
        if (tty_hung_up_p(filp)) {
-               restore_flags(flags);
+               spin_unlock_irqrestore(&zs_lock, flags);
                return;
        }
 
@@ -1315,7 +1301,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
                info->count = 0;
        }
        if (info->count) {
-               restore_flags(flags);
+               spin_unlock_irqrestore(&zs_lock, flags);
                return;
        }
        info->flags |= ZILOG_CLOSING;
@@ -1358,7 +1344,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
        }
        info->flags &= ~(ZILOG_NORMAL_ACTIVE|ZILOG_CLOSING);
        wake_up_interruptible(&info->close_wait);
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 /*
@@ -1398,7 +1384,7 @@ static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
 /*
  * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
  */
-void rs_hangup(struct tty_struct *tty)
+static void rs_hangup(struct tty_struct *tty)
 {
        struct dec_serial * info = (struct dec_serial *)tty->driver_data;
 
@@ -1466,16 +1452,16 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
        printk("block_til_ready before block: ttyS%d, count = %d\n",
               info->line, info->count);
 #endif
-       cli();
+       spin_lock(&zs_lock);
        if (!tty_hung_up_p(filp))
                info->count--;
-       sti();
+       spin_unlock_irq(&zs_lock);
        info->blocked_open++;
        while (1) {
-               cli();
+               spin_lock(&zs_lock);
                if (tty->termios->c_cflag & CBAUD)
                        zs_rtsdtr(info, RTS | DTR, 1);
-               sti();
+               spin_unlock_irq(&zs_lock);
                set_current_state(TASK_INTERRUPTIBLE);
                if (tty_hung_up_p(filp) ||
                    !(info->flags & ZILOG_INITIALIZED)) {
@@ -1523,7 +1509,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
  * the IRQ chain.   It also performs the serial-specific
  * initialization for the tty structure.
  */
-int rs_open(struct tty_struct *tty, struct file * filp)
+static int rs_open(struct tty_struct *tty, struct file * filp)
 {
        struct dec_serial       *info;
        int                     retval, line;
@@ -1706,7 +1692,7 @@ static void __init probe_sccs(void)
                }
        }
 
-       save_and_cli(flags);
+       spin_lock_irqsave(&zs_lock, flags);
        for (n = 0; n < zs_channels_found; n++) {
                if (n % 2 == 0) {
                        write_zsreg(zs_soft[n].zs_chan_a, R9, FHWRES);
@@ -1716,7 +1702,7 @@ static void __init probe_sccs(void)
                load_zsregs(zs_soft[n].zs_channel,
                            zs_soft[n].zs_channel->curregs);
        }
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 }
 
 static struct tty_operations serial_ops = {
@@ -1749,9 +1735,6 @@ int __init zs_init(void)
        if(!BUS_PRESENT)
                return -ENODEV;
 
-       /* Setup base handler, and timer table. */
-       init_bh(SERIAL_BH, do_serial_bh);
-
        /* Find out how many Z8530 SCCs we have */
        if (zs_chain == 0)
                probe_sccs();
@@ -1800,8 +1783,7 @@ int __init zs_init(void)
                info->event = 0;
                info->count = 0;
                info->blocked_open = 0;
-               info->tqueue.routine = do_softint;
-               info->tqueue.data = info;
+               tasklet_init(&info->tlet, do_softint, (unsigned long)info);
                init_waitqueue_head(&info->open_wait);
                init_waitqueue_head(&info->close_wait);
                printk("ttyS%02d at 0x%08x (irq = %d) is a Z85C30 SCC\n",
@@ -1833,8 +1815,7 @@ int __init zs_init(void)
 /*
  * polling I/O routines
  */
-static int
-zs_poll_tx_char(void *handle, unsigned char ch)
+static int zs_poll_tx_char(void *handle, unsigned char ch)
 {
        struct dec_serial *info = handle;
        struct dec_zschannel *chan = info->zs_channel;
@@ -1857,8 +1838,7 @@ zs_poll_tx_char(void *handle, unsigned char ch)
                return -ENODEV;
 }
 
-static int
-zs_poll_rx_char(void *handle)
+static int zs_poll_rx_char(void *handle)
 {
        struct dec_serial *info = handle;
         struct dec_zschannel *chan = info->zs_channel;
@@ -2037,7 +2017,7 @@ static int __init serial_console_setup(struct console *co, char *options)
        }
        co->cflag = cflag;
 
-       save_and_cli(flags);
+       spin_lock_irqsave(&zs_lock, flags);
 
        /*
         * Set up the baud rate generator.
@@ -2092,7 +2072,7 @@ static int __init serial_console_setup(struct console *co, char *options)
        zs_soft[co->index].clk_divisor = clk_divisor;
        zs_soft[co->index].zs_baud = get_zsbaud(&zs_soft[co->index]);
 
-       restore_flags(flags);
+       spin_unlock_irqrestore(&zs_lock, flags);
 
        return 0;
 }
@@ -2229,5 +2209,3 @@ void __init zs_kgdb_hook(int tty_num)
        set_debug_traps(); /* init stub */
 }
 #endif /* ifdef CONFIG_KGDB */
-
-
index c52edffa6049675f6fc47321412665cceae0e6ea..13512200ceba045954066e2cabeac442a22fb47e 100644 (file)
@@ -6,14 +6,14 @@
  *
  * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 2004  Maciej W. Rozycki
+ * Copyright (C) 2004, 2005  Maciej W. Rozycki
  */
 #ifndef _DECSERIAL_H
 #define _DECSERIAL_H
 
 #include <asm/dec/serial.h>
 
-#define NUM_ZSREGS    16
+#define NUM_ZSREGS 16
 
 struct serial_struct {
        int     type;
@@ -139,8 +139,7 @@ struct dec_serial {
        int                     xmit_head;
        int                     xmit_tail;
        int                     xmit_cnt;
-       struct tq_struct        tqueue;
-       struct tq_struct        tqueue_hangup;
+       struct tasklet_struct   tlet;
        wait_queue_head_t       open_wait;
        wait_queue_head_t       close_wait;
 };
@@ -282,7 +281,7 @@ struct dec_serial {
 #define        DLC     4       /* Disable Lower Chain */
 #define        MIE     8       /* Master Interrupt Enable */
 #define        STATHI  0x10    /* Status high */
-#define SOFTACK 0x20    /* Software Interrupt Acknowledge */
+#define        SOFTACK 0x20    /* Software Interrupt Acknowledge */
 #define        NORESET 0       /* No reset on write to R9 */
 #define        CHRB    0x40    /* Reset channel B */
 #define        CHRA    0x80    /* Reset channel A */
@@ -395,8 +394,8 @@ struct dec_serial {
 /* Read Register 15 (value of WR 15) */
 
 /* Misc macros */
-#define ZS_CLEARERR(channel)    (write_zsreg(channel, 0, ERR_RES))
-#define ZS_CLEARFIFO(channel)   do { volatile unsigned char garbage; \
+#define ZS_CLEARERR(channel)   (write_zsreg(channel, 0, ERR_RES))
+#define ZS_CLEARFIFO(channel)  do { volatile unsigned char garbage; \
                                     garbage = read_zsdata(channel); \
                                     garbage = read_zsdata(channel); \
                                     garbage = read_zsdata(channel); \
index 751f297be2ef3ea275104858d111b08c17e55219..85099718c6837d96ccafe58035613a73aa6d02bb 100644 (file)
@@ -6,3 +6,7 @@ obj-$(CONFIG_USB_CXACRU)        += cxacru.o
 obj-$(CONFIG_USB_SPEEDTOUCH)   += speedtch.o
 obj-$(CONFIG_USB_ATM)          += usbatm.o
 obj-$(CONFIG_USB_XUSBATM)      += xusbatm.o
+
+ifeq ($(CONFIG_USB_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
index 936646457935a3af6aba0750ef27a00e08a2208d..1adacd60d713fc24815cd8fd1141d3852ba79e33 100644 (file)
 #include <linux/config.h>
 
 /*
-#define DEBUG
 #define VERBOSE_DEBUG
 */
 
-#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
-#      define DEBUG
-#endif
-
 #include <asm/semaphore.h>
 #include <linux/atm.h>
 #include <linux/atmdev.h>
index dd1c4d2a0c3122bdca2776e78e1bd2667288abe7..86d5c380892d08efc4eb556031ddb3afe038ba03 100644 (file)
@@ -14,3 +14,7 @@ ifeq ($(CONFIG_USB_DEVICEFS),y)
 endif
 
 obj-$(CONFIG_USB)      += usbcore.o
+
+ifeq ($(CONFIG_USB_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
index 57e800ac3cee80890eed1871dff6d7093e699bc9..419c9943a7cbde9428aef14df1f266bd7e32c142 100644 (file)
 #include <asm/scatterlist.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmapool.h>
-
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/usb.h>
 #include "hcd.h"
 
index 993019500cc38fa6756e7381db6afa5c1361a77d..a9d89c78cc2087f1140b6d89613a1d065d0201cc 100644 (file)
@@ -1,9 +1,4 @@
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#endif
-
 #include <linux/usb.h>
 #include <linux/module.h>
 #include <linux/init.h>
index 942cd437dc489d48876ef8da3534de94e677042d..b1d6e9af732d743d741ccc3b4d4c013fc74b2dc0 100644 (file)
@@ -1392,13 +1392,13 @@ static int proc_ioctl_default(struct dev_state *ps, void __user *arg)
 }
 
 #ifdef CONFIG_COMPAT
-static int proc_ioctl_compat(struct dev_state *ps, void __user *arg)
+static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
 {
        struct usbdevfs_ioctl32 __user *uioc;
        struct usbdevfs_ioctl ctrl;
        u32 udata;
 
-       uioc = compat_ptr(arg);
+       uioc = compat_ptr((long)arg);
        if (get_user(ctrl.ifno, &uioc->ifno) ||
            get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
            __get_user(udata, &uioc->data))
@@ -1511,7 +1511,7 @@ static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
 
        case USBDEVFS_IOCTL32:
                snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__);
-               ret = proc_ioctl_compat(ps, p);
+               ret = proc_ioctl_compat(ps, (compat_uptr_t)(long)p);
                break;
 #endif
 
index e695308095ae8cbae7a9b131c93bd5a506b9c1dd..37b13368c8145c9ca8522aab5d074d30dc3eb42f 100644 (file)
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <linux/errno.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
 #include <linux/usb.h>
 
 #include "usb.h"
index 84d9e69329bb94de3e710d53fe70e4d65cc2f9f8..7feb829362d63212d5383e6aba652373036e5150 100644 (file)
  */
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
index 6c7ca5b08cd60c86dc51f35226bcfdf7ffa7cdc1..5e5f65a475ab95c2d50b372d70d4f5533ad98f6e 100644 (file)
  */
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#endif
-
 #include <linux/module.h>
 #include <linux/version.h>
 #include <linux/kernel.h>
index 256d9f6987156d32dbed6a2706bfcc7021dcbf86..840727948d846aa12eb476e4ba5dd07f71f1a2ae 100644 (file)
@@ -9,11 +9,6 @@
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/module.h>
index 12f490fdee8f3fad985ab780883ebbd92cbd8707..c44bbedec817df655b7b61e12b0433818e7abdc4 100644 (file)
@@ -46,7 +46,6 @@
 
 static struct super_operations usbfs_ops;
 static struct file_operations default_file_operations;
-static struct inode_operations usbfs_dir_inode_operations;
 static struct vfsmount *usbfs_mount;
 static int usbfs_mount_count;  /* = 0 */
 static int ignore_mount = 0;
@@ -262,7 +261,7 @@ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t de
                        inode->i_fop = &default_file_operations;
                        break;
                case S_IFDIR:
-                       inode->i_op = &usbfs_dir_inode_operations;
+                       inode->i_op = &simple_dir_inode_operations;
                        inode->i_fop = &simple_dir_operations;
 
                        /* directory inodes start off with i_nlink == 2 (for "." entry) */
@@ -417,10 +416,6 @@ static struct file_operations default_file_operations = {
        .llseek =       default_file_lseek,
 };
 
-static struct inode_operations usbfs_dir_inode_operations = {
-       .lookup =       simple_lookup,
-};
-
 static struct super_operations usbfs_ops = {
        .statfs =       simple_statfs,
        .drop_inode =   generic_delete_inode,
index 644a3d4f12aa15bc44c12dabc937406839e010e8..fe74f99ca5f4bb8dc5f981cce78e86115702c3d2 100644 (file)
@@ -3,13 +3,6 @@
  */
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/pci.h> /* for scatterlist macros */
 #include <linux/usb.h>
 #include <linux/module.h>
@@ -1457,12 +1450,11 @@ free_interfaces:
                 */
                for (i = 0; i < nintf; ++i) {
                        struct usb_interface *intf = cp->interface[i];
-                       struct usb_host_interface *alt = intf->cur_altsetting;
 
                        dev_dbg (&dev->dev,
                                "adding %s (config #%d, interface %d)\n",
                                intf->dev.bus_id, configuration,
-                               alt->desc.bInterfaceNumber);
+                               intf->cur_altsetting->desc.bInterfaceNumber);
                        ret = device_add (&intf->dev);
                        if (ret != 0) {
                                dev_err(&dev->dev,
index 37da059eced741a78ca43ac275a5eba9af120c8e..fbbebab52fbd1fbfa23b3d7d48618905067d9424 100644 (file)
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/notifier.h>
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
 #include <linux/usb.h>
-
 #include "usb.h"
 
 
index edd83e0144522700d67dd51621d88e0f4a54a1d6..71d881327e88e0aa05611a7acd3967ec1b24b4c4 100644 (file)
 
 #include <linux/config.h>
 #include <linux/kernel.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
 #include <linux/usb.h>
-
 #include "usb.h"
 
 /* endpoint stuff */
index f2a1fed2a8024419e76e477fdd57bd8e55792f25..081796726b951bf449b8b827b970cf7eec1b8571 100644 (file)
@@ -4,12 +4,6 @@
 #include <linux/bitops.h>
 #include <linux/slab.h>
 #include <linux/init.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
 #include <linux/usb.h>
 #include "hcd.h"
 
index 0eefff7bcb3c72cc1daa47a6516edaa90523f6f4..e197ce9353de0f4591ad38861413b7ceb1b66593 100644 (file)
  */
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/bitops.h>
index 904519085334e8e6bb16f6e3ac79ac0a44a3b1a6..c655d46c8aed5ef7c0cd31510155613985c40a86 100644 (file)
@@ -896,7 +896,7 @@ dummy_gadget_release (struct device *dev)
 #endif
 }
 
-static int dummy_udc_probe (struct device *dev)
+static int dummy_udc_probe (struct platform_device *dev)
 {
        struct dummy    *dum = the_controller;
        int             rc;
@@ -909,7 +909,7 @@ static int dummy_udc_probe (struct device *dev)
        dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0);
 
        strcpy (dum->gadget.dev.bus_id, "gadget");
-       dum->gadget.dev.parent = dev;
+       dum->gadget.dev.parent = &dev->dev;
        dum->gadget.dev.release = dummy_gadget_release;
        rc = device_register (&dum->gadget.dev);
        if (rc < 0)
@@ -919,59 +919,60 @@ static int dummy_udc_probe (struct device *dev)
        usb_bus_get (&dummy_to_hcd (dum)->self);
 #endif
 
-       dev_set_drvdata (dev, dum);
+       platform_set_drvdata (dev, dum);
        device_create_file (&dum->gadget.dev, &dev_attr_function);
        return rc;
 }
 
-static int dummy_udc_remove (struct device *dev)
+static int dummy_udc_remove (struct platform_device *dev)
 {
-       struct dummy    *dum = dev_get_drvdata (dev);
+       struct dummy    *dum = platform_get_drvdata (dev);
 
-       dev_set_drvdata (dev, NULL);
+       platform_set_drvdata (dev, NULL);
        device_remove_file (&dum->gadget.dev, &dev_attr_function);
        device_unregister (&dum->gadget.dev);
        return 0;
 }
 
-static int dummy_udc_suspend (struct device *dev, pm_message_t state)
+static int dummy_udc_suspend (struct platform_device *dev, pm_message_t state)
 {
-       struct dummy    *dum = dev_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(dev);
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 1;
        set_link_state (dum);
        spin_unlock_irq (&dum->lock);
 
-       dev->power.power_state = state;
+       dev->dev.power.power_state = state;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
 
-static int dummy_udc_resume (struct device *dev)
+static int dummy_udc_resume (struct platform_device *dev)
 {
-       struct dummy    *dum = dev_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(dev);
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 0;
        set_link_state (dum);
        spin_unlock_irq (&dum->lock);
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
 
-static struct device_driver dummy_udc_driver = {
-       .name           = (char *) gadget_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver dummy_udc_driver = {
        .probe          = dummy_udc_probe,
        .remove         = dummy_udc_remove,
        .suspend        = dummy_udc_suspend,
        .resume         = dummy_udc_resume,
+       .driver         = {
+               .name   = (char *) gadget_name,
+               .owner  = THIS_MODULE,
+       },
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1898,14 +1899,14 @@ static const struct hc_driver dummy_hcd = {
        .bus_resume =           dummy_bus_resume,
 };
 
-static int dummy_hcd_probe (struct device *dev)
+static int dummy_hcd_probe (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
        int                     retval;
 
-       dev_info (dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
+       dev_info(&dev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
 
-       hcd = usb_create_hcd (&dummy_hcd, dev, dev->bus_id);
+       hcd = usb_create_hcd (&dummy_hcd, &dev->dev, dev->dev.bus_id);
        if (!hcd)
                return -ENOMEM;
        the_controller = hcd_to_dummy (hcd);
@@ -1918,48 +1919,49 @@ static int dummy_hcd_probe (struct device *dev)
        return retval;
 }
 
-static int dummy_hcd_remove (struct device *dev)
+static int dummy_hcd_remove (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
 
-       hcd = dev_get_drvdata (dev);
+       hcd = platform_get_drvdata (dev);
        usb_remove_hcd (hcd);
        usb_put_hcd (hcd);
        the_controller = NULL;
        return 0;
 }
 
-static int dummy_hcd_suspend (struct device *dev, pm_message_t state)
+static int dummy_hcd_suspend (struct platform_device *dev, pm_message_t state)
 {
        struct usb_hcd          *hcd;
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
-       hcd = dev_get_drvdata (dev);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       hcd = platform_get_drvdata (dev);
 
        hcd->state = HC_STATE_SUSPENDED;
        return 0;
 }
 
-static int dummy_hcd_resume (struct device *dev)
+static int dummy_hcd_resume (struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
 
-       dev_dbg (dev, "%s\n", __FUNCTION__);
-       hcd = dev_get_drvdata (dev);
+       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       hcd = platform_get_drvdata (dev);
        hcd->state = HC_STATE_RUNNING;
 
        usb_hcd_poll_rh_status (hcd);
        return 0;
 }
 
-static struct device_driver dummy_hcd_driver = {
-       .name           = (char *) driver_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver dummy_hcd_driver = {
        .probe          = dummy_hcd_probe,
        .remove         = dummy_hcd_remove,
        .suspend        = dummy_hcd_suspend,
        .resume         = dummy_hcd_resume,
+       .driver         = {
+               .name   = (char *) driver_name,
+               .owner  = THIS_MODULE,
+       },
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1995,11 +1997,11 @@ static int __init init (void)
        if (usb_disabled ())
                return -ENODEV;
 
-       retval = driver_register (&dummy_hcd_driver);
+       retval = platform_driver_register (&dummy_hcd_driver);
        if (retval < 0)
                return retval;
 
-       retval = driver_register (&dummy_udc_driver);
+       retval = platform_driver_register (&dummy_udc_driver);
        if (retval < 0)
                goto err_register_udc_driver;
 
@@ -2015,9 +2017,9 @@ static int __init init (void)
 err_register_udc:
        platform_device_unregister (&the_hcd_pdev);
 err_register_hcd:
-       driver_unregister (&dummy_udc_driver);
+       platform_driver_unregister (&dummy_udc_driver);
 err_register_udc_driver:
-       driver_unregister (&dummy_hcd_driver);
+       platform_driver_unregister (&dummy_hcd_driver);
        return retval;
 }
 module_init (init);
@@ -2026,7 +2028,7 @@ static void __exit cleanup (void)
 {
        platform_device_unregister (&the_udc_pdev);
        platform_device_unregister (&the_hcd_pdev);
-       driver_unregister (&dummy_udc_driver);
-       driver_unregister (&dummy_hcd_driver);
+       platform_driver_unregister (&dummy_udc_driver);
+       platform_driver_unregister (&dummy_hcd_driver);
 }
 module_exit (cleanup);
index 654469778ab5ee9ed056fd8ac76198b03dcec3a5..b0f3cd63e3b9110ed8d3e73d10a2754b1917001f 100644 (file)
@@ -1970,7 +1970,6 @@ MODULE_DEVICE_TABLE (pci, pci_ids);
 static struct pci_driver goku_pci_driver = {
        .name =         (char *) driver_name,
        .id_table =     pci_ids,
-       .owner =        THIS_MODULE,
 
        .probe =        goku_probe,
        .remove =       goku_remove,
index bc6269f10cbb5d3fd1e1f4a3f0968bea15448c38..e02fea5a54339da5de3351927f880a724e7a58e4 100644 (file)
@@ -2085,21 +2085,21 @@ static struct lh7a40x_udc memory = {
 /*
  *     probe - binds to the platform device
  */
-static int lh7a40x_udc_probe(struct device *_dev)
+static int lh7a40x_udc_probe(struct platform_device *pdev)
 {
        struct lh7a40x_udc *dev = &memory;
        int retval;
 
-       DEBUG("%s: %p\n", __FUNCTION__, _dev);
+       DEBUG("%s: %p\n", __FUNCTION__, pdev);
 
        spin_lock_init(&dev->lock);
-       dev->dev = _dev;
+       dev->dev = &pdev->dev;
 
        device_initialize(&dev->gadget.dev);
-       dev->gadget.dev.parent = _dev;
+       dev->gadget.dev.parent = &pdev->dev;
 
        the_controller = dev;
-       dev_set_drvdata(_dev, dev);
+       platform_set_drvdata(pdev, dev);
 
        udc_disable(dev);
        udc_reinit(dev);
@@ -2119,11 +2119,11 @@ static int lh7a40x_udc_probe(struct device *_dev)
        return retval;
 }
 
-static int lh7a40x_udc_remove(struct device *_dev)
+static int lh7a40x_udc_remove(struct platform_device *pdev)
 {
-       struct lh7a40x_udc *dev = _dev->driver_data;
+       struct lh7a40x_udc *dev = platform_get_drvdata(pdev);
 
-       DEBUG("%s: %p\n", __FUNCTION__, dev);
+       DEBUG("%s: %p\n", __FUNCTION__, pdev);
 
        udc_disable(dev);
        remove_proc_files();
@@ -2131,7 +2131,7 @@ static int lh7a40x_udc_remove(struct device *_dev)
 
        free_irq(IRQ_USBINTR, dev);
 
-       dev_set_drvdata(_dev, 0);
+       platform_set_drvdata(pdev, 0);
 
        the_controller = 0;
 
@@ -2140,26 +2140,27 @@ static int lh7a40x_udc_remove(struct device *_dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name = (char *)driver_name,
-       .owner = THIS_MODULE,
-       .bus = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe = lh7a40x_udc_probe,
        .remove = lh7a40x_udc_remove
            /* FIXME power management support */
            /* .suspend = ... disable UDC */
            /* .resume = ... re-enable UDC */
+       .driver = {
+               .name = (char *)driver_name,
+               .owner = THIS_MODULE,
+       },
 };
 
 static int __init udc_init(void)
 {
        DEBUG("%s: %s version %s\n", __FUNCTION__, driver_name, DRIVER_VERSION);
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 
 module_init(udc_init);
index 0dc6bb00bf725194a855952f73ef72999bcb9d5c..c32e1f7476da46d67b4e2f8336ab8cd5929b1b75 100644 (file)
@@ -2948,7 +2948,6 @@ MODULE_DEVICE_TABLE (pci, pci_ids);
 static struct pci_driver net2280_pci_driver = {
        .name =         (char *) driver_name,
        .id_table =     pci_ids,
-       .owner =        THIS_MODULE,
 
        .probe =        net2280_probe,
        .remove =       net2280_remove,
index 387692a3611e7119560b606611e75d1ac881285f..a8972d7c97beff2b6a5831f284daf6f68dfd3cf3 100644 (file)
@@ -2707,18 +2707,17 @@ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv)
        return 0;
 }
 
-static int __init omap_udc_probe(struct device *dev)
+static int __init omap_udc_probe(struct platform_device *pdev)
 {
-       struct platform_device  *odev = to_platform_device(dev);
        int                     status = -ENODEV;
        int                     hmc;
        struct otg_transceiver  *xceiv = NULL;
        const char              *type = NULL;
-       struct omap_usb_config  *config = dev->platform_data;
+       struct omap_usb_config  *config = pdev->dev.platform_data;
 
        /* NOTE:  "knows" the order of the resources! */
-       if (!request_mem_region(odev->resource[0].start, 
-                       odev->resource[0].end - odev->resource[0].start + 1,
+       if (!request_mem_region(pdev->resource[0].start, 
+                       pdev->resource[0].end - pdev->resource[0].start + 1,
                        driver_name)) {
                DBG("request_mem_region failed\n");
                return -EBUSY;
@@ -2803,7 +2802,7 @@ bad_on_1710:
        INFO("hmc mode %d, %s transceiver\n", hmc, type);
 
        /* a "gadget" abstracts/virtualizes the controller */
-       status = omap_udc_setup(odev, xceiv);
+       status = omap_udc_setup(pdev, xceiv);
        if (status) {
                goto cleanup0;
        }
@@ -2821,28 +2820,28 @@ bad_on_1710:
                udc->clr_halt = UDC_RESET_EP;
 
        /* USB general purpose IRQ:  ep0, state changes, dma, etc */
-       status = request_irq(odev->resource[1].start, omap_udc_irq,
+       status = request_irq(pdev->resource[1].start, omap_udc_irq,
                        SA_SAMPLE_RANDOM, driver_name, udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
-                       odev->resource[1].start, status);
+                       pdev->resource[1].start, status);
                goto cleanup1;
        }
 
        /* USB "non-iso" IRQ (PIO for all but ep0) */
-       status = request_irq(odev->resource[2].start, omap_udc_pio_irq,
+       status = request_irq(pdev->resource[2].start, omap_udc_pio_irq,
                        SA_SAMPLE_RANDOM, "omap_udc pio", udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
-                       odev->resource[2].start, status);
+                       pdev->resource[2].start, status);
                goto cleanup2;
        }
 #ifdef USE_ISO
-       status = request_irq(odev->resource[3].start, omap_udc_iso_irq,
+       status = request_irq(pdev->resource[3].start, omap_udc_iso_irq,
                        SA_INTERRUPT, "omap_udc iso", udc);
        if (status != 0) {
                ERR("can't get irq %ld, err %d\n",
-                       odev->resource[3].start, status);
+                       pdev->resource[3].start, status);
                goto cleanup3;
        }
 #endif
@@ -2853,11 +2852,11 @@ bad_on_1710:
 
 #ifdef USE_ISO
 cleanup3:
-       free_irq(odev->resource[2].start, udc);
+       free_irq(pdev->resource[2].start, udc);
 #endif
 
 cleanup2:
-       free_irq(odev->resource[1].start, udc);
+       free_irq(pdev->resource[1].start, udc);
 
 cleanup1:
        kfree (udc);
@@ -2866,14 +2865,13 @@ cleanup1:
 cleanup0:
        if (xceiv)
                put_device(xceiv->dev);
-       release_mem_region(odev->resource[0].start,
-                       odev->resource[0].end - odev->resource[0].start + 1);
+       release_mem_region(pdev->resource[0].start,
+                       pdev->resource[0].end - pdev->resource[0].start + 1);
        return status;
 }
 
-static int __exit omap_udc_remove(struct device *dev)
+static int __exit omap_udc_remove(struct platform_device *pdev)
 {
-       struct platform_device  *odev = to_platform_device(dev);
        DECLARE_COMPLETION(done);
 
        if (!udc)
@@ -2891,13 +2889,13 @@ static int __exit omap_udc_remove(struct device *dev)
        remove_proc_file();
 
 #ifdef USE_ISO
-       free_irq(odev->resource[3].start, udc);
+       free_irq(pdev->resource[3].start, udc);
 #endif
-       free_irq(odev->resource[2].start, udc);
-       free_irq(odev->resource[1].start, udc);
+       free_irq(pdev->resource[2].start, udc);
+       free_irq(pdev->resource[1].start, udc);
 
-       release_mem_region(odev->resource[0].start,
-                       odev->resource[0].end - odev->resource[0].start + 1);
+       release_mem_region(pdev->resource[0].start,
+                       pdev->resource[0].end - pdev->resource[0].start + 1);
 
        device_unregister(&udc->gadget.dev);
        wait_for_completion(&done);
@@ -2915,7 +2913,7 @@ static int __exit omap_udc_remove(struct device *dev)
  * may involve talking to an external transceiver (e.g. isp1301).
  */
 
-static int omap_udc_suspend(struct device *dev, pm_message_t message)
+static int omap_udc_suspend(struct platform_device *dev, pm_message_t message)
 {
        u32     devstat;
 
@@ -2935,7 +2933,7 @@ static int omap_udc_suspend(struct device *dev, pm_message_t message)
        return 0;
 }
 
-static int omap_udc_resume(struct device *dev)
+static int omap_udc_resume(struct platform_device *dev)
 {
        DBG("resume + wakeup/SRP\n");
        omap_pullup(&udc->gadget, 1);
@@ -2947,14 +2945,15 @@ static int omap_udc_resume(struct device *dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name           = (char *) driver_name,
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe          = omap_udc_probe,
        .remove         = __exit_p(omap_udc_remove),
        .suspend        = omap_udc_suspend,
        .resume         = omap_udc_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = (char *) driver_name,
+       },
 };
 
 static int __init udc_init(void)
@@ -2965,13 +2964,13 @@ static int __init udc_init(void)
 #endif
                "%s\n", driver_desc,
                use_dma ?  " (dma)" : "");
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 module_init(udc_init);
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 module_exit(udc_exit);
 
index 510d28a924db95501edb3c69402148a9df208ea3..bb028c5b8952cbdf141006ce26079d6ab2e68275 100644 (file)
@@ -2432,7 +2432,7 @@ static struct pxa2xx_udc memory = {
 /*
  *     probe - binds to the platform device
  */
-static int __init pxa2xx_udc_probe(struct device *_dev)
+static int __init pxa2xx_udc_probe(struct platform_device *pdev)
 {
        struct pxa2xx_udc *dev = &memory;
        int retval, out_dma = 1;
@@ -2495,19 +2495,19 @@ static int __init pxa2xx_udc_probe(struct device *_dev)
 #endif
 
        /* other non-static parts of init */
-       dev->dev = _dev;
-       dev->mach = _dev->platform_data;
+       dev->dev = &pdev->dev;
+       dev->mach = pdev->dev.platform_data;
 
        init_timer(&dev->timer);
        dev->timer.function = udc_watchdog;
        dev->timer.data = (unsigned long) dev;
 
        device_initialize(&dev->gadget.dev);
-       dev->gadget.dev.parent = _dev;
-       dev->gadget.dev.dma_mask = _dev->dma_mask;
+       dev->gadget.dev.parent = &pdev->dev;
+       dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
 
        the_controller = dev;
-       dev_set_drvdata(_dev, dev);
+       platform_set_drvdata(pdev, dev);
 
        udc_disable(dev);
        udc_reinit(dev);
@@ -2559,14 +2559,14 @@ lubbock_fail0:
        return 0;
 }
 
-static void pxa2xx_udc_shutdown(struct device *_dev)
+static void pxa2xx_udc_shutdown(struct platform_device *_dev)
 {
        pullup_off();
 }
 
-static int __exit pxa2xx_udc_remove(struct device *_dev)
+static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
 {
-       struct pxa2xx_udc *dev = dev_get_drvdata(_dev);
+       struct pxa2xx_udc *dev = platform_get_drvdata(pdev);
 
        udc_disable(dev);
        remove_proc_files();
@@ -2580,7 +2580,7 @@ static int __exit pxa2xx_udc_remove(struct device *_dev)
                free_irq(LUBBOCK_USB_DISC_IRQ, dev);
                free_irq(LUBBOCK_USB_IRQ, dev);
        }
-       dev_set_drvdata(_dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        the_controller = NULL;
        return 0;
 }
@@ -2601,9 +2601,9 @@ static int __exit pxa2xx_udc_remove(struct device *_dev)
  * VBUS IRQs should probably be ignored so that the PXA device just acts
  * "dead" to USB hosts until system resume.
  */
-static int pxa2xx_udc_suspend(struct device *dev, pm_message_t state)
+static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct pxa2xx_udc       *udc = dev_get_drvdata(dev);
+       struct pxa2xx_udc       *udc = platform_get_drvdata(dev);
 
        if (!udc->mach->udc_command)
                WARN("USB host won't detect disconnect!\n");
@@ -2612,9 +2612,9 @@ static int pxa2xx_udc_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int pxa2xx_udc_resume(struct device *dev)
+static int pxa2xx_udc_resume(struct platform_device *dev)
 {
-       struct pxa2xx_udc       *udc = dev_get_drvdata(dev);
+       struct pxa2xx_udc       *udc = platform_get_drvdata(dev);
 
        pullup(udc, 1);
 
@@ -2628,27 +2628,28 @@ static int pxa2xx_udc_resume(struct device *dev)
 
 /*-------------------------------------------------------------------------*/
 
-static struct device_driver udc_driver = {
-       .name           = "pxa2xx-udc",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver udc_driver = {
        .probe          = pxa2xx_udc_probe,
        .shutdown       = pxa2xx_udc_shutdown,
        .remove         = __exit_p(pxa2xx_udc_remove),
        .suspend        = pxa2xx_udc_suspend,
        .resume         = pxa2xx_udc_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "pxa2xx-udc",
+       },
 };
 
 static int __init udc_init(void)
 {
        printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION);
-       return driver_register(&udc_driver);
+       return platform_driver_register(&udc_driver);
 }
 module_init(udc_init);
 
 static void __exit udc_exit(void)
 {
-       driver_unregister(&udc_driver);
+       platform_driver_unregister(&udc_driver);
 }
 module_exit(udc_exit);
 
index 1450088539660564693a85c81163a07d72e98350..dfd9bd0b18284dbd6bd71d6348253f884b7f6b62 100644 (file)
@@ -383,7 +383,6 @@ MODULE_DEVICE_TABLE (pci, pci_ids);
 static struct pci_driver ehci_pci_driver = {
        .name =         (char *) hcd_name,
        .id_table =     pci_ids,
-       .owner =        THIS_MODULE,
 
        .probe =        usb_hcd_pci_probe,
        .remove =       usb_hcd_pci_remove,
index f9c3f5b8dd1c3adcdcc79dc2f129bf2278b14796..82f64986bc2269c2a185bfb1d05169ff9479d0a4 100644 (file)
@@ -1633,17 +1633,15 @@ static struct hc_driver isp116x_hc_driver = {
 
 /*----------------------------------------------------------------*/
 
-static int __init_or_module isp116x_remove(struct device *dev)
+static int __init_or_module isp116x_remove(struct platform_device *pdev)
 {
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct isp116x *isp116x;
-       struct platform_device *pdev;
        struct resource *res;
 
        if (!hcd)
                return 0;
        isp116x = hcd_to_isp116x(hcd);
-       pdev = container_of(dev, struct platform_device, dev);
        remove_debug_file(isp116x);
        usb_remove_hcd(hcd);
 
@@ -1660,18 +1658,16 @@ static int __init_or_module isp116x_remove(struct device *dev)
 
 #define resource_len(r) (((r)->end - (r)->start) + 1)
 
-static int __init isp116x_probe(struct device *dev)
+static int __init isp116x_probe(struct platform_device *pdev)
 {
        struct usb_hcd *hcd;
        struct isp116x *isp116x;
-       struct platform_device *pdev;
        struct resource *addr, *data;
        void __iomem *addr_reg;
        void __iomem *data_reg;
        int irq;
        int ret = 0;
 
-       pdev = container_of(dev, struct platform_device, dev);
        if (pdev->num_resources < 3) {
                ret = -ENODEV;
                goto err1;
@@ -1685,7 +1681,7 @@ static int __init isp116x_probe(struct device *dev)
                goto err1;
        }
 
-       if (dev->dma_mask) {
+       if (pdev->dev.dma_mask) {
                DBG("DMA not supported\n");
                ret = -EINVAL;
                goto err1;
@@ -1711,7 +1707,7 @@ static int __init isp116x_probe(struct device *dev)
        }
 
        /* allocate and initialize hcd */
-       hcd = usb_create_hcd(&isp116x_hc_driver, dev, dev->bus_id);
+       hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id);
        if (!hcd) {
                ret = -ENOMEM;
                goto err5;
@@ -1723,7 +1719,7 @@ static int __init isp116x_probe(struct device *dev)
        isp116x->addr_reg = addr_reg;
        spin_lock_init(&isp116x->lock);
        INIT_LIST_HEAD(&isp116x->async);
-       isp116x->board = dev->platform_data;
+       isp116x->board = pdev->dev.platform_data;
 
        if (!isp116x->board) {
                ERR("Platform data structure not initialized\n");
@@ -1764,13 +1760,13 @@ static int __init isp116x_probe(struct device *dev)
 /*
   Suspend of platform device
 */
-static int isp116x_suspend(struct device *dev, pm_message_t state)
+static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
 {
        int ret = 0;
 
        VDBG("%s: state %x\n", __func__, state);
 
-       dev->power.power_state = state;
+       dev->dev.power.power_state = state;
 
        return ret;
 }
@@ -1778,13 +1774,13 @@ static int isp116x_suspend(struct device *dev, pm_message_t state)
 /*
   Resume platform device
 */
-static int isp116x_resume(struct device *dev)
+static int isp116x_resume(struct platform_device *dev)
 {
        int ret = 0;
 
-       VDBG("%s:  state %x\n", __func__, dev->power.power_state);
+       VDBG("%s:  state %x\n", __func__, dev->dev.power.power_state);
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
 
        return ret;
 }
@@ -1796,13 +1792,14 @@ static int isp116x_resume(struct device *dev)
 
 #endif
 
-static struct device_driver isp116x_driver = {
-       .name = (char *)hcd_name,
-       .bus = &platform_bus_type,
+static struct platform_driver isp116x_driver = {
        .probe = isp116x_probe,
        .remove = isp116x_remove,
        .suspend = isp116x_suspend,
        .resume = isp116x_resume,
+       .driver = {
+               .name = (char *)hcd_name,
+       },
 };
 
 /*-----------------------------------------------------------------*/
@@ -1813,14 +1810,14 @@ static int __init isp116x_init(void)
                return -ENODEV;
 
        INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
-       return driver_register(&isp116x_driver);
+       return platform_driver_register(&isp116x_driver);
 }
 
 module_init(isp116x_init);
 
 static void __exit isp116x_cleanup(void)
 {
-       driver_unregister(&isp116x_driver);
+       platform_driver_unregister(&isp116x_driver);
 }
 
 module_exit(isp116x_cleanup);
index f0c78cf14b6ca6b11ec98010986d54179c41a5b6..d9cf3b327d96e14a3a5840126cc404659a703f3f 100644 (file)
@@ -225,9 +225,8 @@ static const struct hc_driver ohci_au1xxx_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_au1xxx_drv_probe(struct device *dev)
+static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_au1xxx_drv_probe");
@@ -239,39 +238,37 @@ static int ohci_hcd_au1xxx_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_au1xxx_drv_remove(struct device *dev)
+static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_au1xxx_remove(hcd, pdev);
        return 0;
 }
        /*TBD*/
-/*static int ohci_hcd_au1xxx_drv_suspend(struct device *dev)
+/*static int ohci_hcd_au1xxx_drv_suspend(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
-static int ohci_hcd_au1xxx_drv_resume(struct device *dev)
+static int ohci_hcd_au1xxx_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
 */
 
-static struct device_driver ohci_hcd_au1xxx_driver = {
-       .name           = "au1xxx-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_au1xxx_driver = {
        .probe          = ohci_hcd_au1xxx_drv_probe,
        .remove         = ohci_hcd_au1xxx_drv_remove,
        /*.suspend      = ohci_hcd_au1xxx_drv_suspend, */
        /*.resume       = ohci_hcd_au1xxx_drv_resume, */
+       .driver         = {
+               .name   = "au1xxx-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_au1xxx_init (void)
@@ -280,12 +277,12 @@ static int __init ohci_hcd_au1xxx_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_au1xxx_driver);
+       return platform_driver_register(&ohci_hcd_au1xxx_driver);
 }
 
 static void __exit ohci_hcd_au1xxx_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_au1xxx_driver);
+       platform_driver_unregister(&ohci_hcd_au1xxx_driver);
 }
 
 module_init (ohci_hcd_au1xxx_init);
index 336c766c6e29f0334b52da96bc72103c4b0e8767..3959ccc88332fb07e8e6f7f037c41fcbc73ffa8e 100644 (file)
@@ -204,9 +204,8 @@ static const struct hc_driver ohci_lh7a404_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_lh7a404_drv_probe(struct device *dev)
+static int ohci_hcd_lh7a404_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_lh7a404_drv_probe");
@@ -218,40 +217,38 @@ static int ohci_hcd_lh7a404_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_lh7a404_drv_remove(struct device *dev)
+static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_lh7a404_remove(hcd, pdev);
        return 0;
 }
        /*TBD*/
-/*static int ohci_hcd_lh7a404_drv_suspend(struct device *dev)
+/*static int ohci_hcd_lh7a404_drv_suspend(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
        return 0;
 }
-static int ohci_hcd_lh7a404_drv_resume(struct device *dev)
+static int ohci_hcd_lh7a404_drv_resume(struct platform_device *dev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(dev);
 
 
        return 0;
 }
 */
 
-static struct device_driver ohci_hcd_lh7a404_driver = {
-       .name           = "lh7a404-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_lh7a404_driver = {
        .probe          = ohci_hcd_lh7a404_drv_probe,
        .remove         = ohci_hcd_lh7a404_drv_remove,
        /*.suspend      = ohci_hcd_lh7a404_drv_suspend, */
        /*.resume       = ohci_hcd_lh7a404_drv_resume, */
+       .driver         = {
+               .name   = "lh7a404-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_lh7a404_init (void)
@@ -260,12 +257,12 @@ static int __init ohci_hcd_lh7a404_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_lh7a404_driver);
+       return platform_driver_register(&ohci_hcd_lh7a404_driver);
 }
 
 static void __exit ohci_hcd_lh7a404_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_lh7a404_driver);
+       platform_driver_unregister(&ohci_hcd_lh7a404_driver);
 }
 
 module_init (ohci_hcd_lh7a404_init);
index e46cc540cf4d3153fb49d9b942dfdf5652dc4f76..c9e29d80871194933651acf50605c445f6db7f90 100644 (file)
@@ -433,24 +433,22 @@ static const struct hc_driver ohci_omap_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_omap_drv_probe(struct device *dev)
+static int ohci_hcd_omap_drv_probe(struct platform_device *dev)
 {
-       return usb_hcd_omap_probe(&ohci_omap_hc_driver,
-                               to_platform_device(dev));
+       return usb_hcd_omap_probe(&ohci_omap_hc_driver, dev);
 }
 
-static int ohci_hcd_omap_drv_remove(struct device *dev)
+static int ohci_hcd_omap_drv_remove(struct platform_device *dev)
 {
-       struct platform_device  *pdev = to_platform_device(dev);
-       struct usb_hcd          *hcd = dev_get_drvdata(dev);
+       struct usb_hcd          *hcd = platform_get_drvdata(dev);
        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
 
-       usb_hcd_omap_remove(hcd, pdev);
+       usb_hcd_omap_remove(hcd, dev);
        if (ohci->transceiver) {
                (void) otg_set_host(ohci->transceiver, 0);
                put_device(ohci->transceiver->dev);
        }
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        return 0;
 }
@@ -459,9 +457,9 @@ static int ohci_hcd_omap_drv_remove(struct device *dev)
 
 #ifdef CONFIG_PM
 
-static int ohci_omap_suspend(struct device *dev, pm_message_t message)
+static int ohci_omap_suspend(struct platform_device *dev, pm_message_t message)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev));
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
@@ -473,9 +471,9 @@ static int ohci_omap_suspend(struct device *dev, pm_message_t message)
        return 0;
 }
 
-static int ohci_omap_resume(struct device *dev)
+static int ohci_omap_resume(struct platform_device *dev)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev));
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
@@ -494,16 +492,17 @@ static int ohci_omap_resume(struct device *dev)
 /*
  * Driver definition to register with the OMAP bus
  */
-static struct device_driver ohci_hcd_omap_driver = {
-       .name           = "ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_omap_driver = {
        .probe          = ohci_hcd_omap_drv_probe,
        .remove         = ohci_hcd_omap_drv_remove,
 #ifdef CONFIG_PM
        .suspend        = ohci_omap_suspend,
        .resume         = ohci_omap_resume,
 #endif
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "ohci",
+       },
 };
 
 static int __init ohci_hcd_omap_init (void)
@@ -515,12 +514,12 @@ static int __init ohci_hcd_omap_init (void)
        pr_debug("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_omap_driver);
+       return platform_driver_register(&ohci_hcd_omap_driver);
 }
 
 static void __exit ohci_hcd_omap_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_omap_driver);
+       platform_driver_unregister(&ohci_hcd_omap_driver);
 }
 
 module_init (ohci_hcd_omap_init);
index 7ce1d9ef0289ed3bba31b89b035d7f7a8a9e9d09..a59e536441e14771d95463982ccdbc4c050f751e 100644 (file)
@@ -218,7 +218,6 @@ MODULE_DEVICE_TABLE (pci, pci_ids);
 static struct pci_driver ohci_pci_driver = {
        .name =         (char *) hcd_name,
        .id_table =     pci_ids,
-       .owner =        THIS_MODULE,
 
        .probe =        usb_hcd_pci_probe,
        .remove =       usb_hcd_pci_remove,
index 92cf6f4a13748ad9535e47d2ce827c6618aa3f75..2ec6a78bd65e6673113141fcf68fb35305a055d3 100644 (file)
@@ -172,9 +172,8 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = {
        .start_port_reset =     ohci_start_port_reset,
 };
 
-static int ohci_hcd_ppc_soc_drv_probe(struct device *dev)
+static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        if (usb_disabled())
@@ -184,25 +183,25 @@ static int ohci_hcd_ppc_soc_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_ppc_soc_drv_remove(struct device *dev)
+static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_ppc_soc_remove(hcd, pdev);
        return 0;
 }
 
-static struct device_driver ohci_hcd_ppc_soc_driver = {
-       .name           = "ppc-soc-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_ppc_soc_driver = {
        .probe          = ohci_hcd_ppc_soc_drv_probe,
        .remove         = ohci_hcd_ppc_soc_drv_remove,
 #ifdef CONFIG_PM
        /*.suspend      = ohci_hcd_ppc_soc_drv_suspend,*/
        /*.resume       = ohci_hcd_ppc_soc_drv_resume,*/
 #endif
+       .driver         = {
+               .name   = "ppc-soc-ohci",
+               .owner  = THIS_MODULE,
+       },
 };
 
 static int __init ohci_hcd_ppc_soc_init(void)
@@ -211,12 +210,12 @@ static int __init ohci_hcd_ppc_soc_init(void)
        pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
                                                        sizeof(struct td));
 
-       return driver_register(&ohci_hcd_ppc_soc_driver);
+       return platform_driver_register(&ohci_hcd_ppc_soc_driver);
 }
 
 static void __exit ohci_hcd_ppc_soc_cleanup(void)
 {
-       driver_unregister(&ohci_hcd_ppc_soc_driver);
+       platform_driver_unregister(&ohci_hcd_ppc_soc_driver);
 }
 
 module_init(ohci_hcd_ppc_soc_init);
index 59e20568e8f947381753f590fdebf8b5467267bb..9d65ec30799012730f8f939f6996e9904477250d 100644 (file)
@@ -290,9 +290,8 @@ static const struct hc_driver ohci_pxa27x_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_pxa27x_drv_probe(struct device *dev)
+static int ohci_hcd_pxa27x_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        int ret;
 
        pr_debug ("In ohci_hcd_pxa27x_drv_probe");
@@ -304,41 +303,39 @@ static int ohci_hcd_pxa27x_drv_probe(struct device *dev)
        return ret;
 }
 
-static int ohci_hcd_pxa27x_drv_remove(struct device *dev)
+static int ohci_hcd_pxa27x_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_pxa27x_remove(hcd, pdev);
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_suspend(struct device *dev, pm_message_t state)
+static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
+//     struct usb_hcd *hcd = platform_get_drvdata(dev);
        printk("%s: not implemented yet\n", __FUNCTION__);
 
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_resume(struct device *dev)
+static int ohci_hcd_pxa27x_drv_resume(struct platform_device *dev)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
+//     struct usb_hcd *hcd = platform_get_drvdata(dev);
        printk("%s: not implemented yet\n", __FUNCTION__);
 
        return 0;
 }
 
 
-static struct device_driver ohci_hcd_pxa27x_driver = {
-       .name           = "pxa27x-ohci",
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_pxa27x_driver = {
        .probe          = ohci_hcd_pxa27x_drv_probe,
        .remove         = ohci_hcd_pxa27x_drv_remove,
        .suspend        = ohci_hcd_pxa27x_drv_suspend, 
-       .resume         = ohci_hcd_pxa27x_drv_resume, 
+       .resume         = ohci_hcd_pxa27x_drv_resume,
+       .driver         = {
+               .name   = "pxa27x-ohci",
+       },
 };
 
 static int __init ohci_hcd_pxa27x_init (void)
@@ -347,12 +344,12 @@ static int __init ohci_hcd_pxa27x_init (void)
        pr_debug ("block sizes: ed %d td %d\n",
                sizeof (struct ed), sizeof (struct td));
 
-       return driver_register(&ohci_hcd_pxa27x_driver);
+       return platform_driver_register(&ohci_hcd_pxa27x_driver);
 }
 
 static void __exit ohci_hcd_pxa27x_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_pxa27x_driver);
+       platform_driver_unregister(&ohci_hcd_pxa27x_driver);
 }
 
 module_init (ohci_hcd_pxa27x_init);
index ee1fc605b402c438729871c87c536ee4b2343200..35cc9402adc03dcaceccfe6e6cdd1dd16a5a220c 100644 (file)
@@ -459,39 +459,38 @@ static const struct hc_driver ohci_s3c2410_hc_driver = {
 
 /* device driver */
 
-static int ohci_hcd_s3c2410_drv_probe(struct device *dev)
+static int ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev);
 }
 
-static int ohci_hcd_s3c2410_drv_remove(struct device *dev)
+static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct usb_hcd *hcd = dev_get_drvdata(dev);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_s3c2410_remove(hcd, pdev);
        return 0;
 }
 
-static struct device_driver ohci_hcd_s3c2410_driver = {
-       .name           = "s3c2410-ohci",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver ohci_hcd_s3c2410_driver = {
        .probe          = ohci_hcd_s3c2410_drv_probe,
        .remove         = ohci_hcd_s3c2410_drv_remove,
        /*.suspend      = ohci_hcd_s3c2410_drv_suspend, */
        /*.resume       = ohci_hcd_s3c2410_drv_resume, */
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = "s3c2410-ohci",
+       },
 };
 
 static int __init ohci_hcd_s3c2410_init (void)
 {
-       return driver_register(&ohci_hcd_s3c2410_driver);
+       return platform_driver_register(&ohci_hcd_s3c2410_driver);
 }
 
 static void __exit ohci_hcd_s3c2410_cleanup (void)
 {
-       driver_unregister(&ohci_hcd_s3c2410_driver);
+       platform_driver_unregister(&ohci_hcd_s3c2410_driver);
 }
 
 module_init (ohci_hcd_s3c2410_init);
index 5607c0ae683569525358ed5eabeec8c47781eb6d..a7722a6a5a5b40cf7bf18dbd4fbfb75e4b15fe33 100644 (file)
@@ -1631,24 +1631,21 @@ static struct hc_driver sl811h_hc_driver = {
 /*-------------------------------------------------------------------------*/
 
 static int __devexit
-sl811h_remove(struct device *dev)
+sl811h_remove(struct platform_device *dev)
 {
-       struct usb_hcd          *hcd = dev_get_drvdata(dev);
+       struct usb_hcd          *hcd = platform_get_drvdata(dev);
        struct sl811            *sl811 = hcd_to_sl811(hcd);
-       struct platform_device  *pdev;
        struct resource         *res;
 
-       pdev = container_of(dev, struct platform_device, dev);
-
        remove_debug_file(sl811);
        usb_remove_hcd(hcd);
 
        /* some platforms may use IORESOURCE_IO */
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       res = platform_get_resource(dev, IORESOURCE_MEM, 1);
        if (res)
                iounmap(sl811->data_reg);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
        if (res)
                iounmap(sl811->addr_reg);
 
@@ -1657,11 +1654,10 @@ sl811h_remove(struct device *dev)
 }
 
 static int __devinit
-sl811h_probe(struct device *dev)
+sl811h_probe(struct platform_device *dev)
 {
        struct usb_hcd          *hcd;
        struct sl811            *sl811;
-       struct platform_device  *pdev;
        struct resource         *addr, *data;
        int                     irq;
        void __iomem            *addr_reg;
@@ -1674,24 +1670,23 @@ sl811h_probe(struct device *dev)
         * specific platform_data.  we don't probe for IRQs, and do only
         * minimal sanity checking.
         */
-       pdev = container_of(dev, struct platform_device, dev);
-       irq = platform_get_irq(pdev, 0);
-       if (pdev->num_resources < 3 || irq < 0)
+       irq = platform_get_irq(dev, 0);
+       if (dev->num_resources < 3 || irq < 0)
                return -ENODEV;
 
        /* refuse to confuse usbcore */
-       if (dev->dma_mask) {
+       if (dev->dev.dma_mask) {
                DBG("no we won't dma\n");
                return -EINVAL;
        }
 
        /* the chip may be wired for either kind of addressing */
-       addr = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       addr = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       data = platform_get_resource(dev, IORESOURCE_MEM, 1);
        retval = -EBUSY;
        if (!addr || !data) {
-               addr = platform_get_resource(pdev, IORESOURCE_IO, 0);
-               data = platform_get_resource(pdev, IORESOURCE_IO, 1);
+               addr = platform_get_resource(dev, IORESOURCE_IO, 0);
+               data = platform_get_resource(dev, IORESOURCE_IO, 1);
                if (!addr || !data)
                        return -ENODEV;
                ioaddr = 1;
@@ -1713,7 +1708,7 @@ sl811h_probe(struct device *dev)
        }
 
        /* allocate and initialize hcd */
-       hcd = usb_create_hcd(&sl811h_hc_driver, dev, dev->bus_id);
+       hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev->dev.bus_id);
        if (!hcd) {
                retval = -ENOMEM;
                goto err5;
@@ -1723,7 +1718,7 @@ sl811h_probe(struct device *dev)
 
        spin_lock_init(&sl811->lock);
        INIT_LIST_HEAD(&sl811->async);
-       sl811->board = dev->platform_data;
+       sl811->board = dev->dev.platform_data;
        init_timer(&sl811->timer);
        sl811->timer.function = sl811h_timer;
        sl811->timer.data = (unsigned long) sl811;
@@ -1785,9 +1780,9 @@ sl811h_probe(struct device *dev)
  */
 
 static int
-sl811h_suspend(struct device *dev, pm_message_t state)
+sl811h_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct usb_hcd  *hcd = dev_get_drvdata(dev);
+       struct usb_hcd  *hcd = platform_get_drvdata(dev);
        struct sl811    *sl811 = hcd_to_sl811(hcd);
        int             retval = 0;
 
@@ -1796,27 +1791,27 @@ sl811h_suspend(struct device *dev, pm_message_t state)
        else if (state.event == PM_EVENT_SUSPEND)
                port_power(sl811, 0);
        if (retval == 0)
-               dev->power.power_state = state;
+               dev->dev.power.power_state = state;
        return retval;
 }
 
 static int
-sl811h_resume(struct device *dev)
+sl811h_resume(struct platform_device *dev)
 {
-       struct usb_hcd  *hcd = dev_get_drvdata(dev);
+       struct usb_hcd  *hcd = platform_get_drvdata(dev);
        struct sl811    *sl811 = hcd_to_sl811(hcd);
 
        /* with no "check to see if VBUS is still powered" board hook,
         * let's assume it'd only be powered to enable remote wakeup.
         */
-       if (dev->power.power_state.event == PM_EVENT_SUSPEND
+       if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND
                        || !hcd->can_wakeup) {
                sl811->port1 = 0;
                port_power(sl811, 1);
                return 0;
        }
 
-       dev->power.power_state = PMSG_ON;
+       dev->dev.power.power_state = PMSG_ON;
        return sl811h_bus_resume(hcd);
 }
 
@@ -1829,16 +1824,16 @@ sl811h_resume(struct device *dev)
 
 
 /* this driver is exported so sl811_cs can depend on it */
-struct device_driver sl811h_driver = {
-       .name =         (char *) hcd_name,
-       .bus =          &platform_bus_type,
-       .owner =        THIS_MODULE,
-
+struct platform_driver sl811h_driver = {
        .probe =        sl811h_probe,
        .remove =       __devexit_p(sl811h_remove),
 
        .suspend =      sl811h_suspend,
        .resume =       sl811h_resume,
+       .driver = {
+               .name = (char *) hcd_name,
+               .owner = THIS_MODULE,
+       },
 };
 EXPORT_SYMBOL(sl811h_driver);
 
@@ -1850,12 +1845,12 @@ static int __init sl811h_init(void)
                return -ENODEV;
 
        INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
-       return driver_register(&sl811h_driver);
+       return platform_driver_register(&sl811h_driver);
 }
 module_init(sl811h_init);
 
 static void __exit sl811h_cleanup(void)
 {
-       driver_unregister(&sl811h_driver);
+       platform_driver_unregister(&sl811h_driver);
 }
 module_exit(sl811h_cleanup);
index 15e0a511069bc419e240d1e224eff7b8e518aeba..d33ce3982a5f0e08f249ebb00697f3de22907fdc 100644 (file)
@@ -831,7 +831,6 @@ MODULE_DEVICE_TABLE(pci, uhci_pci_ids);
 static struct pci_driver uhci_pci_driver = {
        .name =         (char *)hcd_name,
        .id_table =     uhci_pci_ids,
-       .owner =        THIS_MODULE,
 
        .probe =        usb_hcd_pci_probe,
        .remove =       usb_hcd_pci_remove,
index c89d0769b3da99185f1d101253d858c4e17fa1da..950543aa5ac72a6c10f593136e6179c8ec053308 100644 (file)
@@ -327,6 +327,18 @@ static inline void mts_urb_abort(struct mts_desc* desc) {
        usb_kill_urb( desc->urb );
 }
 
+static int mts_slave_alloc (struct scsi_device *s)
+{
+       s->inquiry_len = 0x24;
+       return 0;
+}
+
+static int mts_slave_configure (struct scsi_device *s)
+{
+       blk_queue_dma_alignment(s->request_queue, (512 - 1));
+       return 0;
+}
+
 static int mts_scsi_abort (Scsi_Cmnd *srb)
 {
        struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]);
@@ -411,7 +423,7 @@ static void mts_transfer_done( struct urb *transfer, struct pt_regs *regs )
        MTS_INT_INIT();
 
        context->srb->result &= MTS_SCSI_ERR_MASK;
-       context->srb->result |= (unsigned)context->status<<1;
+       context->srb->result |= (unsigned)(*context->scsi_status)<<1;
 
        mts_transfer_cleanup(transfer);
 
@@ -427,7 +439,7 @@ static void mts_get_status( struct urb *transfer )
        mts_int_submit_urb(transfer,
                           usb_rcvbulkpipe(context->instance->usb_dev,
                                           context->instance->ep_response),
-                          &context->status,
+                          context->scsi_status,
                           1,
                           mts_transfer_done );
 }
@@ -481,7 +493,7 @@ static void mts_command_done( struct urb *transfer, struct pt_regs *regs )
                                           context->data_pipe,
                                           context->data,
                                           context->data_length,
-                                          context->srb->use_sg ? mts_do_sg : mts_data_done);
+                                          context->srb->use_sg > 1 ? mts_do_sg : mts_data_done);
                } else {
                        mts_get_status(transfer);
                }
@@ -627,12 +639,11 @@ int mts_scsi_queuecommand( Scsi_Cmnd *srb, mts_scsi_cmnd_callback callback )
                        callback(srb);
 
        }
-
 out:
        return err;
 }
 
-static Scsi_Host_Template mts_scsi_host_template = {
+static struct scsi_host_template mts_scsi_host_template = {
        .module                 = THIS_MODULE,
        .name                   = "microtekX6",
        .proc_name              = "microtekX6",
@@ -645,6 +656,9 @@ static Scsi_Host_Template mts_scsi_host_template = {
        .cmd_per_lun =          1,
        .use_clustering =       1,
        .emulated =             1,
+       .slave_alloc =          mts_slave_alloc,
+       .slave_configure =      mts_slave_configure,
+       .max_sectors=           256, /* 128 K */
 };
 
 struct vendor_product
@@ -771,8 +785,8 @@ static int mts_usb_probe(struct usb_interface *intf,
                MTS_WARNING( "couldn't find an output bulk endpoint. Bailing out.\n" );
                return -ENODEV;
        }
-       
-       
+
+
        new_desc = kzalloc(sizeof(struct mts_desc), GFP_KERNEL);
        if (!new_desc)
                goto out;
@@ -781,6 +795,10 @@ static int mts_usb_probe(struct usb_interface *intf,
        if (!new_desc->urb)
                goto out_kfree;
 
+       new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL);
+       if (!new_desc->context.scsi_status)
+               goto out_kfree2;
+
        new_desc->usb_dev = dev;
        new_desc->usb_intf = intf;
        init_MUTEX(&new_desc->lock);
@@ -817,6 +835,8 @@ static int mts_usb_probe(struct usb_interface *intf,
        usb_set_intfdata(intf, new_desc);
        return 0;
 
+ out_kfree2:
+       kfree(new_desc->context.scsi_status);
  out_free_urb:
        usb_free_urb(new_desc->urb);
  out_kfree:
@@ -836,6 +856,7 @@ static void mts_usb_disconnect (struct usb_interface *intf)
 
        scsi_host_put(desc->host);
        usb_free_urb(desc->urb);
+       kfree(desc->context.scsi_status);
        kfree(desc);
 }
 
@@ -856,5 +877,3 @@ module_exit(microtek_drv_exit);
 MODULE_AUTHOR( DRIVER_AUTHOR );
 MODULE_DESCRIPTION( DRIVER_DESC );
 MODULE_LICENSE("GPL");
-
-
index 3271deb8c001694a065b42662543cf2b05066470..926d4bdc6746cb48b7352fe1d338f9e111d426c0 100644 (file)
@@ -22,7 +22,7 @@ struct mts_transfer_context
        int data_pipe;
        int fragment;
 
-       u8 status; /* status returned from ep_response after command completion */
+       u8 *scsi_status; /* status returned from ep_response after command completion */
 };
 
 
index 5e03b93f29f66a8dd42278f3c1941bee5d0c2e96..07cb17db42fc1eb8d473649f45873f43d9d821b5 100644 (file)
@@ -42,3 +42,7 @@ obj-$(CONFIG_USB_ACECAD)      += acecad.o
 obj-$(CONFIG_USB_YEALINK)      += yealink.o
 obj-$(CONFIG_USB_XPAD)         += xpad.o
 obj-$(CONFIG_USB_APPLETOUCH)   += appletouch.o
+
+ifeq ($(CONFIG_USB_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
index 79ddce4555abdea297e5b803316052f040f3c618..45f3130fadea9f9646a3212bda45bfb4ee2b3775 100644 (file)
@@ -1318,6 +1318,7 @@ void hid_init_reports(struct hid_device *hid)
 #define USB_DEVICE_ID_WACOM_PTU                0x0003
 #define USB_DEVICE_ID_WACOM_INTUOS3    0x00B0
 #define USB_DEVICE_ID_WACOM_CINTIQ     0x003F
+#define USB_DEVICE_ID_WACOM_DTF         0x00C0
 
 #define USB_VENDOR_ID_ACECAD           0x0460
 #define USB_DEVICE_ID_ACECAD_FLAIR     0x0004
@@ -1524,6 +1525,9 @@ static struct hid_blacklist {
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 3, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 4, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 5, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 7, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 8, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 9, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 1, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 2, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 3, HID_QUIRK_IGNORE },
@@ -1531,11 +1535,19 @@ static struct hid_blacklist {
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 1, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 2, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 3, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 4, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 5, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 6, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 5, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE },
+       { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
 
index 3b581853cf101d6b24962a8fb6d5c9a13513727e..4a50acb39d29acd9ebcdb470f482e402027719ac 100644 (file)
  *****************************************************************************/
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/input.h>
index 5b8d65f62abf20af059be248627f83fe712baf1a..a32cfe51b77de11236b98199ba00461784f479d6 100644 (file)
@@ -160,7 +160,8 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
         * though so it's not too big a deal
         */
        if (dev->data.pos >= dev->data.len) {
-               dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n",
+               dev_dbg(&dev->udev->dev,
+                       "%s - Error ran out of data. pos: %d, len: %d\n",
                        __FUNCTION__, dev->data.pos, dev->data.len);
                return -1;
        }
@@ -306,7 +307,7 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs)
                        err("Bad message recieved, no stop bit found.\n");
                }
 
-               dev_dbg(&remote->udev,
+               dev_dbg(&remote->udev->dev,
                        "%s found valid message: system: %d, button: %d, toggle: %d\n",
                        __FUNCTION__, message.system, message.button, message.toggle);
 
index 7fce526560ca0f396496a4cd3d9c1f154404c7a3..52cc18cd247d63e25f773c028813391410848a11 100644 (file)
  *****************************************************************************/
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/input.h>
index dca5ee93a4efc8e1d2e386354deac8ad129fb33a..19e015d171aab767a7df15582dded3958b7b8feb 100644 (file)
@@ -37,8 +37,6 @@
 #include "hid.h"
 #include "pid.h"
 
-#define DEBUG
-
 #define CHECK_OWNERSHIP(i, hid_pid)    \
        ((i) < FF_EFFECTS_MAX && i >= 0 && \
        test_bit(FF_PID_FLAGS_USED, &hid_pid->effects[(i)].flags) && \
index 0043e6ebcd1f0ada7cc751bab444e92fae6b6e03..7420c6b84284d34cfbad641216ce056d49f852aa 100644 (file)
 #include <linux/input.h>
 #include <linux/module.h>
 #include <linux/init.h>
-
-#if !defined(DEBUG) && defined(CONFIG_USB_DEBUG)
-#define DEBUG
-#endif
 #include <linux/usb.h>
 #include <linux/usb_input.h>
 
index ea0f75773ae1eaa9ad74d572d1656543bda68d55..aea1cfae34ccce71c1f3345e80eb18c5f759a9da 100644 (file)
  *    v1.30.1 (pi) - Added Graphire3 support
  *     v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
  *     v1.43 (pc) - Added support for Cintiq 21UX
-                  - Fixed a Graphire bug
-                  - Merged wacom_intuos3_irq into wacom_intuos_irq
+ *                - Fixed a Graphire bug
+ *                - Merged wacom_intuos3_irq into wacom_intuos_irq
+ *     v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc.
+ *                - Report Device IDs
  */
 
 /*
@@ -76,7 +78,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.43"
+#define DRIVER_VERSION "v1.44"
 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
 #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
 #define DRIVER_LICENSE "GPL"
@@ -86,10 +88,14 @@ MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE(DRIVER_LICENSE);
 
 #define USB_VENDOR_ID_WACOM    0x056a
+#define STYLUS_DEVICE_ID       0x02
+#define CURSOR_DEVICE_ID       0x06
+#define ERASER_DEVICE_ID       0x0A
 
 enum {
        PENPARTNER = 0,
        GRAPHIRE,
+       G4,
        PL,
        INTUOS,
        INTUOS3,
@@ -116,6 +122,7 @@ struct wacom {
        struct urb *irq;
        struct wacom_features *features;
        int tool[2];
+       int id[2];
        __u32 serial[2];
        char phys[32];
 };
@@ -136,7 +143,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
        struct input_dev *dev = wacom->dev;
-       int prox, pressure;
+       int prox, pressure, id;
        int retval;
 
        switch (urb->status) {
@@ -163,6 +170,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
 
        input_regs(dev, regs);
 
+       id = ERASER_DEVICE_ID;
        if (prox) {
 
                pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
@@ -177,11 +185,15 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
                 * an out of proximity for previous tool then a in for new tool.
                 */
                if (!wacom->tool[0]) {
-                       /* Going into proximity select tool */
-                       wacom->tool[1] = (data[4] & 0x20)? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
+                       /* Eraser bit set for DTF */
+                       if (data[1] & 0x10)
+                               wacom->tool[1] = BTN_TOOL_RUBBER;
+                       else
+                               /* Going into proximity select tool */
+                               wacom->tool[1] = (data[4] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
                } else {
                        /* was entered with stylus2 pressed */
-                       if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20) ) {
+                       if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
                                /* report out proximity for previous tool */
                                input_report_key(dev, wacom->tool[1], 0);
                                input_sync(dev);
@@ -192,8 +204,9 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
                if (wacom->tool[1] != BTN_TOOL_RUBBER) {
                        /* Unknown tool selected default to pen tool */
                        wacom->tool[1] = BTN_TOOL_PEN;
+                       id = STYLUS_DEVICE_ID;
                }
-               input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */
+               input_report_key(dev, wacom->tool[1], id); /* report in proximity for tool */
                input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
                input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
                input_report_abs(dev, ABS_PRESSURE, pressure);
@@ -250,10 +263,10 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs)
 
        input_regs(dev, regs);
        if (data[1] & 0x04) {
-               input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20);
+               input_report_key(dev, BTN_TOOL_RUBBER, (data[1] & 0x20) ? ERASER_DEVICE_ID : 0);
                input_report_key(dev, BTN_TOUCH, data[1] & 0x08);
        } else {
-               input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20);
+               input_report_key(dev, BTN_TOOL_PEN, (data[1] & 0x20) ? STYLUS_DEVICE_ID : 0);
                input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
        }
        input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2]));
@@ -299,7 +312,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs)
        }
 
        input_regs(dev, regs);
-       input_report_key(dev, BTN_TOOL_PEN, 1);
+       input_report_key(dev, BTN_TOOL_PEN, STYLUS_DEVICE_ID);
        input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1]));
        input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3]));
        input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127);
@@ -319,7 +332,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
        struct input_dev *dev = wacom->dev;
-       int x, y;
+       int x, y, id, rw;
        int retval;
 
        switch (urb->status) {
@@ -344,6 +357,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
 
        input_regs(dev, regs);
 
+       id = STYLUS_DEVICE_ID;
        if (data[1] & 0x10) { /* in prox */
 
                switch ((data[1] >> 5) & 3) {
@@ -354,18 +368,27 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
 
                        case 1: /* Rubber */
                                wacom->tool[0] = BTN_TOOL_RUBBER;
+                               id = ERASER_DEVICE_ID;
                                break;
 
                        case 2: /* Mouse with wheel */
                                input_report_key(dev, BTN_MIDDLE, data[1] & 0x04);
-                               input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
+                               if (wacom->features->type == G4) {
+                                       rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03);
+                                       input_report_rel(dev, REL_WHEEL, rw);
+                               } else
+                                       input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
                                /* fall through */
 
                        case 3: /* Mouse without wheel */
                                wacom->tool[0] = BTN_TOOL_MOUSE;
+                               id = CURSOR_DEVICE_ID;
                                input_report_key(dev, BTN_LEFT, data[1] & 0x01);
                                input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
-                               input_report_abs(dev, ABS_DISTANCE, data[7]);
+                               if (wacom->features->type == G4)
+                                       input_report_abs(dev, ABS_DISTANCE, data[6]);
+                               else
+                                       input_report_abs(dev, ABS_DISTANCE, data[7]);
                                break;
                }
        }
@@ -376,16 +399,50 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
                input_report_abs(dev, ABS_X, x);
                input_report_abs(dev, ABS_Y, y);
                if (wacom->tool[0] != BTN_TOOL_MOUSE) {
-                       input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6]));
+                       input_report_abs(dev, ABS_PRESSURE, data[6] | ((data[7] & 0x01) << 8));
                        input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
                        input_report_key(dev, BTN_STYLUS, data[1] & 0x02);
                        input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
                }
        }
 
-       input_report_key(dev, wacom->tool[0], data[1] & 0x10);
+       input_report_key(dev, wacom->tool[0], (data[1] & 0x10) ? id : 0);
        input_sync(dev);
 
+       /* send pad data */
+       if (wacom->features->type == G4) {
+               /* fist time sending pad data */
+               if (wacom->tool[1] != BTN_TOOL_FINGER) {
+                       wacom->id[1] = 0;
+                       wacom->serial[1] = (data[7] & 0x38) >> 2;
+               }
+               if (data[7] & 0xf8) {
+                       input_report_key(dev, BTN_0, (data[7] & 0x40));
+                       input_report_key(dev, BTN_4, (data[7] & 0x80));
+                       if (((data[7] & 0x38) >> 2) == (wacom->serial[1] & 0x0e))
+                               /* alter REL_WHEEL value so X apps can get it */
+                               wacom->serial[1] += (wacom->serial[1] & 0x01) ? -1 : 1;
+                       else
+                                wacom->serial[1] = (data[7] & 0x38 ) >> 2;
+
+                       /* don't alter the value when there is no wheel event */
+                       if (wacom->serial[1] == 1)
+                               wacom->serial[1] = 0;
+                       rw = wacom->serial[1];
+                       rw = (rw & 0x08) ? -(rw & 0x07) : (rw & 0x07);
+                       input_report_rel(dev, REL_WHEEL, rw);
+                       wacom->tool[1] = BTN_TOOL_FINGER;
+                       wacom->id[1] = data[7] & 0xf8;
+                       input_report_key(dev, wacom->tool[1], 0xf0);
+                       input_event(dev, EV_MSC, MSC_SERIAL, 0xf0);
+               } else if (wacom->id[1]) {
+                       wacom->id[1] = 0;
+                       wacom->serial[1] = 0;
+                       input_report_key(dev, wacom->tool[1], 0);
+                       input_event(dev, EV_MSC, MSC_SERIAL, 0xf0);
+               }
+               input_sync(dev);
+       }
  exit:
        retval = usb_submit_urb (urb, GFP_ATOMIC);
        if (retval)
@@ -410,7 +467,8 @@ static int wacom_intuos_inout(struct urb *urb)
                        (data[4] << 20) + (data[5] << 12) +
                        (data[6] << 4) + (data[7] >> 4);
 
-               switch ((data[2] << 4) | (data[3] >> 4)) {
+               wacom->id[idx] = (data[2] << 4) | (data[3] >> 4);
+               switch (wacom->id[idx]) {
                        case 0x812: /* Inking pen */
                        case 0x801: /* Intuos3 Inking pen */
                        case 0x012:
@@ -458,7 +516,7 @@ static int wacom_intuos_inout(struct urb *urb)
                        default: /* Unknown tool */
                                wacom->tool[idx] = BTN_TOOL_PEN;
                }
-               input_report_key(dev, wacom->tool[idx], 1);
+               input_report_key(dev, wacom->tool[idx], wacom->id[idx]);
                input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
                input_sync(dev);
                return 1;
@@ -637,7 +695,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
                }
        }
 
-       input_report_key(dev, wacom->tool[idx], 1);
+       input_report_key(dev, wacom->tool[idx], wacom->id[idx]);
        input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
        input_sync(dev);
 
@@ -655,6 +713,13 @@ static struct wacom_features wacom_features[] = {
        { "Wacom Graphire2 5x7", 8,  13918, 10206,  511, 32, GRAPHIRE,   wacom_graphire_irq },
        { "Wacom Graphire3",     8,  10208,  7424,  511, 32, GRAPHIRE,   wacom_graphire_irq },
        { "Wacom Graphire3 6x8", 8,  16704, 12064,  511, 32, GRAPHIRE,   wacom_graphire_irq },
+       { "Wacom Graphire4 4x5", 8,  10208,  7424,  511, 32, G4,         wacom_graphire_irq },
+       { "Wacom Graphire4 6x8", 8,  16704, 12064,  511, 32, G4,         wacom_graphire_irq },
+       { "Wacom Volito",        8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
+       { "Wacom PenStation2",   8,   3250,  2320,  255, 32, GRAPHIRE,   wacom_graphire_irq },
+       { "Wacom Volito2 4x5",   8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
+       { "Wacom Volito2 2x3",   8,   3248,  2320,  511, 32, GRAPHIRE,   wacom_graphire_irq },
+       { "Wacom PenPartner2",   8,   3250,  2320,  255, 32, GRAPHIRE,   wacom_graphire_irq },
        { "Wacom Intuos 4x5",   10,  12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos 6x8",   10,  20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos 9x12",  10,  30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
@@ -666,16 +731,20 @@ static struct wacom_features wacom_features[] = {
        { "Wacom PL600SX",       8,   6260,  5016,  255, 32, PL,         wacom_pl_irq },
        { "Wacom PL550",         8,   6144,  4608,  511, 32, PL,         wacom_pl_irq },
        { "Wacom PL800",         8,   7220,  5780,  511, 32, PL,         wacom_pl_irq },
+       { "Wacom PL700",         8,   6758,  5406,  511, 32, PL,         wacom_pl_irq },
+       { "Wacom PL510",         8,   6282,  4762,  511, 32, PL,         wacom_pl_irq },
+       { "Wacom PL710",         8,  34080, 27660,  511, 32, PL,         wacom_pl_irq },
+       { "Wacom DTF720",        8,   6858,  5506,  511, 32, PL,         wacom_pl_irq },
+       { "Wacom Cintiq Partner",8,  20480, 15360,  511, 32, PL,         wacom_ptu_irq },
        { "Wacom Intuos2 4x5",   10, 12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos2 9x12",  10, 30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
        { "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
-       { "Wacom Volito",        8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
-       { "Wacom Cintiq Partner",8,  20480, 15360,  511, 32, PL,         wacom_ptu_irq },
        { "Wacom Intuos3 4x5",   10, 25400, 20320, 1023, 15, INTUOS3,    wacom_intuos_irq },
        { "Wacom Intuos3 6x8",   10, 40640, 30480, 1023, 15, INTUOS3,    wacom_intuos_irq },
        { "Wacom Intuos3 9x12",  10, 60960, 45720, 1023, 15, INTUOS3,    wacom_intuos_irq },
+       { "Wacom Intuos3 6x11",  10, 54204, 31750, 1023, 15, INTUOS3,    wacom_intuos_irq },
        { "Wacom Cintiq 21UX",   10, 87200, 65600, 1023, 15, CINTIQ,     wacom_intuos_irq },
        { "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
        { }
@@ -688,6 +757,13 @@ static struct usb_device_id wacom_ids[] = {
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) },
@@ -699,16 +775,20 @@ static struct usb_device_id wacom_ids[] = {
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },
-       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
-       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
        { }
@@ -779,6 +859,13 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0);
 
        switch (wacom->features->type) {
+               case G4:
+                       input_dev->evbit[0] |= BIT(EV_MSC);
+                       input_dev->mscbit[0] |= BIT(MSC_SERIAL);
+                       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
+                       input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
+                       /* fall through */
+
                case GRAPHIRE:
                        input_dev->evbit[0] |= BIT(EV_REL);
                        input_dev->relbit[0] |= BIT(REL_WHEEL);
index 862e40a8368963ee43552c30138dbcad0b4aa1c3..6c693bc68e2e8f2ce71df7fe793c988ed3db0c17 100644 (file)
@@ -18,4 +18,8 @@ obj-$(CONFIG_USB_RIO500)      += rio500.o
 obj-$(CONFIG_USB_TEST)         += usbtest.o
 obj-$(CONFIG_USB_USS720)       += uss720.o
 
-obj-$(CONFIG_USB_SISUSBVGA)    += sisusbvga/
\ No newline at end of file
+obj-$(CONFIG_USB_SISUSBVGA)    += sisusbvga/
+
+ifeq ($(CONFIG_USB_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
index 5f33f7c648855f2d3b8979cccde43b429eb658e8..2a28ceeaa66a2e848e3596c41cfe8a65b0f4be5f 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/wait.h>
-#undef DEBUG                   /* include debug macros until it's done */
 #include <linux/usb.h>
 
 /*-------------------------------------------------------------------*/
index b84eda631ab58488a7efe3fe35f6041b5fe1bec1..a30d4a6ee8240237943f5ad009582ebc3a490150 100644 (file)
@@ -26,9 +26,6 @@
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG  1
-#endif
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 7d02d8ec6b1a68cd71a03445151092e1494ea779..9590dbac5d9a55e78c268d77fdd87e65fa727aa5 100644 (file)
@@ -393,7 +393,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
                                      ibuf, this_read, &partial,
                                      8000);
 
-               dbg(KERN_DEBUG "read stats: result:%d this_read:%u partial:%u",
+               dbg("read stats: result:%d this_read:%u partial:%u",
                       result, this_read, partial);
 
                if (partial) {
index f6ba4c788dbc09f7b00e9b3059e74eaa11cfebc0..3c93921cb6b38e59a8d00ff9b20929feac98a06e 100644 (file)
@@ -10,9 +10,6 @@
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG   1
-#endif
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 2997f558159b12cf12e29e5348e307fbd0812aa1..605a2afe34ed614d485aea86195ef7550b073a31 100644 (file)
@@ -1,7 +1,4 @@
 #include <linux/config.h>
-#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
-#   define DEBUG
-#endif
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 0592cb5e6c4d65c6fdf7ecd6e7777bb145f1d4ab..1cabe7ed91f5a90386af744b3e757d3e8d15db6f 100644 (file)
@@ -41,8 +41,6 @@
 
 /*****************************************************************************/
 
-#define DEBUG
-
 #include <linux/module.h>
 #include <linux/socket.h>
 #include <linux/parport.h>
index 222c0495f791113970616f1dc514b8bda046cab0..a21e6eaabaf67f2f678404b48217741e8f453a8f 100644 (file)
@@ -16,3 +16,7 @@ obj-$(CONFIG_USB_NET_CDC_SUBSET)      += cdc_subset.o
 obj-$(CONFIG_USB_NET_ZAURUS)   += zaurus.o
 obj-$(CONFIG_USB_USBNET)       += usbnet.o
 obj-$(CONFIG_USB_ZD1201)       += zd1201.o
+
+ifeq ($(CONFIG_USB_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
index 252a34fbb42cc24931703fcdbac29d6657942421..542120ef1fd2891015255212e4df7be1c507449c 100644 (file)
@@ -23,9 +23,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/kmod.h>
 #include <linux/sched.h>
index 652b04bbf6afb3327664c14c471c0b99b586c5c1..c008c981862bfad424f70b7f33e2ff4703332454 100644 (file)
@@ -21,9 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index f1730b685fd2c3e471e950e189edf03e39018a5e..f05cfb83c82d99b57d76123dc3da2d2f95d0a0c9 100644 (file)
@@ -18,9 +18,6 @@
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/kmod.h>
 #include <linux/sched.h>
index c0f263b202a60ea70eeda768593d7ee8337b1190..2455e9a85674584c976db10942e35577c7e1cd31 100644 (file)
@@ -22,9 +22,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index 6bef1be6b36cce979ddeaef7131630d68e657f39..b5776518020f13dc0bfd680f2788900ecf3ede05 100644 (file)
@@ -219,7 +219,6 @@ struct kaweth_device
 
        __u32 status;
        int end;
-       int removed;
        int suspend_lowmem_rx;
        int suspend_lowmem_ctrl;
        int linkstate;
@@ -699,6 +698,7 @@ static int kaweth_close(struct net_device *net)
 
        usb_kill_urb(kaweth->irq_urb);
        usb_kill_urb(kaweth->rx_urb);
+       usb_kill_urb(kaweth->tx_urb);
 
        flush_scheduled_work();
 
@@ -750,13 +750,6 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
 
        spin_lock(&kaweth->device_lock);
 
-       if (kaweth->removed) {
-       /* our device is undergoing disconnection - we bail out */
-               spin_unlock(&kaweth->device_lock);
-               dev_kfree_skb_irq(skb);
-               return 0;
-       }
-
        kaweth_async_set_rx_mode(kaweth);
        netif_stop_queue(net);
 
@@ -1136,10 +1129,6 @@ static void kaweth_disconnect(struct usb_interface *intf)
                return;
        }
        netdev = kaweth->net;
-       kaweth->removed = 1;
-       usb_kill_urb(kaweth->irq_urb);
-       usb_kill_urb(kaweth->rx_urb);
-       usb_kill_urb(kaweth->tx_urb);
 
        kaweth_dbg("Unregistering net device");
        unregister_netdev(netdev);
index cee55f8cf64fb5b2ff97b9f146615bcbb91e2146..b3799b1a2b0d56910ab38f2633f64ea477d2ba18 100644 (file)
@@ -21,9 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index 537eb181d985627d91b9fe6e0cfdcf42d9090fbc..683e3df5d607de3c191f60d04562fcebb5ff030e 100644 (file)
@@ -28,8 +28,6 @@
  *                     is out of the interrupt routine.
  */
 
-#undef DEBUG
-
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/init.h>
index 74c2b3581c768e7c55c655f3e36cb2cefe0fc24c..89856aa0e3b8c5c5e4bd7f684ac035e66e68a56e 100644 (file)
@@ -21,9 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index b5a925dc1beb2623c97d78973944f5c3157fc1bd..c0ecbab6f6ba0d311ca26d84a74896e22da7b5c8 100644 (file)
@@ -21,9 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index 74f05c9c84d5f545c5ba994ed5e727c654c68c6d..362d6907c9bba3d68cd54f6898581deca3c7eada 100644 (file)
@@ -34,9 +34,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index 5d4b7d55b097c8937032e335243a51e510e0dfaa..680d13957af4b27e8ffed4858eafbf8021ae861a 100644 (file)
@@ -21,9 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#   define DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
similarity index 99%
rename from drivers/usb/serial/ChangeLog.old
rename to drivers/usb/serial/ChangeLog.history
index c1b279939bbf46f0a3a3ac0f5e5e7187c9304d99..52c4f7bd7a80a3279f8a59fc4ceaed2dd350e71f 100644 (file)
@@ -400,7 +400,7 @@ visor.c Change Log comments:
 
  (11/11/2001) gkh
        Added support for the m125 devices, and added check to prevent oopses
-       for Clié devices that lie about the number of ports they have.
+       for Clié devices that lie about the number of ports they have.
 
  (08/30/2001) gkh
        Added support for the Clie devices, both the 3.5 and 4.0 os versions.
index 7b5e8e4ee2bbac4a2ef01309cc9a13653c215dee..14f55fd26a64b06f49b4da4bea56128df8227874 100644 (file)
@@ -62,6 +62,15 @@ config USB_SERIAL_AIRPRIME
          To compile this driver as a module, choose M here: the
          module will be called airprime.
 
+config USB_SERIAL_ANYDATA
+       tristate "USB AnyData CDMA Wireless Driver"
+       depends on USB_SERIAL
+       help
+         Say Y here if you want to use a AnyData CDMA device.
+
+         To compile this driver as a module, choose M here: the
+         module will be called anydata.
+
 config USB_SERIAL_BELKIN
        tristate "USB Belkin and Peracom Single Port Serial Driver"
        depends on USB_SERIAL
@@ -394,15 +403,6 @@ config USB_SERIAL_MCT_U232
          To compile this driver as a module, choose M here: the
          module will be called mct_u232.
 
-config USB_SERIAL_NOKIA_DKU2
-       tristate "USB Nokia DKU2 Driver"
-       depends on USB_SERIAL
-       help
-         Say Y here if you want to use a Nokia DKU2 device.
-
-         To compile this driver as a module, choose M here: the
-         module will be called nokia_dku2.
-
 config USB_SERIAL_PL2303
        tristate "USB Prolific 2303 Single Port Serial Driver"
        depends on USB_SERIAL
index 55fd461793b7ed281e8cc680b18c65d11e987dc5..f0b04420cea1304656fdcc6a835d7965a79ac332 100644 (file)
@@ -12,6 +12,7 @@ usbserial-obj-$(CONFIG_USB_EZUSB)             += ezusb.o
 usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
 
 obj-$(CONFIG_USB_SERIAL_AIRPRIME)              += airprime.o
+obj-$(CONFIG_USB_SERIAL_ANYDATA)               += anydata.o
 obj-$(CONFIG_USB_SERIAL_BELKIN)                        += belkin_sa.o
 obj-$(CONFIG_USB_SERIAL_CP2101)                        += cp2101.o
 obj-$(CONFIG_USB_SERIAL_CYBERJACK)             += cyberjack.o
@@ -31,7 +32,6 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA)          += keyspan_pda.o
 obj-$(CONFIG_USB_SERIAL_KLSI)                  += kl5kusb105.o
 obj-$(CONFIG_USB_SERIAL_KOBIL_SCT)             += kobil_sct.o
 obj-$(CONFIG_USB_SERIAL_MCT_U232)              += mct_u232.o
-obj-$(CONFIG_USB_SERIAL_NOKIA_DKU2)            += nokia_dku2.o
 obj-$(CONFIG_USB_SERIAL_OMNINET)               += omninet.o
 obj-$(CONFIG_USB_SERIAL_OPTION)                        += option.o
 obj-$(CONFIG_USB_SERIAL_PL2303)                        += pl2303.o
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c
new file mode 100644 (file)
index 0000000..18022a7
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * AnyData CDMA Serial USB driver
+ *
+ * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License version
+ *     2 as published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "usb-serial.h"
+
+static struct usb_device_id id_table [] = {
+       { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
+       { },
+};
+MODULE_DEVICE_TABLE(usb, id_table);
+
+/* if overridden by the user, then use their value for the size of the
+ * read and write urbs */
+static int buffer_size;
+static int debug;
+
+static struct usb_driver anydata_driver = {
+       .owner =        THIS_MODULE,
+       .name =         "anydata",
+       .probe =        usb_serial_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     id_table,
+};
+
+static int anydata_open(struct usb_serial_port *port, struct file *filp)
+{
+       char *buffer;
+       int result = 0;
+
+       dbg("%s - port %d", __FUNCTION__, port->number);
+
+       if (buffer_size) {
+               /* override the default buffer sizes */
+               buffer = kmalloc(buffer_size, GFP_KERNEL);
+               if (!buffer) {
+                       dev_err(&port->dev, "%s - out of memory.\n",
+                               __FUNCTION__);
+                       return -ENOMEM;
+               }
+               kfree (port->read_urb->transfer_buffer);
+               port->read_urb->transfer_buffer = buffer;
+               port->read_urb->transfer_buffer_length = buffer_size;
+
+               buffer = kmalloc(buffer_size, GFP_KERNEL);
+               if (!buffer) {
+                       dev_err(&port->dev, "%s - out of memory.\n",
+                               __FUNCTION__);
+                       return -ENOMEM;
+               }
+               kfree (port->write_urb->transfer_buffer);
+               port->write_urb->transfer_buffer = buffer;
+               port->write_urb->transfer_buffer_length = buffer_size;
+               port->bulk_out_size = buffer_size;
+       }
+
+       /* Start reading from the device */
+       usb_fill_bulk_urb(port->read_urb, port->serial->dev,
+                         usb_rcvbulkpipe(port->serial->dev,
+                                         port->bulk_in_endpointAddress),
+                         port->read_urb->transfer_buffer,
+                         port->read_urb->transfer_buffer_length,
+                         usb_serial_generic_write_bulk_callback, port);
+       result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+       if (result)
+               dev_err(&port->dev,
+                       "%s - failed submitting read urb, error %d\n",
+                       __FUNCTION__, result);
+
+       return result;
+}
+
+static struct usb_serial_driver anydata_device = {
+       .driver = {
+               .owner =        THIS_MODULE,
+               .name =         "anydata",
+       },
+       .id_table =             id_table,
+       .num_interrupt_in =     NUM_DONT_CARE,
+       .num_bulk_in =          NUM_DONT_CARE,
+       .num_bulk_out =         NUM_DONT_CARE,
+       .num_ports =            1,
+       .open =                 anydata_open,
+};
+
+static int __init anydata_init(void)
+{
+       int retval;
+
+       retval = usb_serial_register(&anydata_device);
+       if (retval)
+               return retval;
+       retval = usb_register(&anydata_driver);
+       if (retval)
+               usb_serial_deregister(&anydata_device);
+       return retval;
+}
+
+static void __exit anydata_exit(void)
+{
+       usb_deregister(&anydata_driver);
+       usb_serial_deregister(&anydata_device);
+}
+
+module_init(anydata_init);
+module_exit(anydata_exit);
+MODULE_LICENSE("GPL");
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Debug enabled or not");
+module_param(buffer_size, int, 0);
+MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
index c5334dd89b12baa3ba4f1f02f18e8d002b45452e..c9787001cf2a1e97ced97d799fe902d83256b469 100644 (file)
@@ -60,6 +60,7 @@ static struct usb_device_id id_table [] = {
        { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
        { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
        { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
+       { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
        { } /* Terminating Entry */
 };
 
index 8909208f506ad6384bcbec10f8b4eb1ca42d6713..53a47c31cd0ea32f6e2985e85fcb0304d0a49820 100644 (file)
@@ -309,6 +309,7 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *re
 
        schedule_work(&port->work);
 }
+EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
 
 void usb_serial_generic_shutdown (struct usb_serial *serial)
 {
diff --git a/drivers/usb/serial/nokia_dku2.c b/drivers/usb/serial/nokia_dku2.c
deleted file mode 100644 (file)
index fad01be..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Nokia DKU2 USB driver
- *
- *  Copyright (C) 2004
- *  Author: C Kemp
- *
- *  This program is largely derived from work by the linux-usb group
- *  and associated source files.  Please see the usb/serial files for
- *  individual credits and copyrights.
- *
- *  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.
- *
- *  20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
- *  Added short name to device structure to make driver load into kernel 2.6.13
- *
- *  20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
- *  Added usb_deregister to exit code - to allow remove and reinsert of module
- */
-
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/tty.h>
-#include <linux/tty_driver.h>
-#include <linux/tty_flip.h>
-#include <linux/module.h>
-#include <linux/usb.h>
-#include "usb-serial.h"
-
-
-#define NOKIA_VENDOR_ID                0x0421
-#define NOKIA7600_PRODUCT_ID   0x0400
-#define NOKIA6230_PRODUCT_ID   0x040f
-#define NOKIA6170_PRODUCT_ID   0x0416
-#define NOKIA6670_PRODUCT_ID   0x041d
-#define NOKIA6680_PRODUCT_ID   0x041e
-#define NOKIA6230i_PRODUCT_ID  0x0428
-
-#define NOKIA_AT_PORT  0x82
-#define NOKIA_FBUS_PORT        0x86
-
-/*
- * Version Information
- */
-#define DRIVER_VERSION "v0.2"
-#define DRIVER_AUTHOR  "C Kemp"
-#define DRIVER_DESC    "Nokia DKU2 Driver"
-
-static struct usb_device_id id_table [] = {
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA7600_PRODUCT_ID) },
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230_PRODUCT_ID) },
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6170_PRODUCT_ID) },
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6670_PRODUCT_ID) },
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6680_PRODUCT_ID) },
-       { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230i_PRODUCT_ID) },
-       { }                     /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, id_table);
-
-/* The only thing which makes this device different from a generic
- * device is that we have to set an alternative configuration to make
- * the relevant endpoints available. In 2.6 this is really easy... */
-static int nokia_probe(struct usb_serial *serial,
-                      const struct usb_device_id *id)
-{
-       int retval = -ENODEV;
-
-       if (serial->interface->altsetting[0].endpoint[0].desc.bEndpointAddress == NOKIA_AT_PORT) {
-               /* the AT port */
-               dev_info(&serial->dev->dev, "Nokia AT Port:\n");
-               retval = 0;
-       } else if (serial->interface->num_altsetting == 2 &&
-                  serial->interface->altsetting[1].endpoint[0].desc.bEndpointAddress == NOKIA_FBUS_PORT) {
-               /* the FBUS port */
-               dev_info(&serial->dev->dev, "Nokia FBUS Port:\n");
-               usb_set_interface(serial->dev, 10, 1);
-               retval = 0;
-       }
-
-       return retval;
-}
-
-static struct usb_driver nokia_driver = {
-       .owner =        THIS_MODULE,
-       .name =         "nokia_dku2",
-       .probe =        usb_serial_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     id_table,
-};
-
-static struct usb_serial_driver nokia_serial_driver = {
-       .driver = {
-               .owner =        THIS_MODULE,
-               .name =         "nokia_dku2",
-       },
-       .description =          "Nokia 7600/6230(i)/6170/66x0 DKU2 driver",
-       .id_table =             id_table,
-       .num_interrupt_in =     1,
-       .num_bulk_in =          1,
-       .num_bulk_out =         1,
-       .num_ports =            1,
-       .probe =                nokia_probe,
-};
-
-static int __init nokia_init(void)
-{
-        int retval;
-
-       retval = usb_serial_register(&nokia_serial_driver);
-       if (retval)
-               return retval;
-
-       retval = usb_register(&nokia_driver);
-       if (retval) {
-               usb_serial_deregister(&nokia_serial_driver);
-               return retval;
-       }
-
-       info(DRIVER_VERSION " " DRIVER_AUTHOR);
-       info(DRIVER_DESC);
-
-       return retval;
-}
-
-static void __exit nokia_exit(void)
-{
-       usb_deregister(&nokia_driver);
-       usb_serial_deregister(&nokia_serial_driver);
-}
-
-module_init(nokia_init);
-module_exit(nokia_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL");
index 165c119bf10e302e3c5b6b0f758bd3ff31c4bba4..41a45a5025b21275c818819ef77895468eba91fd 100644 (file)
@@ -71,7 +71,9 @@ static struct usb_device_id id_table [] = {
        { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
        { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
+       { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
        { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
+       { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
        { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
        { USB_DEVICE( NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID ) },
        { }                                     /* Terminating entry */
@@ -811,7 +813,9 @@ static void pl2303_update_line_status(struct usb_serial_port *port,
        u8 length = UART_STATE;
 
        if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
-           (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65)) {
+           (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65 ||
+            le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_SX1 ||
+            le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X75)) {
                length = 1;
                status_idx = 0;
        }
index 7be9644f5a03e763c4f56e2308c341d9a78eaff2..21d434d81813dde3c207d778ecb7067944092e43 100644 (file)
@@ -54,7 +54,9 @@
 #define SAMSUNG_PRODUCT_ID     0x8001
 
 #define SIEMENS_VENDOR_ID      0x11f5
+#define SIEMENS_PRODUCT_ID_SX1 0x0001
 #define SIEMENS_PRODUCT_ID_X65 0x0003
+#define SIEMENS_PRODUCT_ID_X75 0x0004
 
 #define SYNTECH_VENDOR_ID      0x0745
 #define SYNTECH_PRODUCT_ID     0x0001
index 1a9679f76f5a341be6027551884f44d9c4e6fce0..c41d64dbb0f0ec39d50901ffe771715b31a62a48 100644 (file)
@@ -115,7 +115,7 @@ config USB_STORAGE_JUMPSHOT
 
 config USB_STORAGE_ONETOUCH
        bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)"
-       depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL
+       depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL && !PM
        help
          Say Y here to include additional code to support the Maxtor OneTouch
          USB hard drive's onetouch button.
index 33c55a6261bba4a9a5cc14656d265a078f9523a6..fea176d7e79a3bcb5540df2cc7012944c3f191cc 100644 (file)
@@ -853,7 +853,7 @@ static int usbat_identify_device(struct us_data *us,
        rc = usbat_device_reset(us);
        if (rc != USB_STOR_TRANSPORT_GOOD)
                return rc;
-       msleep(25);
+       msleep(500);
 
        /*
         * In attempt to distinguish between HP CDRW's and Flash readers, we now
index 9e926a8f2116e34ef0874b136bbecdd442747be8..0a9858f69a9b86ac8363105069d3f46d64f7bc36 100644 (file)
@@ -710,11 +710,6 @@ UNUSUAL_DEV(  0x0686, 0x4017, 0x0001, 0x0001,
                 "DIMAGE E223",
                 US_SC_SCSI, US_PR_DEVICE, NULL, 0 ),
 
-UNUSUAL_DEV(  0x0693, 0x0002, 0x0100, 0x0100, 
-               "Hagiwara",
-               "FlashGate SmartMedia",
-               US_SC_SCSI, US_PR_BULK, NULL, 0 ),
-
 UNUSUAL_DEV(  0x0693, 0x0005, 0x0100, 0x0100,
                "Hagiwara",
                "Flashgate",
@@ -1008,6 +1003,11 @@ UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff,
  *
  */
 #ifdef CONFIG_USB_STORAGE_ONETOUCH
+       UNUSUAL_DEV(  0x0d49, 0x7000, 0x0000, 0x9999,
+                       "Maxtor",
+                       "OneTouch External Harddrive",
+                       US_SC_DEVICE, US_PR_DEVICE, onetouch_connect_input,
+                       0),
        UNUSUAL_DEV(  0x0d49, 0x7010, 0x0000, 0x9999,
                        "Maxtor",
                        "OneTouch External Harddrive",
index 193b482570c7e9cc1ee41303ad67d5871b37db90..750cebb183063d6eee8b81c36daca65be32e2228 100644 (file)
@@ -1279,7 +1279,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static int __init acornfb_probe(struct device *dev)
+static int __init acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
@@ -1292,7 +1292,7 @@ static int __init acornfb_probe(struct device *dev)
 
        acornfb_init_fbinfo();
 
-       current_par.dev = dev;
+       current_par.dev = &dev->dev;
 
        if (current_par.montype == -1)
                current_par.montype = acornfb_detect_monitortype();
@@ -1453,15 +1453,16 @@ static int __init acornfb_probe(struct device *dev)
        return 0;
 }
 
-static struct device_driver acornfb_driver = {
-       .name   = "acornfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver acornfb_driver = {
        .probe  = acornfb_probe,
+       .driver = {
+               .name   = "acornfb",
+       },
 };
 
 static int __init acornfb_init(void)
 {
-       return driver_register(&acornfb_driver);
+       return platform_driver_register(&acornfb_driver);
 }
 
 module_init(acornfb_init);
index a1fc8bbb1090bfe41bfd6bc8b64e4824bc6fe748..080db812ca487a1a4febf2c0781e58524485e213 100644 (file)
@@ -514,9 +514,8 @@ static struct fb_ops arcfb_ops = {
        .fb_ioctl       = arcfb_ioctl,
 };
 
-static int __init arcfb_probe(struct device *device)
+static int __init arcfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int retval = -ENOMEM;
        int videomemorysize;
@@ -559,7 +558,7 @@ static int __init arcfb_probe(struct device *device)
        retval = register_framebuffer(info);
        if (retval < 0)
                goto err1;
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
        if (irq) {
                par->irq = irq;
                if (request_irq(par->irq, &arcfb_interrupt, SA_SHIRQ,
@@ -600,9 +599,9 @@ err:
        return retval;
 }
 
-static int arcfb_remove(struct device *device)
+static int arcfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                unregister_framebuffer(info);
@@ -612,11 +611,12 @@ static int arcfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver arcfb_driver = {
-       .name   = "arcfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver arcfb_driver = {
        .probe  = arcfb_probe,
        .remove = arcfb_remove,
+       .driver = {
+               .name   = "arcfb",
+       },
 };
 
 static struct platform_device *arcfb_device;
@@ -628,7 +628,7 @@ static int __init arcfb_init(void)
        if (!arcfb_enable)
                return -ENXIO;
 
-       ret = driver_register(&arcfb_driver);
+       ret = platform_driver_register(&arcfb_driver);
        if (!ret) {
                arcfb_device = platform_device_alloc("arcfb", 0);
                if (arcfb_device) {
@@ -638,7 +638,7 @@ static int __init arcfb_init(void)
                }
                if (ret) {
                        platform_device_put(arcfb_device);
-                       driver_unregister(&arcfb_driver);
+                       platform_driver_unregister(&arcfb_driver);
                }
        }
        return ret;
@@ -648,7 +648,7 @@ static int __init arcfb_init(void)
 static void __exit arcfb_exit(void)
 {
        platform_device_unregister(arcfb_device);
-       driver_unregister(&arcfb_driver);
+       platform_driver_unregister(&arcfb_driver);
 }
 
 module_param(num_cols, ulong, 0);
index bd9a6996aee72286c46ea369db7d57eea2f0da03..6a219b2c77e3d10a18200c5e0c2bca0791a5235a 100644 (file)
@@ -79,13 +79,13 @@ static void corgibl_blank(int blank)
 }
 
 #ifdef CONFIG_PM
-static int corgibl_suspend(struct device *dev, pm_message_t state)
+static int corgibl_suspend(struct platform_device *dev, pm_message_t state)
 {
        corgibl_blank(FB_BLANK_POWERDOWN);
        return 0;
 }
 
-static int corgibl_resume(struct device *dev)
+static int corgibl_resume(struct platform_device *dev)
 {
        corgibl_blank(FB_BLANK_UNBLANK);
        return 0;
@@ -143,9 +143,9 @@ static struct backlight_properties corgibl_data = {
 
 static struct backlight_device *corgi_backlight_device;
 
-static int __init corgibl_probe(struct device *dev)
+static int __init corgibl_probe(struct platform_device *pdev)
 {
-       struct corgibl_machinfo *machinfo = dev->platform_data;
+       struct corgibl_machinfo *machinfo = pdev->dev.platform_data;
 
        corgibl_data.max_brightness = machinfo->max_intensity;
        corgibl_mach_set_intensity = machinfo->set_bl_intensity;
@@ -162,7 +162,7 @@ static int __init corgibl_probe(struct device *dev)
        return 0;
 }
 
-static int corgibl_remove(struct device *dev)
+static int corgibl_remove(struct platform_device *dev)
 {
        backlight_device_unregister(corgi_backlight_device);
 
@@ -172,23 +172,24 @@ static int corgibl_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver corgibl_driver = {
-       .name           = "corgi-bl",
-       .bus            = &platform_bus_type,
+static struct platform_driver corgibl_driver = {
        .probe          = corgibl_probe,
        .remove         = corgibl_remove,
        .suspend        = corgibl_suspend,
        .resume         = corgibl_resume,
+       .driver         = {
+               .name   = "corgi-bl",
+       },
 };
 
 static int __init corgibl_init(void)
 {
-       return driver_register(&corgibl_driver);
+       return platform_driver_register(&corgibl_driver);
 }
 
 static void __exit corgibl_exit(void)
 {
-       driver_unregister(&corgibl_driver);
+       platform_driver_unregister(&corgibl_driver);
 }
 
 module_init(corgibl_init);
index f53bf3ba127898c01a480b69be8b211bf02ab561..d3728f60961e75230a466aa94172bdb52a64cd42 100644 (file)
@@ -51,6 +51,9 @@ static struct fb_ops bw2_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = bw2_mmap,
        .fb_ioctl               = bw2_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* OBio addresses for the bwtwo registers */
index 030d4b13b1c206a5e0ff8ec61012b00d145d8923..1bed50f2a2767dbb1a7901b0dcd23faa81524060 100644 (file)
@@ -49,6 +49,9 @@ static struct fb_ops cg14_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = cg14_mmap,
        .fb_ioctl               = cg14_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 #define CG14_MCR_INTENABLE_SHIFT       7
index b94eee8c42d5dbacba3f2ef509d58e60726cfa2a..a1354e7e0513e970b5ddf4bb10a3f305f900de70 100644 (file)
@@ -50,6 +50,9 @@ static struct fb_ops cg3_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = cg3_mmap,
        .fb_ioctl               = cg3_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 
index 414c4409e92468e0d43c68b3f5d971f84830e3cb..9debe642fd2f8825a0b394112d30ee8bc12c46c1 100644 (file)
@@ -54,6 +54,9 @@ static struct fb_ops cg6_ops = {
        .fb_sync                = cg6_sync,
        .fb_mmap                = cg6_mmap,
        .fb_ioctl               = cg6_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* Offset of interesting structures in the OBIO space */
index 94c5f1392ccedb29ecb0dd1d37b31372976e121f..5f74df993406073c883453364855da7281ca8ff8 100644 (file)
@@ -215,12 +215,5 @@ config FONT_10x18
          big letters. It fits between the sun 12x22 and the normal 8x16 font.
          If other fonts are too big or too small for you, say Y, otherwise say N.
 
-config FONT_RL
-       bool "console Roman Large 8x16 font" if FONTS
-       depends on FRAMEBUFFER_CONSOLE
-       help
-         This is the visually-appealing "RL" console font that is
-         included with the kbd package.
-
 endmenu
 
index fed600c9ca5578fb9142f23d5849c7325c7f8450..9b26dda18a38c1e13fde4b3b92610a36d840d7ef 100644 (file)
@@ -15,7 +15,6 @@ font-objs-$(CONFIG_FONT_10x18)     += font_10x18.o
 font-objs-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o
 font-objs-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o
 font-objs-$(CONFIG_FONT_MINI_4x6)  += font_mini_4x6.o
-font-objs-$(CONFIG_FONT_RL)  += font_rl.o
 
 font-objs += $(font-objs-y)
 
index e7802ffe549ae402144f82aaf052e0ada28de9be..bcea87c3cc068a5a696d51492c63b3d473659ff3 100644 (file)
@@ -106,8 +106,7 @@ enum {
        FBCON_LOGO_DONTSHOW     = -3    /* do not show the logo */
 };
 
-struct display fb_display[MAX_NR_CONSOLES];
-EXPORT_SYMBOL(fb_display);
+static struct display fb_display[MAX_NR_CONSOLES];
 
 static signed char con2fb_map[MAX_NR_CONSOLES];
 static signed char con2fb_map_boot[MAX_NR_CONSOLES];
@@ -653,13 +652,12 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info,
 {
        struct fbcon_ops *ops = info->fbcon_par;
 
+       ops->p = (p) ? p : &fb_display[vc->vc_num];
+
        if ((info->flags & FBINFO_MISC_TILEBLITTING))
                fbcon_set_tileops(vc, info, p, ops);
        else {
-               struct display *disp;
-
-               disp = (p) ? p : &fb_display[vc->vc_num];
-               fbcon_set_rotation(info, disp);
+               fbcon_set_rotation(info, ops->p);
                fbcon_set_bitops(ops);
        }
 }
@@ -668,11 +666,10 @@ static void set_blitting_type(struct vc_data *vc, struct fb_info *info,
                              struct display *p)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *disp;
 
        info->flags &= ~FBINFO_MISC_TILEBLITTING;
-       disp = (p) ? p : &fb_display[vc->vc_num];
-       fbcon_set_rotation(info, disp);
+       ops->p = (p) ? p : &fb_display[vc->vc_num];
+       fbcon_set_rotation(info, ops->p);
        fbcon_set_bitops(ops);
 }
 #endif /* CONFIG_MISC_TILEBLITTING */
index accfd7bd8e9317927000ee4a791eaf1100da1d3a..6892e7ff34de87233268b528297cbfa4a8005bdc 100644 (file)
@@ -52,8 +52,6 @@ struct display {
     struct fb_videomode *mode;
 };
 
-extern struct display fb_display[];
-
 struct fbcon_ops {
        void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy,
                      int sx, int dy, int dx, int height, int width);
@@ -73,6 +71,7 @@ struct fbcon_ops {
        struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
        struct timer_list cursor_timer; /* Cursor timer */
        struct fb_cursor cursor_state;
+       struct display *p;
         int    currcon;                        /* Current VC. */
        int    cursor_flash;
        int    cursor_reset;
index 680aabab73c507eee4ea69a5a8276ce520b2a51a..3afd1eeb1adebc38b5432a36ecaca220a88eba88 100644 (file)
@@ -63,9 +63,9 @@ static inline void ccw_update_attr(u8 *dst, u8 *src, int attribute,
 static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        area.sx = sy * vc->vc_font.height;
        area.sy = vyres - ((sx + width) * vc->vc_font.width);
@@ -80,10 +80,10 @@ static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
 static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dx = sy * vc->vc_font.height;
@@ -131,7 +131,6 @@ static void ccw_putcs(struct vc_data *vc, struct fb_info *info,
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.height + 7)/8;
        u32 cellsize = width * vc->vc_font.width;
@@ -141,7 +140,7 @@ static void ccw_putcs(struct vc_data *vc, struct fb_info *info,
        u32 cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
@@ -397,9 +396,8 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info,
 int ccw_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
        u32 yoffset;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
        int err;
 
        yoffset = (vyres - info->var.yres) - ops->var.xoffset;
index 6c6f3b6dd17563b371b3fba56c64c886c5d1de47..6d92b845620629fbfe7b9353b449ac741fa7b420 100644 (file)
@@ -49,9 +49,9 @@ static inline void cw_update_attr(u8 *dst, u8 *src, int attribute,
 static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        area.sx = vxres - ((sy + height) * vc->vc_font.height);
        area.sy = sx * vc->vc_font.width;
@@ -66,10 +66,10 @@ static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
 static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dx = vxres - ((sy + height) * vc->vc_font.height);
@@ -117,7 +117,6 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.height + 7)/8;
        u32 cellsize = width * vc->vc_font.width;
@@ -127,7 +126,7 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
        u32 cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
@@ -381,8 +380,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info,
 int cw_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
        u32 xoffset;
        int err;
 
index 2e1d9d4249cd0c457e5e0d1c2801f34012560d48..c4d7c89212b4bfaa116750c9111124d09bd65714 100644 (file)
@@ -48,10 +48,10 @@ static inline void ud_update_attr(u8 *dst, u8 *src, int attribute,
 static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        area.sy = vyres - ((sy + height) * vc->vc_font.height);
        area.sx = vxres - ((sx + width) * vc->vc_font.width);
@@ -66,11 +66,11 @@ static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy,
 static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dy = vyres - ((sy + height) * vc->vc_font.height);
@@ -153,7 +153,6 @@ static void ud_putcs(struct vc_data *vc, struct fb_info *info,
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.width + 7)/8;
        u32 cellsize = width * vc->vc_font.height;
@@ -163,8 +162,8 @@ static void ud_putcs(struct vc_data *vc, struct fb_info *info,
        u32 mod = vc->vc_font.width % 8, cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
@@ -421,10 +420,9 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info,
 int ud_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
        u32 xoffset, yoffset;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
        int err;
 
        xoffset = (vxres - info->var.xres) - ops->var.xoffset;
diff --git a/drivers/video/console/font_rl.c b/drivers/video/console/font_rl.c
deleted file mode 100644 (file)
index dfecc27..0000000
+++ /dev/null
@@ -1,4374 +0,0 @@
-
-/* This font is simply the "rl.fnt" console font from the kbd utility.
- * Converted by Zack T Smith, fbui@comcast.net.
- * The original binary file is covered under the GNU Public License.
- */
-
-#include <linux/font.h>
-
-#define FONTDATAMAX 4096
-
-static unsigned char patterns[4096] = {
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x3c,
-0x42,
-0x81,
-0xe7,
-0xa5,
-0x99,
-0x81,
-0x81,
-0x99,
-0x42,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x3c,
-0x7e,
-0xff,
-0x99,
-0xdb,
-0xe7,
-0xff,
-0xff,
-0xe7,
-0x7e,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x6c,
-0xfe,
-0xfe,
-0xfe,
-0xfe,
-0xfe,
-0x7c,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x7c,
-0xfe,
-0x7c,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x38,
-0x38,
-0x10,
-0xd6,
-0xfe,
-0xd6,
-0x10,
-0x10,
-0x38,
-0x7c,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x38,
-0x7c,
-0xfe,
-0xfe,
-0x54,
-0x10,
-0x10,
-0x38,
-0x7c,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x3c,
-0x3c,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xe7,
-0xc3,
-0xc3,
-0xe7,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x42,
-0x42,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xc3,
-0x99,
-0xbd,
-0xbd,
-0x99,
-0xc3,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-
-0x00,
-0x00,
-0x0f,
-0x07,
-0x0d,
-0x18,
-0x78,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0x78,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x18,
-0x7e,
-0x18,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x08,
-0x0c,
-0x0a,
-0x0a,
-0x0a,
-0x08,
-0x08,
-0x08,
-0x38,
-0x78,
-0x30,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x10,
-0x18,
-0x1c,
-0x1e,
-0x1e,
-0x16,
-0x12,
-0x72,
-0xf2,
-0x62,
-0x0e,
-0x1e,
-0x0c,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x10,
-0x92,
-0x54,
-0x38,
-0xfe,
-0x38,
-0x54,
-0x92,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x80,
-0xc0,
-0xe0,
-0xb8,
-0x8e,
-0xb8,
-0xe0,
-0xc0,
-0x80,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x02,
-0x06,
-0x0e,
-0x3a,
-0xe2,
-0x3a,
-0x0e,
-0x06,
-0x02,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x38,
-0x7c,
-0xd6,
-0x10,
-0x10,
-0x10,
-0x10,
-0xd6,
-0x7c,
-0x38,
-0x10,
-0x00,
-0x00,
-
-0x00,
-0x42,
-0xe7,
-0xe7,
-0xe7,
-0xe7,
-0x42,
-0x42,
-0x42,
-0x00,
-0x66,
-0x66,
-0x66,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x7f,
-0xca,
-0xca,
-0xca,
-0xca,
-0x7a,
-0x0a,
-0x0a,
-0x0a,
-0x0a,
-0x0a,
-0x1b,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1e,
-0x31,
-0x78,
-0xcc,
-0xc6,
-0xc3,
-0x63,
-0x33,
-0x1e,
-0x8c,
-0x78,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0xfe,
-0xfe,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x38,
-0x7c,
-0xd6,
-0x10,
-0x10,
-0x10,
-0x10,
-0xd6,
-0x7c,
-0x38,
-0x10,
-0xfe,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x38,
-0x7c,
-0xd6,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0x10,
-0xd6,
-0x7c,
-0x38,
-0x10,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x08,
-0x0c,
-0x06,
-0xff,
-0x06,
-0x0c,
-0x08,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x30,
-0x60,
-0xff,
-0x60,
-0x30,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x22,
-0x44,
-0x88,
-0xcc,
-0xee,
-0x44,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x24,
-0x42,
-0xff,
-0x42,
-0x24,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x38,
-0x6c,
-0x6c,
-0xc6,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0xfe,
-0xc6,
-0x6c,
-0x6c,
-0x38,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x3c,
-0x3c,
-0x3c,
-0x3c,
-0x18,
-0x18,
-0x18,
-0x10,
-0x00,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x22,
-0x77,
-0x33,
-0x11,
-0x22,
-0x44,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x12,
-0x12,
-0x12,
-0x7f,
-0x24,
-0x24,
-0x24,
-0xfe,
-0x48,
-0x48,
-0x48,
-0x00,
-0x00,
-0x00,
-
-0x10,
-0x10,
-0x7c,
-0xd2,
-0xd0,
-0xd0,
-0xd0,
-0x7c,
-0x16,
-0x16,
-0x16,
-0x96,
-0x7c,
-0x10,
-0x10,
-0x00,
-
-0x00,
-0x42,
-0xbe,
-0x44,
-0x0c,
-0x08,
-0x18,
-0x10,
-0x30,
-0x20,
-0x64,
-0x4a,
-0xc4,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x38,
-0x6c,
-0x6c,
-0x6c,
-0x38,
-0x37,
-0x72,
-0xdc,
-0xcc,
-0xcc,
-0xcc,
-0x77,
-0x00,
-0x00,
-0x00,
-
-0x10,
-0x38,
-0x18,
-0x08,
-0x10,
-0x20,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x04,
-0x08,
-0x10,
-0x10,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x10,
-0x10,
-0x08,
-0x04,
-0x00,
-0x00,
-
-0x00,
-0x20,
-0x10,
-0x08,
-0x08,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x08,
-0x08,
-0x10,
-0x20,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x44,
-0x28,
-0x38,
-0xfe,
-0x38,
-0x28,
-0x44,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x18,
-0x7e,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x18,
-0x08,
-0x10,
-0x20,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x06,
-0x06,
-0x0c,
-0x0c,
-0x18,
-0x18,
-0x30,
-0x30,
-0x60,
-0x60,
-0xc0,
-0xc0,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x46,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc4,
-0x78,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x08,
-0x18,
-0x78,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x7e,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x7c,
-0x86,
-0x06,
-0x0c,
-0x18,
-0x20,
-0x40,
-0xc1,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x46,
-0x04,
-0x08,
-0x1c,
-0x06,
-0x06,
-0x06,
-0x06,
-0x0c,
-0x70,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x04,
-0x08,
-0x10,
-0x2c,
-0x4c,
-0x8c,
-0x8c,
-0xfe,
-0x0c,
-0x0c,
-0x0c,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x02,
-0x3c,
-0x20,
-0x20,
-0x70,
-0x0c,
-0x06,
-0x06,
-0x06,
-0x06,
-0x0c,
-0x70,
-0x00,
-
-0x00,
-0x00,
-0x18,
-0x20,
-0x40,
-0xc0,
-0xdc,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0x44,
-0x38,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x40,
-0x7e,
-0x82,
-0x06,
-0x04,
-0x0c,
-0x18,
-0x18,
-0x30,
-0x30,
-0x30,
-0x30,
-0x00,
-
-0x00,
-0x00,
-0x7c,
-0xc6,
-0xc6,
-0x64,
-0x38,
-0x4c,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0x7c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x38,
-0x44,
-0xc6,
-0xc6,
-0x76,
-0x06,
-0x06,
-0x06,
-0x04,
-0x08,
-0x30,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x18,
-0x08,
-0x10,
-0x20,
-
-0x00,
-0x06,
-0x0c,
-0x18,
-0x30,
-0x60,
-0xa0,
-0xa0,
-0x60,
-0x30,
-0x18,
-0x0c,
-0x06,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x60,
-0x30,
-0x18,
-0x0c,
-0x06,
-0x05,
-0x05,
-0x06,
-0x0c,
-0x18,
-0x30,
-0x60,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x7c,
-0x86,
-0xc6,
-0x06,
-0x04,
-0x08,
-0x10,
-0x10,
-0x18,
-0x00,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x3c,
-0x46,
-0xc6,
-0xce,
-0xd6,
-0xd6,
-0xd6,
-0xdc,
-0xc0,
-0xc4,
-0x78,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x2c,
-0x2c,
-0x2c,
-0x7e,
-0x46,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xfc,
-0x66,
-0x66,
-0x66,
-0x66,
-0x7c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xfc,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3a,
-0x66,
-0xc2,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xfc,
-0x66,
-0x63,
-0x63,
-0x63,
-0x63,
-0x63,
-0x63,
-0x63,
-0x63,
-0x66,
-0xfc,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xff,
-0x61,
-0x60,
-0x60,
-0x64,
-0x7c,
-0x64,
-0x60,
-0x60,
-0x60,
-0x61,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xff,
-0x61,
-0x61,
-0x60,
-0x64,
-0x7c,
-0x64,
-0x60,
-0x60,
-0x60,
-0x60,
-0xf0,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3a,
-0x66,
-0xc2,
-0xc0,
-0xc0,
-0xc0,
-0xcf,
-0xc6,
-0xc6,
-0xc6,
-0x66,
-0x38,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x62,
-0x7e,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1e,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x08,
-0xf0,
-
-0x00,
-0xf7,
-0x64,
-0x6c,
-0x68,
-0x68,
-0x78,
-0x6c,
-0x6c,
-0x6c,
-0x66,
-0x66,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf8,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x61,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xc3,
-0x66,
-0x76,
-0x7e,
-0x56,
-0x56,
-0x46,
-0x46,
-0x46,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xe7,
-0x62,
-0x62,
-0x72,
-0x52,
-0x5a,
-0x4a,
-0x4e,
-0x46,
-0x46,
-0x42,
-0xe2,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x66,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xfc,
-0x66,
-0x66,
-0x66,
-0x66,
-0x6c,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0xf0,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x66,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0x66,
-0x3c,
-0x10,
-0x39,
-0x0e,
-
-0x00,
-0xfc,
-0x66,
-0x66,
-0x66,
-0x66,
-0x7c,
-0x6c,
-0x66,
-0x66,
-0x66,
-0x66,
-0xf3,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x7a,
-0xc6,
-0xc2,
-0xc0,
-0x70,
-0x3c,
-0x0e,
-0x06,
-0x06,
-0x86,
-0xc6,
-0xbc,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xff,
-0x99,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x76,
-0x34,
-0x34,
-0x34,
-0x3c,
-0x18,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x62,
-0x6a,
-0x6a,
-0x6a,
-0x6a,
-0x7e,
-0x7e,
-0x34,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x34,
-0x34,
-0x18,
-0x18,
-0x2c,
-0x2c,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x34,
-0x34,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x7f,
-0x46,
-0x86,
-0x0c,
-0x0c,
-0x18,
-0x18,
-0x30,
-0x30,
-0x61,
-0x62,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xc0,
-0xc0,
-0x60,
-0x60,
-0x30,
-0x30,
-0x18,
-0x18,
-0x0c,
-0x0c,
-0x06,
-0x06,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x10,
-0x38,
-0x4c,
-0x86,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x20,
-0x30,
-0x38,
-0x10,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x20,
-0xe0,
-0x60,
-0x60,
-0x6c,
-0x76,
-0x66,
-0x66,
-0x66,
-0x66,
-0x76,
-0x6c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x60,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x04,
-0x1c,
-0x0c,
-0x0c,
-0x6c,
-0xdc,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0xdc,
-0x66,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x7e,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1e,
-0x31,
-0x33,
-0x30,
-0x30,
-0x78,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x78,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7b,
-0xce,
-0xcc,
-0xcc,
-0xcc,
-0x78,
-0x60,
-0x7c,
-0x86,
-0xc6,
-0x7c,
-
-0x00,
-0x20,
-0xe0,
-0x60,
-0x60,
-0x6c,
-0x76,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x10,
-0x38,
-0x10,
-0x00,
-0x18,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x08,
-0x1c,
-0x08,
-0x00,
-0x0c,
-0x1c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x0c,
-0x6c,
-0x4c,
-0x38,
-0x00,
-
-0x00,
-0x20,
-0xe0,
-0x60,
-0x60,
-0x67,
-0x66,
-0x6c,
-0x78,
-0x6c,
-0x6c,
-0x66,
-0xe7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x08,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x6a,
-0xfe,
-0x6a,
-0x6a,
-0x6a,
-0x62,
-0x62,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x5c,
-0xf6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x5c,
-0xe6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x7c,
-0x60,
-0x60,
-0xf0,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x76,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0x7c,
-0x0c,
-0x0c,
-0x1e,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x5e,
-0xf6,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0xf0,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7a,
-0xc6,
-0x72,
-0x1c,
-0x06,
-0x86,
-0xc6,
-0xbc,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x10,
-0x30,
-0x7c,
-0x30,
-0x30,
-0x30,
-0x30,
-0x30,
-0x34,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xee,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x3a,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf7,
-0x62,
-0x76,
-0x34,
-0x34,
-0x3c,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf7,
-0x62,
-0x6a,
-0x6a,
-0x6a,
-0x6a,
-0x7e,
-0x24,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf7,
-0x62,
-0x34,
-0x18,
-0x2c,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf7,
-0x62,
-0x62,
-0x34,
-0x34,
-0x18,
-0x18,
-0x18,
-0x10,
-0xb0,
-0xe0,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0x8c,
-0x18,
-0x30,
-0x30,
-0x60,
-0xc2,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x0e,
-0x18,
-0x10,
-0x10,
-0x08,
-0x70,
-0x70,
-0x08,
-0x10,
-0x10,
-0x18,
-0x0e,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x00,
-0x00,
-
-0x00,
-0x70,
-0x18,
-0x08,
-0x08,
-0x10,
-0x0e,
-0x0e,
-0x10,
-0x08,
-0x08,
-0x18,
-0x70,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x76,
-0xdc,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x38,
-0x6c,
-0xc6,
-0xc6,
-0xc6,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x3a,
-0x66,
-0xc2,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0x62,
-0x3c,
-0x18,
-0x0c,
-0x24,
-0x18,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0xee,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3b,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x0c,
-0x18,
-0x20,
-0x00,
-0x3c,
-0x66,
-0x7e,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x58,
-0x8c,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x18,
-0x04,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x38,
-0x44,
-0x44,
-0x38,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x60,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x08,
-0x24,
-0x18,
-
-0x00,
-0x18,
-0x2c,
-0x46,
-0x00,
-0x3c,
-0x66,
-0x7e,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x7e,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x18,
-0x04,
-0x00,
-0x3c,
-0x66,
-0x7e,
-0x60,
-0x60,
-0x60,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x2c,
-0x46,
-0x00,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x60,
-0x30,
-0x08,
-0x00,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x66,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x2c,
-0x2c,
-0x2c,
-0x7e,
-0x46,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x24,
-0x18,
-0x18,
-0x3c,
-0x2c,
-0x2c,
-0x2c,
-0x7e,
-0x46,
-0x46,
-0x46,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x0c,
-0x18,
-0xff,
-0x61,
-0x60,
-0x60,
-0x64,
-0x7c,
-0x64,
-0x60,
-0x60,
-0x61,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x76,
-0x9b,
-0x1b,
-0x3f,
-0xd8,
-0xd8,
-0xd9,
-0x6e,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1f,
-0x1d,
-0x1d,
-0x3c,
-0x2c,
-0x2e,
-0x2c,
-0x7c,
-0x4c,
-0x4c,
-0x4d,
-0xef,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x2c,
-0x46,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x18,
-0x04,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x2c,
-0x46,
-0x00,
-0xee,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x3a,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x18,
-0x04,
-0x00,
-0xee,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x3a,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x66,
-0x00,
-0x00,
-0xf7,
-0x62,
-0x62,
-0x34,
-0x34,
-0x18,
-0x18,
-0x18,
-0x10,
-0xb0,
-0xe0,
-
-0x66,
-0x00,
-0x3c,
-0x66,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x66,
-0x00,
-0xf7,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x62,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x10,
-0x10,
-0x10,
-0x7c,
-0xc6,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0xc2,
-0x7c,
-0x10,
-0x10,
-0x00,
-
-0x00,
-0x38,
-0x64,
-0x6c,
-0x60,
-0x60,
-0xf0,
-0x60,
-0x60,
-0x60,
-0x60,
-0x66,
-0xfc,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x81,
-0xc3,
-0x66,
-0x3c,
-0x18,
-0xff,
-0x18,
-0x18,
-0xff,
-0x18,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xfe,
-0x63,
-0x63,
-0x63,
-0x63,
-0x6e,
-0x60,
-0x64,
-0x6e,
-0x64,
-0x64,
-0xf5,
-0x06,
-0x00,
-0x00,
-
-0x00,
-0x0e,
-0x19,
-0x1b,
-0x18,
-0x18,
-0x3c,
-0x18,
-0x18,
-0x18,
-0x18,
-0xd8,
-0x98,
-0x70,
-0x00,
-0x00,
-
-0x00,
-0x0c,
-0x18,
-0x20,
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x06,
-0x0c,
-0x10,
-0x00,
-0x38,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x0c,
-0x18,
-0x20,
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x0c,
-0x18,
-0x20,
-0x00,
-0xee,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x3a,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x32,
-0x4c,
-0x00,
-0x5c,
-0xf6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xf7,
-0x00,
-0x00,
-0x00,
-
-0x32,
-0x4c,
-0x00,
-0xe7,
-0x72,
-0x52,
-0x5a,
-0x4a,
-0x4e,
-0x46,
-0x46,
-0x42,
-0xe2,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x78,
-0x8c,
-0x0c,
-0x3c,
-0xcc,
-0xcc,
-0xcd,
-0x76,
-0x00,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x30,
-0x30,
-0x00,
-0x30,
-0x10,
-0x10,
-0x20,
-0x40,
-0xc0,
-0xc6,
-0xc2,
-0x7c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0xc0,
-0xc0,
-0xc0,
-0xc0,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0x06,
-0x06,
-0x06,
-0x06,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x20,
-0xe0,
-0x63,
-0x66,
-0xfc,
-0x18,
-0x30,
-0x60,
-0xce,
-0x93,
-0x06,
-0x0c,
-0x1f,
-0x00,
-0x00,
-
-0x00,
-0x20,
-0xe0,
-0x63,
-0x66,
-0xfc,
-0x18,
-0x30,
-0x64,
-0xc8,
-0x96,
-0x3f,
-0x06,
-0x06,
-0x00,
-0x00,
-
-0x00,
-0x18,
-0x18,
-0x00,
-0x08,
-0x18,
-0x18,
-0x18,
-0x3c,
-0x3c,
-0x3c,
-0x3c,
-0x18,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x36,
-0x6c,
-0xd8,
-0xd8,
-0x6c,
-0x36,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xd8,
-0x6c,
-0x36,
-0x36,
-0x6c,
-0xd8,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-0x82,
-0x10,
-
-0x00,
-0x95,
-0x00,
-0xa9,
-0x00,
-0x95,
-0x00,
-0xa9,
-0x00,
-0x95,
-0x00,
-0xa9,
-0x00,
-0x95,
-0x00,
-0xa9,
-
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-0x92,
-0x49,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xf8,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xf8,
-0x18,
-0x18,
-0xf8,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xe6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf8,
-0x18,
-0x18,
-0xf8,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xe6,
-0x06,
-0x06,
-0xe6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xfe,
-0x06,
-0x06,
-0xe6,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xe6,
-0x06,
-0x06,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xf8,
-0x18,
-0x18,
-0xf8,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xf8,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x1f,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x1f,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xff,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x1f,
-0x18,
-0x18,
-0x1f,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x60,
-0x60,
-0x7f,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7f,
-0x60,
-0x60,
-0x67,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xe7,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0xe7,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x67,
-0x60,
-0x60,
-0x67,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xe7,
-0x00,
-0x00,
-0xe7,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xff,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x00,
-0x00,
-0xff,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x7f,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x1f,
-0x18,
-0x18,
-0x1f,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x1f,
-0x18,
-0x18,
-0x1f,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7f,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0xff,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xff,
-0x00,
-0x00,
-0xff,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xf8,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x1f,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-0xf0,
-
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-0x0f,
-
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0xff,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x77,
-0xcc,
-0xcc,
-0xcc,
-0xcc,
-0xde,
-0x73,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x7c,
-0xc6,
-0xc6,
-0xc6,
-0xc4,
-0xc8,
-0xc4,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xdc,
-0xc0,
-0xc0,
-0x00,
-
-0x00,
-0xff,
-0x61,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0x60,
-0xf0,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x7e,
-0xa4,
-0x24,
-0x2c,
-0x6c,
-0x6c,
-0x6c,
-0x48,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xff,
-0xc1,
-0x60,
-0x30,
-0x18,
-0x0c,
-0x18,
-0x30,
-0x60,
-0xc0,
-0xc1,
-0xfe,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7f,
-0xc8,
-0xc8,
-0xc8,
-0xc8,
-0xc8,
-0xc8,
-0x70,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x22,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x7c,
-0x60,
-0x60,
-0x60,
-0xc0,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x76,
-0xdc,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x10,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x38,
-0x10,
-0x7c,
-0xd6,
-0xd6,
-0xd6,
-0xd6,
-0xd6,
-0xd6,
-0x7c,
-0x10,
-0x38,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x38,
-0x6c,
-0xc6,
-0xc6,
-0xc6,
-0xfe,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0x6c,
-0x38,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x3c,
-0x66,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0xc3,
-0x66,
-0x24,
-0x24,
-0xa5,
-0xe7,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1e,
-0x31,
-0x30,
-0x18,
-0x0c,
-0x3e,
-0x66,
-0x66,
-0x66,
-0x66,
-0x66,
-0x3c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x6e,
-0xff,
-0x99,
-0x99,
-0x99,
-0x99,
-0xff,
-0x76,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x02,
-0x04,
-0x7c,
-0xca,
-0x92,
-0xa6,
-0x7c,
-0x40,
-0x80,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x1c,
-0x30,
-0x60,
-0x60,
-0x60,
-0x7c,
-0x60,
-0x60,
-0x60,
-0x60,
-0x30,
-0x1c,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x7c,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0xc6,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x7c,
-0x00,
-0x00,
-0x00,
-0xfe,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x18,
-0x7e,
-0x18,
-0x18,
-0x00,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x30,
-0x18,
-0x0c,
-0x06,
-0x0c,
-0x18,
-0x30,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x0c,
-0x18,
-0x30,
-0x60,
-0x30,
-0x18,
-0x0c,
-0x00,
-0x7e,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x0e,
-0x19,
-0x1b,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0x18,
-0xd8,
-0x98,
-0x70,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x18,
-0x00,
-0x7e,
-0x00,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x76,
-0xdc,
-0x00,
-0x00,
-0x76,
-0xdc,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x38,
-0x44,
-0x44,
-0x44,
-0x38,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x18,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x07,
-0x06,
-0x06,
-0x0c,
-0x0c,
-0x08,
-0x98,
-0xd0,
-0xf0,
-0x60,
-0x20,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0xcc,
-0x76,
-0x66,
-0x66,
-0x66,
-0x66,
-0xf7,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x70,
-0x98,
-0x18,
-0x30,
-0x60,
-0x88,
-0xf8,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x7c,
-0x64,
-0x64,
-0x64,
-0x64,
-0x64,
-0x7c,
-0x00,
-0x00,
-0x00,
-0x00,
-
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-
-};
-
-
-const struct font_desc font_rl = {
-       RL_IDX,
-       "RomanLarge",
-       8,
-       16,
-       patterns,
-       -1
-};
index 9be83bed19597dd45bfec2736b51b2d8c7b0c1fa..4fd07d9eca039d062c9968c452757f952b962a7e 100644 (file)
@@ -64,10 +64,6 @@ static const struct font_desc *fonts[] = {
 #undef NO_FONTS
     &font_mini_4x6,
 #endif
-#ifdef CONFIG_FONT_RL
-#undef NO_FONTS
-    &font_rl,
-#endif
 };
 
 #define num_fonts (sizeof(fonts)/sizeof(*fonts))
index 957a3ada2b75487c5188b65369ae3121d8866c20..5abd3cb006719447792760cfa822213605f4a664 100644 (file)
@@ -227,9 +227,8 @@ void dnfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
  * Initialization
  */
 
-static int __devinit dnfb_probe(struct device *device)
+static int __devinit dnfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int err = 0;
 
@@ -257,7 +256,7 @@ static int __devinit dnfb_probe(struct device *device)
                framebuffer_release(info);
                return err;
        }
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /* now we have registered we can safely setup the hardware */
        out_8(AP_CONTROL_3A, RESET_CREG);
@@ -271,10 +270,11 @@ static int __devinit dnfb_probe(struct device *device)
        return err;
 }
 
-static struct device_driver dnfb_driver = {
-       .name   = "dnfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver dnfb_driver = {
        .probe  = dnfb_probe,
+       .driver = {
+               .name   = "dnfb",
+       },
 };
 
 static struct platform_device dnfb_device = {
@@ -288,12 +288,12 @@ int __init dnfb_init(void)
        if (fb_get_options("dnfb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&dnfb_driver);
+       ret = platform_driver_register(&dnfb_driver);
 
        if (!ret) {
                ret = platform_device_register(&dnfb_device);
                if (ret)
-                       driver_unregister(&dnfb_driver);
+                       platform_driver_unregister(&dnfb_driver);
        }
        return ret;
 }
index 6a81a1dd8f3d0bb357db89877bf53c8e4a745802..3b0e71383448a426dc979a008502d04f2dfacb6d 100644 (file)
@@ -609,9 +609,9 @@ static void epson1355fb_platform_release(struct device *device)
 {
 }
 
-static int epson1355fb_remove(struct device *device)
+static int epson1355fb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct epson1355_par *par = info->par;
 
        backlight_enable(0);
@@ -632,9 +632,8 @@ static int epson1355fb_remove(struct device *device)
        return 0;
 }
 
-int __init epson1355fb_probe(struct device *device)
+int __init epson1355fb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct epson1355_par *default_par;
        struct fb_info *info;
        u8 revision;
@@ -713,7 +712,7 @@ int __init epson1355fb_probe(struct device *device)
        /*
         * Our driver data.
         */
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
               info->node, info->fix.id);
@@ -721,15 +720,16 @@ int __init epson1355fb_probe(struct device *device)
        return 0;
 
       bail:
-       epson1355fb_remove(device);
+       epson1355fb_remove(dev);
        return rc;
 }
 
-static struct device_driver epson1355fb_driver = {
-       .name   = "epson1355fb",
-       .bus    = &platform_bus_type,
+static struct platform_driver epson1355fb_driver = {
        .probe  = epson1355fb_probe,
        .remove = epson1355fb_remove,
+       .driver = {
+               .name   = "epson1355fb",
+       },
 };
 
 static struct platform_device epson1355fb_device = {
@@ -747,11 +747,11 @@ int __init epson1355fb_init(void)
        if (fb_get_options("epson1355fb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&epson1355fb_driver);
+       ret = platform_driver_register(&epson1355fb_driver);
        if (!ret) {
                ret = platform_device_register(&epson1355fb_device);
                if (ret)
-                       driver_unregister(&epson1355fb_driver);
+                       platform_driver_unregister(&epson1355fb_driver);
        }
        return ret;
 }
@@ -762,7 +762,7 @@ module_init(epson1355fb_init);
 static void __exit epson1355fb_exit(void)
 {
        platform_device_unregister(&epson1355fb_device);
-       driver_unregister(&epson1355fb_driver);
+       platform_driver_unregister(&epson1355fb_driver);
 }
 
 /* ------------------------------------------------------------------------- */
index 04417dc16c2e3572084a9edaad40a7af3982d71b..2584daec7bbf2132c0df085ede3bcf4b2a692b21 100644 (file)
@@ -57,6 +57,9 @@ static struct fb_ops ffb_ops = {
        .fb_sync                = ffb_sync,
        .fb_mmap                = ffb_mmap,
        .fb_ioctl               = ffb_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* Register layout and definitions */
index 9d5e4f342110acb4dbf34b3f8a835a2d1daaaf69..d744c51807b73af9420abaea6397f5f96afc7af3 100644 (file)
@@ -1105,12 +1105,11 @@ int __init gbefb_setup(char *options)
        return 0;
 }
 
-static int __init gbefb_probe(struct device *dev)
+static int __init gbefb_probe(struct platform_device *p_dev)
 {
        int i, ret = 0;
        struct fb_info *info;
        struct gbefb_par *par;
-       struct platform_device *p_dev = to_platform_device(dev);
 #ifndef MODULE
        char *options = NULL;
 #endif
@@ -1204,8 +1203,8 @@ static int __init gbefb_probe(struct device *dev)
                goto out_gbe_unmap;
        }
 
-       dev_set_drvdata(&p_dev->dev, info);
-       gbefb_create_sysfs(dev);
+       platform_set_drvdata(p_dev, info);
+       gbefb_create_sysfs(&p_dev->dev);
 
        printk(KERN_INFO "fb%d: %s rev %d @ 0x%08x using %dkB memory\n",
               info->node, info->fix.id, gbe_revision, (unsigned) GBE_BASE,
@@ -1231,10 +1230,9 @@ out_release_framebuffer:
        return ret;
 }
 
-static int __devexit gbefb_remove(struct device* dev)
+static int __devexit gbefb_remove(struct platform_device* p_dev)
 {
-       struct platform_device *p_dev = to_platform_device(dev);
-       struct fb_info *info = dev_get_drvdata(&p_dev->dev);
+       struct fb_info *info = platform_get_drvdata(p_dev);
 
        unregister_framebuffer(info);
        gbe_turn_off();
@@ -1252,18 +1250,19 @@ static int __devexit gbefb_remove(struct device* dev)
        return 0;
 }
 
-static struct device_driver gbefb_driver = {
-       .name = "gbefb",
-       .bus = &platform_bus_type,
+static struct platform_driver gbefb_driver = {
        .probe = gbefb_probe,
        .remove = __devexit_p(gbefb_remove),
+       .driver = {
+               .name = "gbefb",
+       },
 };
 
 static struct platform_device *gbefb_device;
 
 int __init gbefb_init(void)
 {
-       int ret = driver_register(&gbefb_driver);
+       int ret = platform_driver_register(&gbefb_driver);
        if (!ret) {
                gbefb_device = platform_device_alloc("gbefb", 0);
                if (gbefb_device) {
@@ -1273,7 +1272,7 @@ int __init gbefb_init(void)
                }
                if (ret) {
                        platform_device_put(gbefb_device);
-                       driver_unregister(&gbefb_driver);
+                       platform_driver_unregister(&gbefb_driver);
                }
        }
        return ret;
@@ -1282,7 +1281,7 @@ int __init gbefb_init(void)
 void __exit gbefb_exit(void)
 {
        platform_device_unregister(gbefb_device);
-       driver_unregister(&gbefb_driver);
+       platform_driver_unregister(&gbefb_driver);
 }
 
 module_init(gbefb_init);
index e20b9f3a255fb65b99e3a0fd37d276cbbbb8957d..5924cc225c95d2f736935a3eb11744e46e17df29 100644 (file)
@@ -423,18 +423,18 @@ static void imxfb_setup_gpio(struct imxfb_info *fbi)
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int imxfb_suspend(struct device *dev, pm_message_t state)
+static int imxfb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct imxfb_info *fbi = dev_get_drvdata(dev);
+       struct imxfb_info *fbi = platform_get_drvdata(dev);
        pr_debug("%s\n",__FUNCTION__);
 
        imxfb_disable_controller(fbi);
        return 0;
 }
 
-static int imxfb_resume(struct device *dev)
+static int imxfb_resume(struct platform_device *dev)
 {
-       struct imxfb_info *fbi = dev_get_drvdata(dev);
+       struct imxfb_info *fbi = platform_get_drvdata(dev);
        pr_debug("%s\n",__FUNCTION__);
 
        imxfb_enable_controller(fbi);
@@ -538,9 +538,8 @@ static int __init imxfb_map_video_memory(struct fb_info *info)
        return fbi->map_cpu ? 0 : -ENOMEM;
 }
 
-static int __init imxfb_probe(struct device *dev)
+static int __init imxfb_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct imxfb_info *fbi;
        struct fb_info *info;
        struct imxfb_mach_info *inf;
@@ -553,21 +552,21 @@ static int __init imxfb_probe(struct device *dev)
        if(!res)
                return -ENODEV;
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        if(!inf) {
                dev_err(dev,"No platform_data available\n");
                return -ENOMEM;
        }
 
-       info = framebuffer_alloc(sizeof(struct imxfb_info), dev);
+       info = framebuffer_alloc(sizeof(struct imxfb_info), &pdev->dev);
        if(!info)
                return -ENOMEM;
 
        fbi = info->par;
 
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       ret = imxfb_init_fbinfo(dev);
+       ret = imxfb_init_fbinfo(&pdev->dev);
        if( ret < 0 )
                goto failed_init;
 
@@ -621,22 +620,21 @@ failed_register:
        fb_dealloc_cmap(&info->cmap);
 failed_cmap:
        if (!inf->fixed_screen_cpu)
-               dma_free_writecombine(dev,fbi->map_size,fbi->map_cpu,
+               dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
                           fbi->map_dma);
 failed_map:
        kfree(info->pseudo_palette);
 failed_regs:
        release_mem_region(res->start, res->end - res->start);
 failed_init:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        framebuffer_release(info);
        return ret;
 }
 
-static int imxfb_remove(struct device *dev)
+static int imxfb_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct imxfb_info *fbi = info->par;
        struct resource *res;
 
@@ -651,36 +649,37 @@ static int imxfb_remove(struct device *dev)
        framebuffer_release(info);
 
        release_mem_region(res->start, res->end - res->start + 1);
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
 
        return 0;
 }
 
-void  imxfb_shutdown(struct device * dev)
+void  imxfb_shutdown(struct platform_device * dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct imxfb_info *fbi = info->par;
        imxfb_disable_controller(fbi);
 }
 
-static struct device_driver imxfb_driver = {
-       .name           = "imx-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver imxfb_driver = {
        .probe          = imxfb_probe,
        .suspend        = imxfb_suspend,
        .resume         = imxfb_resume,
        .remove         = imxfb_remove,
        .shutdown       = imxfb_shutdown,
+       .driver         = {
+               .name   = "imx-fb",
+       },
 };
 
 int __init imxfb_init(void)
 {
-       return driver_register(&imxfb_driver);
+       return platform_driver_register(&imxfb_driver);
 }
 
 static void __exit imxfb_cleanup(void)
 {
-       driver_unregister(&imxfb_driver);
+       platform_driver_unregister(&imxfb_driver);
 }
 
 module_init(imxfb_init);
index 84a7fe435bb82bd082c770b51cbae2b511c8d361..376d4a171ec7bd4fb4d0ca6698d6fdb6522cfa72 100644 (file)
@@ -51,6 +51,9 @@ static struct fb_ops leo_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = leo_mmap,
        .fb_ioctl               = leo_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 #define LEO_OFF_LC_SS0_KRN     0x00200000UL
index f60b1f4322700d2554e729245145c9c8407714d3..3353103e8b0bd7416bb2ba05dbfb4ac21f52ec5c 100644 (file)
@@ -42,7 +42,7 @@ int nvidia_probe_i2c_connector(struct fb_info *info, int conn,
 #define nvidia_probe_i2c_connector(p, c, edid) (-1)
 #endif
 
-#ifdef CONFIG_FB_OF
+#ifdef CONFIG_PPC_OF
 int nvidia_probe_of_connector(struct fb_info *info, int conn,
                              u8 ** out_edid);
 #else
index 0b40a2a721c180609c15b16e82e3209b195a846e..bee09c6e48f61ce28224fa2282f6bd8f113f114a 100644 (file)
@@ -1301,7 +1301,7 @@ static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
        struct nvidia_par *par = info->par;
        u32 total;
 
-       total = info->var.yoffset * info->fix.line_length + info->var.xoffset;
+       total = var->yoffset * info->fix.line_length + var->xoffset;
 
        NVSetStartAddress(par, total);
 
index 2c856838694e1c87187ebe655c418ff0a63ae651..00d87f5bb7be0ed8f854d34b742f75e6e97807e2 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
+#include <linux/pci.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 
@@ -325,8 +326,8 @@ static void __init offb_init_nodriver(struct device_node *dp)
        int *pp, i;
        unsigned int len;
        int width = 640, height = 480, depth = 8, pitch;
-       unsigned *up;
-       unsigned long address;
+       unsigned int rsize, *up;
+       unsigned long address = 0;
 
        if ((pp = (int *) get_property(dp, "depth", &len)) != NULL
            && len == sizeof(int))
@@ -344,10 +345,40 @@ static void __init offb_init_nodriver(struct device_node *dp)
                        pitch = 0x1000;
        } else
                pitch = width;
-       if ((up = (unsigned *) get_property(dp, "address", &len)) != NULL
-           && len == sizeof(unsigned))
+
+       rsize = (unsigned long)pitch * (unsigned long)height *
+               (unsigned long)(depth / 8);
+
+       /* Try to match device to a PCI device in order to get a properly
+       * translated address rather then trying to decode the open firmware
+       * stuff in various incorrect ways
+       */
+#ifdef CONFIG_PCI
+       /* First try to locate the PCI device if any */
+       {
+               struct pci_dev *pdev = NULL;
+
+              for_each_pci_dev(pdev) {
+                       if (dp == pci_device_to_OF_node(pdev))
+                               break;
+              }
+               if (pdev) {
+                       for (i = 0; i < 6 && address == 0; i++) {
+                               if ((pci_resource_flags(pdev, i) &
+                                   IORESOURCE_MEM) &&
+                                  (pci_resource_len(pdev, i) >= rsize))
+                                       address = pci_resource_start(pdev, i);
+                       }
+                      pci_dev_put(pdev);
+               }
+        }
+#endif /* CONFIG_PCI */
+
+       if (address == 0 &&
+           (up = (unsigned *) get_property(dp, "address", &len)) != NULL &&
+           len == sizeof(unsigned))
                address = (u_long) * up;
-       else {
+       if (address == 0) {
                for (i = 0; i < dp->n_addrs; ++i)
                        if (dp->addrs[i].size >=
                            pitch * height * depth / 8)
index 9aaf65fb623ae99e0df6dc2289c1f7e7379af89d..18bcda23d2cf7b7a2a9d39ae03b87b4cad91799f 100644 (file)
@@ -48,6 +48,9 @@ static struct fb_ops p9100_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = p9100_mmap,
        .fb_ioctl               = p9100_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* P9100 control registers */
index f305a5b77b23f8db3311315349a5cb24041ad37f..7b4cd250bec8fd9fca0bf6961b8a21a96a4902f6 100644 (file)
@@ -980,17 +980,17 @@ pxafb_freq_policy(struct notifier_block *nb, unsigned long val, void *data)
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int pxafb_suspend(struct device *dev, pm_message_t state)
+static int pxafb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct pxafb_info *fbi = dev_get_drvdata(dev);
+       struct pxafb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_DISABLE_PM);
        return 0;
 }
 
-static int pxafb_resume(struct device *dev)
+static int pxafb_resume(struct platform_device *dev)
 {
-       struct pxafb_info *fbi = dev_get_drvdata(dev);
+       struct pxafb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_ENABLE_PM);
        return 0;
@@ -1268,7 +1268,7 @@ static int __init pxafb_parse_options(struct device *dev, char *options)
 }
 #endif
 
-int __init pxafb_probe(struct device *dev)
+int __init pxafb_probe(struct platform_device *dev)
 {
        struct pxafb_info *fbi;
        struct pxafb_mach_info *inf;
@@ -1276,14 +1276,14 @@ int __init pxafb_probe(struct device *dev)
 
        dev_dbg(dev, "pxafb_probe\n");
 
-       inf = dev->platform_data;
+       inf = dev->dev.platform_data;
        ret = -ENOMEM;
        fbi = NULL;
        if (!inf)
                goto failed;
 
 #ifdef CONFIG_FB_PXA_PARAMETERS
-       ret = pxafb_parse_options(dev, g_options);
+       ret = pxafb_parse_options(&dev->dev, g_options);
        if (ret < 0)
                goto failed;
 #endif
@@ -1293,36 +1293,36 @@ int __init pxafb_probe(struct device *dev)
         * a warning is given. */
 
         if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK)
-                dev_warn(dev, "machine LCCR0 setting contains illegal bits: %08x\n",
+                dev_warn(&dev->dev, "machine LCCR0 setting contains illegal bits: %08x\n",
                         inf->lccr0 & LCCR0_INVALID_CONFIG_MASK);
         if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK)
-                dev_warn(dev, "machine LCCR3 setting contains illegal bits: %08x\n",
+                dev_warn(&dev->dev, "machine LCCR3 setting contains illegal bits: %08x\n",
                         inf->lccr3 & LCCR3_INVALID_CONFIG_MASK);
         if (inf->lccr0 & LCCR0_DPD &&
            ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas ||
             (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl ||
             (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono))
-                dev_warn(dev, "Double Pixel Data (DPD) mode is only valid in passive mono"
+                dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is only valid in passive mono"
                         " single panel mode\n");
         if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act &&
            (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual)
-                dev_warn(dev, "Dual panel only valid in passive mode\n");
+                dev_warn(&dev->dev, "Dual panel only valid in passive mode\n");
         if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas &&
              (inf->upper_margin || inf->lower_margin))
-                dev_warn(dev, "Upper and lower margins must be 0 in passive mode\n");
+                dev_warn(&dev->dev, "Upper and lower margins must be 0 in passive mode\n");
 #endif
 
-       dev_dbg(dev, "got a %dx%dx%d LCD\n",inf->xres, inf->yres, inf->bpp);
+       dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n",inf->xres, inf->yres, inf->bpp);
        if (inf->xres == 0 || inf->yres == 0 || inf->bpp == 0) {
-               dev_err(dev, "Invalid resolution or bit depth\n");
+               dev_err(&dev->dev, "Invalid resolution or bit depth\n");
                ret = -EINVAL;
                goto failed;
        }
        pxafb_backlight_power = inf->pxafb_backlight_power;
        pxafb_lcd_power = inf->pxafb_lcd_power;
-       fbi = pxafb_init_fbinfo(dev);
+       fbi = pxafb_init_fbinfo(&dev->dev);
        if (!fbi) {
-               dev_err(dev, "Failed to initialize framebuffer device\n");
+               dev_err(&dev->dev, "Failed to initialize framebuffer device\n");
                ret = -ENOMEM; // only reason for pxafb_init_fbinfo to fail is kmalloc
                goto failed;
        }
@@ -1330,14 +1330,14 @@ int __init pxafb_probe(struct device *dev)
        /* Initialize video memory */
        ret = pxafb_map_video_memory(fbi);
        if (ret) {
-               dev_err(dev, "Failed to allocate video RAM: %d\n", ret);
+               dev_err(&dev->dev, "Failed to allocate video RAM: %d\n", ret);
                ret = -ENOMEM;
                goto failed;
        }
 
        ret = request_irq(IRQ_LCD, pxafb_handle_irq, SA_INTERRUPT, "LCD", fbi);
        if (ret) {
-               dev_err(dev, "request_irq failed: %d\n", ret);
+               dev_err(&dev->dev, "request_irq failed: %d\n", ret);
                ret = -EBUSY;
                goto failed;
        }
@@ -1349,11 +1349,11 @@ int __init pxafb_probe(struct device *dev)
        pxafb_check_var(&fbi->fb.var, &fbi->fb);
        pxafb_set_par(&fbi->fb);
 
-       dev_set_drvdata(dev, fbi);
+       platform_set_drvdata(dev, fbi);
 
        ret = register_framebuffer(&fbi->fb);
        if (ret < 0) {
-               dev_err(dev, "Failed to register framebuffer device: %d\n", ret);
+               dev_err(&dev->dev, "Failed to register framebuffer device: %d\n", ret);
                goto failed;
        }
 
@@ -1376,19 +1376,20 @@ int __init pxafb_probe(struct device *dev)
        return 0;
 
 failed:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(dev, NULL);
        kfree(fbi);
        return ret;
 }
 
-static struct device_driver pxafb_driver = {
-       .name           = "pxa2xx-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver pxafb_driver = {
        .probe          = pxafb_probe,
 #ifdef CONFIG_PM
        .suspend        = pxafb_suspend,
        .resume         = pxafb_resume,
 #endif
+       .driver         = {
+               .name   = "pxa2xx-fb",
+       },
 };
 
 #ifndef MODULE
@@ -1415,7 +1416,7 @@ int __devinit pxafb_init(void)
                return -ENODEV;
        pxafb_setup(option);
 #endif
-       return driver_register(&pxafb_driver);
+       return platform_driver_register(&pxafb_driver);
 }
 
 module_init(pxafb_init);
index bfc41f2c902a2d93576b3a86f051b927a4e692bd..fc91dbf896d2697b305b95fb6ad03c43852e34a0 100644 (file)
@@ -86,9 +86,8 @@ static struct fb_ops q40fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init q40fb_probe(struct device *device)
+static int __init q40fb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
 
        if (!MACH_IS_Q40)
@@ -128,10 +127,11 @@ static int __init q40fb_probe(struct device *device)
        return 0;
 }
 
-static struct device_driver q40fb_driver = {
-       .name   = "q40fb",
-       .bus    = &platform_bus_type,
+static struct platform_driver q40fb_driver = {
        .probe  = q40fb_probe,
+       .driver = {
+               .name   = "q40fb",
+       },
 };
 
 static struct platform_device q40fb_device = {
@@ -145,12 +145,12 @@ int __init q40fb_init(void)
        if (fb_get_options("q40fb", NULL))
                return -ENODEV;
 
-       ret = driver_register(&q40fb_driver);
+       ret = platform_driver_register(&q40fb_driver);
 
        if (!ret) {
                ret = platform_device_register(&q40fb_device);
                if (ret)
-                       driver_unregister(&q40fb_driver);
+                       platform_driver_unregister(&q40fb_driver);
        }
        return ret;
 }
index 3edbd14c5c469565500ce970866d2ef24ee86453..e5d0f92eeae36613314f4bd347f9090777c07a02 100644 (file)
@@ -503,10 +503,9 @@ s1d13xxxfb_fetch_hw_state(struct fb_info *info)
 
 
 static int
-s1d13xxxfb_remove(struct device *dev)
+s1d13xxxfb_remove(struct platform_device *pdev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
-       struct platform_device *pdev = to_platform_device(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct s1d13xxxfb_par *par = NULL;
 
        if (info) {
@@ -534,9 +533,8 @@ s1d13xxxfb_remove(struct device *dev)
 }
 
 static int __devinit
-s1d13xxxfb_probe(struct device *dev)
+s1d13xxxfb_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct s1d13xxxfb_par *default_par;
        struct fb_info *info;
        struct s1d13xxxfb_pdata *pdata = NULL;
@@ -548,8 +546,8 @@ s1d13xxxfb_probe(struct device *dev)
        printk(KERN_INFO "Epson S1D13XXX FB Driver\n");
 
        /* enable platform-dependent hardware glue, if any */
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (pdev->dev.platform_data)
+               pdata = pdev->dev.platform_data;
 
        if (pdata && pdata->platform_init_video)
                pdata->platform_init_video();
@@ -572,14 +570,14 @@ s1d13xxxfb_probe(struct device *dev)
 
        if (!request_mem_region(pdev->resource[0].start,
                pdev->resource[0].end - pdev->resource[0].start +1, "s1d13xxxfb mem")) {
-               dev_dbg(dev, "request_mem_region failed\n");
+               dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
        }
 
        if (!request_mem_region(pdev->resource[1].start,
                pdev->resource[1].end - pdev->resource[1].start +1, "s1d13xxxfb regs")) {
-               dev_dbg(dev, "request_mem_region failed\n");
+               dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
        }
@@ -640,7 +638,7 @@ s1d13xxxfb_probe(struct device *dev)
                goto bail;
        }
 
-       dev_set_drvdata(&pdev->dev, info);
+       platform_set_drvdata(pdev, info);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
               info->node, info->fix.id);
@@ -648,15 +646,15 @@ s1d13xxxfb_probe(struct device *dev)
        return 0;
 
 bail:
-       s1d13xxxfb_remove(dev);
+       s1d13xxxfb_remove(pdev);
        return ret;
 
 }
 
 #ifdef CONFIG_PM
-static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
+static int s1d13xxxfb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct s1d13xxxfb_par *s1dfb = info->par;
        struct s1d13xxxfb_pdata *pdata = NULL;
 
@@ -664,8 +662,8 @@ static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
        lcd_enable(s1dfb, 0);
        crt_enable(s1dfb, 0);
 
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (dev->dev.platform_data)
+               pdata = dev->dev.platform_data;
 
 #if 0
        if (!s1dfb->disp_save)
@@ -701,9 +699,9 @@ static int s1d13xxxfb_suspend(struct device *dev, pm_message_t state)
                return 0;
 }
 
-static int s1d13xxxfb_resume(struct device *dev)
+static int s1d13xxxfb_resume(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct s1d13xxxfb_par *s1dfb = info->par;
        struct s1d13xxxfb_pdata *pdata = NULL;
 
@@ -714,8 +712,8 @@ static int s1d13xxxfb_resume(struct device *dev)
        while ((s1d13xxxfb_readreg(s1dfb, S1DREG_PS_STATUS) & 0x01))
                udelay(10);
 
-       if (dev->platform_data)
-               pdata = dev->platform_data;
+       if (dev->dev.platform_data)
+               pdata = dev->dev.platform_data;
 
        if (s1dfb->regs_save) {
                /* will write RO regs, *should* get away with it :) */
@@ -741,15 +739,16 @@ static int s1d13xxxfb_resume(struct device *dev)
 }
 #endif /* CONFIG_PM */
 
-static struct device_driver s1d13xxxfb_driver = {
-       .name           = S1D_DEVICENAME,
-       .bus            = &platform_bus_type,
+static struct platform_driver s1d13xxxfb_driver = {
        .probe          = s1d13xxxfb_probe,
        .remove         = s1d13xxxfb_remove,
 #ifdef CONFIG_PM
        .suspend        = s1d13xxxfb_suspend,
-       .resume         = s1d13xxxfb_resume
+       .resume         = s1d13xxxfb_resume,
 #endif
+       .driver         = {
+               .name   = S1D_DEVICENAME,
+       },
 };
 
 
@@ -759,14 +758,14 @@ s1d13xxxfb_init(void)
        if (fb_get_options("s1d13xxxfb", NULL))
                return -ENODEV;
 
-       return driver_register(&s1d13xxxfb_driver);
+       return platform_driver_register(&s1d13xxxfb_driver);
 }
 
 
 static void __exit
 s1d13xxxfb_exit(void)
 {
-       driver_unregister(&s1d13xxxfb_driver);
+       platform_driver_unregister(&s1d13xxxfb_driver);
 }
 
 module_init(s1d13xxxfb_init);
index 855a6778b9eba115879bdbde91d4372f414b9d81..ce6e749db3a7aa5433401833e28ee5b56f4ad135 100644 (file)
@@ -634,19 +634,18 @@ static irqreturn_t s3c2410fb_irq(int irq, void *dev_id, struct pt_regs *r)
 
 static char driver_name[]="s3c2410fb";
 
-int __init s3c2410fb_probe(struct device *dev)
+int __init s3c2410fb_probe(struct platform_device *pdev)
 {
        struct s3c2410fb_info *info;
        struct fb_info     *fbinfo;
-       struct platform_device *pdev = to_platform_device(dev);
        struct s3c2410fb_hw *mregs;
        int ret;
        int irq;
        int i;
 
-       mach_info = dev->platform_data;
+       mach_info = pdev->dev.platform_data;
        if (mach_info == NULL) {
-               dev_err(dev,"no platform data for lcd, cannot attach\n");
+               dev_err(&pdev->dev,"no platform data for lcd, cannot attach\n");
                return -EINVAL;
        }
 
@@ -654,11 +653,11 @@ int __init s3c2410fb_probe(struct device *dev)
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
-               dev_err(dev, "no irq for device\n");
+               dev_err(&pdev->dev, "no irq for device\n");
                return -ENOENT;
        }
 
-       fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), dev);
+       fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);
        if (!fbinfo) {
                return -ENOMEM;
        }
@@ -666,7 +665,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        info = fbinfo->par;
        info->fb = fbinfo;
-       dev_set_drvdata(dev, fbinfo);
+       platform_set_drvdata(pdev, fbinfo);
 
        s3c2410fb_init_registers(info);
 
@@ -676,7 +675,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        memcpy(&info->regs, &mach_info->regs, sizeof(info->regs));
 
-       info->mach_info             = dev->platform_data;
+       info->mach_info             = pdev->dev.platform_data;
 
        fbinfo->fix.type            = FB_TYPE_PACKED_PIXELS;
        fbinfo->fix.type_aux        = 0;
@@ -735,7 +734,7 @@ int __init s3c2410fb_probe(struct device *dev)
 
        ret = request_irq(irq, s3c2410fb_irq, SA_INTERRUPT, pdev->name, info);
        if (ret) {
-               dev_err(dev, "cannot get irq %d - err %d\n", irq, ret);
+               dev_err(&pdev->dev, "cannot get irq %d - err %d\n", irq, ret);
                ret = -EBUSY;
                goto release_mem;
        }
@@ -773,7 +772,7 @@ int __init s3c2410fb_probe(struct device *dev)
        }
 
        /* create device files */
-       device_create_file(dev, &dev_attr_debug);
+       device_create_file(&pdev->dev, &dev_attr_debug);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
                fbinfo->node, fbinfo->fix.id);
@@ -816,10 +815,9 @@ static void s3c2410fb_stop_lcd(void)
 /*
  *  Cleanup
  */
-static int s3c2410fb_remove(struct device *dev)
+static int s3c2410fb_remove(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(pdev);
        struct s3c2410fb_info *info = fbinfo->par;
        int irq;
 
@@ -847,9 +845,9 @@ static int s3c2410fb_remove(struct device *dev)
 
 /* suspend and resume support for the lcd controller */
 
-static int s3c2410fb_suspend(struct device *dev, pm_message_t state)
+static int s3c2410fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(dev);
        struct s3c2410fb_info *info = fbinfo->par;
 
        s3c2410fb_stop_lcd();
@@ -864,9 +862,9 @@ static int s3c2410fb_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int s3c2410fb_resume(struct device *dev)
+static int s3c2410fb_resume(struct platform_device *dev)
 {
-       struct fb_info     *fbinfo = dev_get_drvdata(dev);
+       struct fb_info     *fbinfo = platform_get_drvdata(dev);
        struct s3c2410fb_info *info = fbinfo->par;
 
        clk_enable(info->clk);
@@ -882,24 +880,25 @@ static int s3c2410fb_resume(struct device *dev)
 #define s3c2410fb_resume  NULL
 #endif
 
-static struct device_driver s3c2410fb_driver = {
-       .name           = "s3c2410-lcd",
-       .owner          = THIS_MODULE,
-       .bus            = &platform_bus_type,
+static struct platform_driver s3c2410fb_driver = {
        .probe          = s3c2410fb_probe,
+       .remove         = s3c2410fb_remove,
        .suspend        = s3c2410fb_suspend,
        .resume         = s3c2410fb_resume,
-       .remove         = s3c2410fb_remove
+       .driver         = {
+               .name   = "s3c2410-lcd",
+               .owner  = THIS_MODULE,
+       },
 };
 
 int __devinit s3c2410fb_init(void)
 {
-       return driver_register(&s3c2410fb_driver);
+       return platform_driver_register(&s3c2410fb_driver);
 }
 
 static void __exit s3c2410fb_cleanup(void)
 {
-       driver_unregister(&s3c2410fb_driver);
+       platform_driver_unregister(&s3c2410fb_driver);
 }
 
 
index a5184575cfae1696da0709d7db4298d638d93c94..2ea1354e439ff2d5e65a412fe2dbc1dfe41132c0 100644 (file)
@@ -1308,17 +1308,17 @@ sa1100fb_freq_policy(struct notifier_block *nb, unsigned long val,
  * Power management hooks.  Note that we won't be called from IRQ context,
  * unlike the blank functions above, so we may sleep.
  */
-static int sa1100fb_suspend(struct device *dev, pm_message_t state)
+static int sa1100fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct sa1100fb_info *fbi = dev_get_drvdata(dev);
+       struct sa1100fb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_DISABLE_PM);
        return 0;
 }
 
-static int sa1100fb_resume(struct device *dev)
+static int sa1100fb_resume(struct platform_device *dev)
 {
-       struct sa1100fb_info *fbi = dev_get_drvdata(dev);
+       struct sa1100fb_info *fbi = platform_get_drvdata(dev);
 
        set_ctrlr_state(fbi, C_ENABLE_PM);
        return 0;
@@ -1452,7 +1452,7 @@ static struct sa1100fb_info * __init sa1100fb_init_fbinfo(struct device *dev)
        return fbi;
 }
 
-static int __init sa1100fb_probe(struct device *dev)
+static int __init sa1100fb_probe(struct platform_device *pdev)
 {
        struct sa1100fb_info *fbi;
        int ret;
@@ -1460,7 +1460,7 @@ static int __init sa1100fb_probe(struct device *dev)
        if (!request_mem_region(0xb0100000, 0x10000, "LCD"))
                return -EBUSY;
 
-       fbi = sa1100fb_init_fbinfo(dev);
+       fbi = sa1100fb_init_fbinfo(&pdev->dev);
        ret = -ENOMEM;
        if (!fbi)
                goto failed;
@@ -1488,7 +1488,7 @@ static int __init sa1100fb_probe(struct device *dev)
         */
        sa1100fb_check_var(&fbi->fb.var, &fbi->fb);
 
-       dev_set_drvdata(dev, fbi);
+       platform_set_drvdata(pdev, fbi);
 
        ret = register_framebuffer(&fbi->fb);
        if (ret < 0)
@@ -1505,18 +1505,19 @@ static int __init sa1100fb_probe(struct device *dev)
        return 0;
 
 failed:
-       dev_set_drvdata(dev, NULL);
+       platform_set_drvdata(pdev, NULL);
        kfree(fbi);
        release_mem_region(0xb0100000, 0x10000);
        return ret;
 }
 
-static struct device_driver sa1100fb_driver = {
-       .name           = "sa11x0-fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver sa1100fb_driver = {
        .probe          = sa1100fb_probe,
        .suspend        = sa1100fb_suspend,
        .resume         = sa1100fb_resume,
+       .driver         = {
+               .name   = "sa11x0-fb",
+       },
 };
 
 int __init sa1100fb_init(void)
@@ -1524,7 +1525,7 @@ int __init sa1100fb_init(void)
        if (fb_get_options("sa1100fb", NULL))
                return -ENODEV;
 
-       return driver_register(&sa1100fb_driver);
+       return platform_driver_register(&sa1100fb_driver);
 }
 
 int __init sa1100fb_setup(char *options)
index 34f72edba820e0edd638b7c8e2556440dec1bee6..646c43f921c55b3bc0774fecbd92cb38778b3b33 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2003 David S. Miller (davem@redhat.com)
  */
 
+#include <linux/compat.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/string.h>
@@ -182,3 +183,109 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
        };
 }
 EXPORT_SYMBOL(sbusfb_ioctl_helper);
+
+#ifdef CONFIG_COMPAT
+struct  fbcmap32 {
+       int             index;          /* first element (0 origin) */
+       int             count;
+       u32             red;
+       u32             green;
+       u32             blue;
+};
+
+#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
+#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
+
+static int fbiogetputcmap(struct file *file, struct fb_info *info,
+               unsigned int cmd, unsigned long arg)
+{
+       struct fbcmap32 __user *argp = (void __user *)arg;
+       struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p));
+       u32 addr;
+       int ret;
+
+       ret = copy_in_user(p, argp, 2 * sizeof(int));
+       ret |= get_user(addr, &argp->red);
+       ret |= put_user(compat_ptr(addr), &p->red);
+       ret |= get_user(addr, &argp->green);
+       ret |= put_user(compat_ptr(addr), &p->green);
+       ret |= get_user(addr, &argp->blue);
+       ret |= put_user(compat_ptr(addr), &p->blue);
+       if (ret)
+               return -EFAULT;
+       return info->fbops->fb_ioctl(file->f_dentry->d_inode, file,
+                       (cmd == FBIOPUTCMAP32) ?
+                       FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC,
+                       (unsigned long)p, info);
+}
+
+struct fbcursor32 {
+       short set;              /* what to set, choose from the list above */
+       short enable;           /* cursor on/off */
+       struct fbcurpos pos;    /* cursor position */
+       struct fbcurpos hot;    /* cursor hot spot */
+       struct fbcmap32 cmap;   /* color map info */
+       struct fbcurpos size;   /* cursor bit map size */
+       u32     image;          /* cursor image bits */
+       u32     mask;           /* cursor mask bits */
+};
+
+#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
+#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
+
+static int fbiogscursor(struct file *file, struct fb_info *info,
+               unsigned long arg)
+{
+       struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
+       struct fbcursor32 __user *argp =  (void __user *)arg;
+       compat_uptr_t addr;
+       int ret;
+
+       ret = copy_in_user(p, argp,
+                             2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
+       ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos));
+       ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int));
+       ret |= get_user(addr, &argp->cmap.red);
+       ret |= put_user(compat_ptr(addr), &p->cmap.red);
+       ret |= get_user(addr, &argp->cmap.green);
+       ret |= put_user(compat_ptr(addr), &p->cmap.green);
+       ret |= get_user(addr, &argp->cmap.blue);
+       ret |= put_user(compat_ptr(addr), &p->cmap.blue);
+       ret |= get_user(addr, &argp->mask);
+       ret |= put_user(compat_ptr(addr), &p->mask);
+       ret |= get_user(addr, &argp->image);
+       ret |= put_user(compat_ptr(addr), &p->image);
+       if (ret)
+               return -EFAULT;
+       return info->fbops->fb_ioctl(file->f_dentry->d_inode, file,
+                       FBIOSCURSOR, (unsigned long)p, info);
+}
+
+long sbusfb_compat_ioctl(struct file *file, unsigned int cmd,
+               unsigned long arg, struct fb_info *info)
+{
+       switch (cmd) {
+       case FBIOGTYPE:
+       case FBIOSATTR:
+       case FBIOGATTR:
+       case FBIOSVIDEO:
+       case FBIOGVIDEO:
+       case FBIOGCURSOR32:     /* This is not implemented yet.
+                                  Later it should be converted... */
+       case FBIOSCURPOS:
+       case FBIOGCURPOS:
+       case FBIOGCURMAX:
+               return info->fbops->fb_ioctl(file->f_dentry->d_inode,
+                               file, cmd, arg, info);
+       case FBIOPUTCMAP32:
+               return fbiogetputcmap(file, info, cmd, arg);
+       case FBIOGETCMAP32:
+               return fbiogetputcmap(file, info, cmd, arg);
+       case FBIOSCURSOR32:
+               return fbiogscursor(file, info, arg);
+       default:
+               return -ENOIOCTLCMD;
+       }
+}
+EXPORT_SYMBOL(sbusfb_compat_ioctl);
+#endif
index a6aa33ba09d6e80c4c2be7a34a00e0c80603cf06..b470e52ce9e2ffdc162beb7be3b05d50af395267 100644 (file)
@@ -20,5 +20,7 @@ extern int sbusfb_mmap_helper(struct sbus_mmap_map *map,
 int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
                        struct fb_info *info,
                        int type, int fb_depth, unsigned long fb_size);
+long sbusfb_compat_ioctl(struct file *file, unsigned int cmd,
+               unsigned long arg, struct fb_info *info);
 
 #endif /* _SBUSLIB_H */
index 2e8769dd345a8ec0cedf06b3e7a0c1a857c3a19a..7054660767e46eb90326b506b4b7b518c87d19ee 100644 (file)
@@ -750,9 +750,8 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static int __init sgivwfb_probe(struct device *device)
+static int __init sgivwfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct sgivw_par *par;
        struct fb_info *info;
        char *monitor;
@@ -813,7 +812,7 @@ static int __init sgivwfb_probe(struct device *device)
                goto fail_register_framebuffer;
        }
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",      
                info->node, sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
@@ -831,9 +830,9 @@ fail_ioremap_regs:
        return -ENXIO;
 }
 
-static int sgivwfb_remove(struct device *device)
+static int sgivwfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                struct sgivw_par *par = info->par;
@@ -847,11 +846,12 @@ static int sgivwfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver sgivwfb_driver = {
-       .name   = "sgivwfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver sgivwfb_driver = {
        .probe  = sgivwfb_probe,
        .remove = sgivwfb_remove,
+       .driver = {
+               .name   = "sgivwfb",
+       },
 };
 
 static struct platform_device *sgivwfb_device;
@@ -867,7 +867,7 @@ int __init sgivwfb_init(void)
                return -ENODEV;
        sgivwfb_setup(option);
 #endif
-       ret = driver_register(&sgivwfb_driver);
+       ret = platform_driver_register(&sgivwfb_driver);
        if (!ret) {
                sgivwfb_device = platform_device_alloc("sgivwfb", 0);
                if (sgivwfb_device) {
@@ -875,7 +875,7 @@ int __init sgivwfb_init(void)
                } else
                        ret = -ENOMEM;
                if (ret) {
-                       driver_unregister(&sgivwfb_driver);
+                       platform_driver_unregister(&sgivwfb_driver);
                        platform_device_put(sgivwfb_device);
                }
        }
@@ -890,7 +890,7 @@ MODULE_LICENSE("GPL");
 static void __exit sgivwfb_exit(void)
 {
        platform_device_unregister(sgivwfb_device);
-       driver_unregister(&sgivwfb_driver);
+       platform_driver_unregister(&sgivwfb_driver);
 }
 
 module_exit(sgivwfb_exit);
index 59fff29bc02e528c8c4d1c845d340da1de88ee35..fe4f63f3849d530b9511da463050bcb74cb174c2 100644 (file)
@@ -52,6 +52,9 @@ static struct fb_ops tcx_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = tcx_mmap,
        .fb_ioctl               = tcx_ioctl,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* THC definitions */
index e25eae1a78c1de86e9f1f7f25103c12708c63a38..3e58ddc2bc3829de17a73ddb496ad67ac7624534 100644 (file)
@@ -245,9 +245,8 @@ static int __init vesafb_setup(char *options)
        return 0;
 }
 
-static int __init vesafb_probe(struct device *device)
+static int __init vesafb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int i, err;
        unsigned int size_vmode;
@@ -414,6 +413,7 @@ static int __init vesafb_probe(struct device *device)
         * region already (FIXME) */
        request_region(0x3c0, 32, "vesafb");
 
+#ifdef CONFIG_MTRR
        if (mtrr) {
                unsigned int temp_size = size_total;
                unsigned int type = 0;
@@ -451,6 +451,7 @@ static int __init vesafb_probe(struct device *device)
                        } while (temp_size >= PAGE_SIZE && rc == -EINVAL);
                }
        }
+#endif
        
        info->fbops = &vesafb_ops;
        info->var = vesafb_defined;
@@ -480,10 +481,11 @@ err:
        return err;
 }
 
-static struct device_driver vesafb_driver = {
-       .name   = "vesafb",
-       .bus    = &platform_bus_type,
+static struct platform_driver vesafb_driver = {
        .probe  = vesafb_probe,
+       .driver = {
+               .name   = "vesafb",
+       },
 };
 
 static struct platform_device vesafb_device = {
@@ -498,12 +500,12 @@ static int __init vesafb_init(void)
        /* ignore error return of fb_get_options */
        fb_get_options("vesafb", &option);
        vesafb_setup(option);
-       ret = driver_register(&vesafb_driver);
+       ret = platform_driver_register(&vesafb_driver);
 
        if (!ret) {
                ret = platform_device_register(&vesafb_device);
                if (ret)
-                       driver_unregister(&vesafb_driver);
+                       platform_driver_unregister(&vesafb_driver);
        }
        return ret;
 }
index 8794dc5d24667527fdd838481bd5f18f4b3482eb..ffa1ad474226c5e121486ba8c0f4f87c8bc91f70 100644 (file)
@@ -403,9 +403,8 @@ static void vfb_platform_release(struct device *device)
        // This is called when the reference count goes to zero.
 }
 
-static int __init vfb_probe(struct device *device)
+static int __init vfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct fb_info *info;
        int retval = -ENOMEM;
 
@@ -447,7 +446,7 @@ static int __init vfb_probe(struct device *device)
        retval = register_framebuffer(info);
        if (retval < 0)
                goto err2;
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO
               "fb%d: Virtual frame buffer device, using %ldK of video memory\n",
@@ -462,9 +461,9 @@ err:
        return retval;
 }
 
-static int vfb_remove(struct device *device)
+static int vfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                unregister_framebuffer(info);
@@ -474,11 +473,12 @@ static int vfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver vfb_driver = {
-       .name   = "vfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver vfb_driver = {
        .probe  = vfb_probe,
        .remove = vfb_remove,
+       .driver = {
+               .name   = "vfb",
+       },
 };
 
 static struct platform_device vfb_device = {
@@ -504,12 +504,12 @@ static int __init vfb_init(void)
        if (!vfb_enable)
                return -ENXIO;
 
-       ret = driver_register(&vfb_driver);
+       ret = platform_driver_register(&vfb_driver);
 
        if (!ret) {
                ret = platform_device_register(&vfb_device);
                if (ret)
-                       driver_unregister(&vfb_driver);
+                       platform_driver_unregister(&vfb_driver);
        }
        return ret;
 }
@@ -520,7 +520,7 @@ module_init(vfb_init);
 static void __exit vfb_exit(void)
 {
        platform_device_unregister(&vfb_device);
-       driver_unregister(&vfb_driver);
+       platform_driver_unregister(&vfb_driver);
 }
 
 module_exit(vfb_exit);
index 48e70f153c4b23857aea147451418547c431f87f..f6e24ee85f077db2e0f6d3021aef12a652f6e383 100644 (file)
@@ -437,9 +437,9 @@ static void w100fb_restore_vidmem(struct w100fb_par *par)
        }
 }
 
-static int w100fb_suspend(struct device *dev, pm_message_t state)
+static int w100fb_suspend(struct platform_device *dev, pm_message_t state)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct w100fb_par *par=info->par;
        struct w100_tg_info *tg = par->mach->tg;
 
@@ -452,9 +452,9 @@ static int w100fb_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int w100fb_resume(struct device *dev)
+static int w100fb_resume(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(dev);
        struct w100fb_par *par=info->par;
        struct w100_tg_info *tg = par->mach->tg;
 
@@ -473,13 +473,12 @@ static int w100fb_resume(struct device *dev)
 #endif
 
 
-int __init w100fb_probe(struct device *dev)
+int __init w100fb_probe(struct platform_device *pdev)
 {
        int err = -EIO;
        struct w100fb_mach_info *inf;
        struct fb_info *info = NULL;
        struct w100fb_par *par;
-       struct platform_device *pdev = to_platform_device(dev);
        struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        unsigned int chip_id;
 
@@ -515,16 +514,16 @@ int __init w100fb_probe(struct device *dev)
        if (remapped_fbuf == NULL)
                goto out;
 
-       info=framebuffer_alloc(sizeof(struct w100fb_par), dev);
+       info=framebuffer_alloc(sizeof(struct w100fb_par), &pdev->dev);
        if (!info) {
                err = -ENOMEM;
                goto out;
        }
 
        par = info->par;
-       dev_set_drvdata(dev, info);
+       platform_set_drvdata(pdev, info);
 
-       inf = dev->platform_data;
+       inf = pdev->dev.platform_data;
        par->chip_id = chip_id;
        par->mach = inf;
        par->fastpll_mode = 0;
@@ -600,10 +599,10 @@ int __init w100fb_probe(struct device *dev)
                goto out;
        }
 
-       device_create_file(dev, &dev_attr_fastpllclk);
-       device_create_file(dev, &dev_attr_reg_read);
-       device_create_file(dev, &dev_attr_reg_write);
-       device_create_file(dev, &dev_attr_flip);
+       device_create_file(&pdev->dev, &dev_attr_fastpllclk);
+       device_create_file(&pdev->dev, &dev_attr_reg_read);
+       device_create_file(&pdev->dev, &dev_attr_reg_write);
+       device_create_file(&pdev->dev, &dev_attr_flip);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, info->fix.id);
        return 0;
@@ -622,15 +621,15 @@ out:
 }
 
 
-static int w100fb_remove(struct device *dev)
+static int w100fb_remove(struct platform_device *pdev)
 {
-       struct fb_info *info = dev_get_drvdata(dev);
+       struct fb_info *info = platform_get_drvdata(pdev);
        struct w100fb_par *par=info->par;
 
-       device_remove_file(dev, &dev_attr_fastpllclk);
-       device_remove_file(dev, &dev_attr_reg_read);
-       device_remove_file(dev, &dev_attr_reg_write);
-       device_remove_file(dev, &dev_attr_flip);
+       device_remove_file(&pdev->dev, &dev_attr_fastpllclk);
+       device_remove_file(&pdev->dev, &dev_attr_reg_read);
+       device_remove_file(&pdev->dev, &dev_attr_reg_write);
+       device_remove_file(&pdev->dev, &dev_attr_flip);
 
        unregister_framebuffer(info);
 
@@ -1448,23 +1447,24 @@ static void w100_vsync(void)
        writel(0x00000002, remapped_regs + mmGEN_INT_STATUS);
 }
 
-static struct device_driver w100fb_driver = {
-       .name           = "w100fb",
-       .bus            = &platform_bus_type,
+static struct platform_driver w100fb_driver = {
        .probe          = w100fb_probe,
        .remove         = w100fb_remove,
        .suspend        = w100fb_suspend,
        .resume         = w100fb_resume,
+       .driver         = {
+               .name   = "w100fb",
+       },
 };
 
 int __devinit w100fb_init(void)
 {
-       return driver_register(&w100fb_driver);
+       return platform_driver_register(&w100fb_driver);
 }
 
 void __exit w100fb_cleanup(void)
 {
-       driver_unregister(&w100fb_driver);
+       platform_driver_unregister(&w100fb_driver);
 }
 
 module_init(w100fb_init);
index 7d6ae369ce4404600489c238908087774bb424d1..d5255e627b5fa3ec42c54a514fa280c348435cb2 100644 (file)
@@ -1601,9 +1601,10 @@ config CIFS
          PC operating systems.  The CIFS protocol is fully supported by 
          file servers such as Windows 2000 (including Windows 2003, NT 4  
          and Windows XP) as well by Samba (which provides excellent CIFS
-         server support for Linux and many other operating systems). Currently
-         you must use the smbfs client filesystem to access older SMB servers
-         such as Windows 9x and OS/2.
+         server support for Linux and many other operating systems). Limited
+         support for Windows ME and similar servers is provided as well. 
+         You must use the smbfs client filesystem to access older SMB servers
+         such as OS/2 and DOS.
 
          The intent of the cifs module is to provide an advanced
          network file system client for mounting to CIFS compliant servers, 
@@ -1614,7 +1615,7 @@ config CIFS
          cifs if running only a (Samba) server. It is possible to enable both
          smbfs and cifs (e.g. if you are using CIFS for accessing Windows 2003
          and Samba 3 servers, and smbfs for accessing old servers). If you need 
-         to mount to Samba or Windows 2003 servers from this machine, say Y.
+         to mount to Samba or Windows from this machine, say Y.
 
 config CIFS_STATS
         bool "CIFS statistics"
@@ -1623,8 +1624,22 @@ config CIFS_STATS
           Enabling this option will cause statistics for each server share
          mounted by the cifs client to be displayed in /proc/fs/cifs/Stats
 
+config CIFS_STATS2
+       bool "CIFS extended statistics"
+       depends on CIFS_STATS
+       help
+         Enabling this option will allow more detailed statistics on SMB
+         request timing to be displayed in /proc/fs/cifs/DebugData and also
+         allow optional logging of slow responses to dmesg (depending on the
+         value of /proc/fs/cifs/cifsFYI, see fs/cifs/README for more details).
+         These additional statistics may have a minor effect on performance
+         and memory utilization.
+
+         Unless you are a developer or are doing network performance analysis
+         or tuning, say N.
+
 config CIFS_XATTR
-        bool "CIFS extended attributes (EXPERIMENTAL)"
+        bool "CIFS extended attributes"
         depends on CIFS
         help
           Extended attributes are name:value pairs associated with inodes by
@@ -1636,11 +1651,11 @@ config CIFS_XATTR
           prefaced by the user namespace prefix. The system namespace
           (used by some filesystems to store ACLs) is not supported at
           this time.
-                                                                                                    
+
           If unsure, say N.
 
 config CIFS_POSIX
-        bool "CIFS POSIX Extensions (EXPERIMENTAL)"
+        bool "CIFS POSIX Extensions"
         depends on CIFS_XATTR
         help
           Enabling this option will cause the cifs client to attempt to
@@ -1653,10 +1668,28 @@ config CIFS_POSIX
 
 config CIFS_EXPERIMENTAL
          bool "CIFS Experimental Features (EXPERIMENTAL)"
-         depends on CIFS
+         depends on CIFS && EXPERIMENTAL
+         help
+           Enables cifs features under testing. These features are
+           experimental and currently include support for writepages
+           (multipage writebehind performance improvements) and directory
+           change notification ie fcntl(F_DNOTIFY) as well as some security
+           improvements.  Some also depend on setting at runtime the
+           pseudo-file /proc/fs/cifs/Experimental (which is disabled by
+           default). See the file fs/cifs/README for more details.
+
+           If unsure, say N.
+
+config CIFS_UPCALL
+         bool "CIFS Kerberos/SPNEGO advanced session setup (EXPERIMENTAL)"
+         depends on CIFS_EXPERIMENTAL
+         select CONNECTOR
          help
-           Enables cifs features under testing. These features
-           are highly experimental.  If unsure, say N.
+           Enables an upcall mechanism for CIFS which will be used to contact
+           userspace helper utilities to provide SPNEGO packaged Kerberos
+           tickets which are needed to mount to certain secure servers
+           (for which more secure Kerberos authentication is required). If
+           unsure, say N.
 
 config NCP_FS
        tristate "NCP file system support (to mount NetWare volumes)"
index 2fd62f89ae0175d65381b55418fbb21012995348..9cb206e9d4be138a17f10c35e8d4323b0bc514bd 100644 (file)
@@ -19,6 +19,7 @@
 #include "server.h"
 #include "vnode.h"
 #include "internal.h"
+#include "cmservice.h"
 
 /*****************************************************************************/
 /*
index 20bb919eb1958e6e4dbbf96f6f04812a23983a24..5a28b69ad223b243121c8eb65495f9a519891d33 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -457,6 +457,8 @@ static inline struct kiocb *aio_get_req(struct kioctx *ctx)
 
 static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
 {
+       assert_spin_locked(&ctx->ctx_lock);
+
        if (req->ki_dtor)
                req->ki_dtor(req);
        kmem_cache_free(kiocb_cachep, req);
@@ -498,6 +500,8 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
        dprintk(KERN_DEBUG "aio_put(%p): f_count=%d\n",
                req, atomic_read(&req->ki_filp->f_count));
 
+       assert_spin_locked(&ctx->ctx_lock);
+
        req->ki_users --;
        if (unlikely(req->ki_users < 0))
                BUG();
@@ -619,14 +623,13 @@ static void unuse_mm(struct mm_struct *mm)
  * the kiocb (to tell the caller to activate the work
  * queue to process it), or 0, if it found that it was
  * already queued.
- *
- * Should be called with the spin lock iocb->ki_ctx->ctx_lock
- * held
  */
 static inline int __queue_kicked_iocb(struct kiocb *iocb)
 {
        struct kioctx *ctx = iocb->ki_ctx;
 
+       assert_spin_locked(&ctx->ctx_lock);
+
        if (list_empty(&iocb->ki_run_list)) {
                list_add_tail(&iocb->ki_run_list,
                        &ctx->run_list);
@@ -771,13 +774,15 @@ out:
  *     Process all pending retries queued on the ioctx
  *     run list.
  * Assumes it is operating within the aio issuer's mm
- * context. Expects to be called with ctx->ctx_lock held
+ * context.
  */
 static int __aio_run_iocbs(struct kioctx *ctx)
 {
        struct kiocb *iocb;
        LIST_HEAD(run_list);
 
+       assert_spin_locked(&ctx->ctx_lock);
+
        list_splice_init(&ctx->run_list, &run_list);
        while (!list_empty(&run_list)) {
                iocb = list_entry(run_list.next, struct kiocb,
@@ -937,28 +942,19 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2)
        unsigned long   tail;
        int             ret;
 
-       /* Special case handling for sync iocbs: events go directly
-        * into the iocb for fast handling.  Note that this will not 
-        * work if we allow sync kiocbs to be cancelled. in which
-        * case the usage count checks will have to move under ctx_lock
-        * for all cases.
+       /*
+        * Special case handling for sync iocbs:
+        *  - events go directly into the iocb for fast handling
+        *  - the sync task with the iocb in its stack holds the single iocb
+        *    ref, no other paths have a way to get another ref
+        *  - the sync task helpfully left a reference to itself in the iocb
         */
        if (is_sync_kiocb(iocb)) {
-               int ret;
-
+               BUG_ON(iocb->ki_users != 1);
                iocb->ki_user_data = res;
-               if (iocb->ki_users == 1) {
-                       iocb->ki_users = 0;
-                       ret = 1;
-               } else {
-                       spin_lock_irq(&ctx->ctx_lock);
-                       iocb->ki_users--;
-                       ret = (0 == iocb->ki_users);
-                       spin_unlock_irq(&ctx->ctx_lock);
-               }
-               /* sync iocbs put the task here for us */
+               iocb->ki_users = 0;
                wake_up_process(iocb->ki_obj.tsk);
-               return ret;
+               return 1;
        }
 
        info = &ctx->ring_info;
@@ -1613,12 +1609,14 @@ asmlinkage long sys_io_submit(aio_context_t ctx_id, long nr,
 
 /* lookup_kiocb
  *     Finds a given iocb for cancellation.
- *     MUST be called with ctx->ctx_lock held.
  */
 static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb,
                                  u32 key)
 {
        struct list_head *pos;
+
+       assert_spin_locked(&ctx->ctx_lock);
+
        /* TODO: use a hash or array, this sucks. */
        list_for_each(pos, &ctx->active_reqs) {
                struct kiocb *kiocb = list_kiocb(pos);
diff --git a/fs/befs/attribute.c b/fs/befs/attribute.c
deleted file mode 100644 (file)
index e329d72..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * linux/fs/befs/attribute.c
- *
- * Copyright (C) 2002 Will Dyson <will_dyson@pobox.com>
- *
- * Many thanks to Dominic Giampaolo, author of "Practical File System
- * Design with the Be File System", for such a helpful book.
- *
- */
-
-#include <linux/fs.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-
-#include "befs.h"
-#include "endian.h"
-
-#define SD_DATA(sd)\
-       (void*)((char*)sd + sizeof(*sd) + (sd->name_size - sizeof(sd->name)))
-
-#define SD_NEXT(sd)\
-       (befs_small_data*)((char*)sd + sizeof(*sd) + (sd->name_size - \
-       sizeof(sd->name) + sd->data_size))
-
-int
-list_small_data(struct super_block *sb, befs_inode * inode, filldir_t filldir);
-
-befs_small_data *
-find_small_data(struct super_block *sb, befs_inode * inode,
-                                const char *name);
-int
-read_small_data(struct super_block *sb, befs_inode * inode,
-                befs_small_data * sdata, void *buf, size_t bufsize);
-
-/**
- *
- *
- *
- *
- *
- */
-befs_small_data *
-find_small_data(struct super_block *sb, befs_inode * inode, const char *name)
-{
-       befs_small_data *sdata = inode->small_data;
-
-       while (sdata->type != 0) {
-               if (strcmp(name, sdata->name) != 0) {
-                       return sdata;
-               }
-               sdata = SD_NEXT(sdata);
-       }
-       return NULL;
-}
-
-/**
- *
- *
- *
- *
- *
- */
-int
-read_small_data(struct super_block *sb, befs_inode * inode,
-               const char *name, void *buf, size_t bufsize)
-{
-       befs_small_data *sdata;
-
-       sdata = find_small_data(sb, inode, name);
-       if (sdata == NULL)
-               return BEFS_ERR;
-       else if (sdata->data_size > bufsize)
-               return BEFS_ERR;
-
-       memcpy(buf, SD_DATA(sdata), sdata->data_size);
-
-       return BEFS_OK;
-}
-
-/**
- *
- *
- *
- *
- *
- */
-int
-list_small_data(struct super_block *sb, befs_inode * inode)
-{
-
-}
-
-/**
- *
- *
- *
- *
- *
- */
-int
-list_attr(struct super_block *sb, befs_inode * inode)
-{
-
-}
-
-/**
- *
- *
- *
- *
- *
- */
-int
-read_attr(struct super_block *sb, befs_inode * inode)
-{
-
-}
index 5bab24f59053f0960c9aba5e8529c17618a6eea8..eab3750cf3048507a8785958139c00e512e1b76c 100644 (file)
@@ -2,7 +2,7 @@ Version 1.39
 ------------
 Defer close of a file handle slightly if pending writes depend on that file handle
 (this reduces the EBADF bad file handle errors that can be logged under heavy
-stress on writes).
+stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 
 
 Version 1.38
 ------------
index 99a096d3f84d679d668807d5081baf4beeabc95f..4e12053f0806bed870906a3280d428ad8a9d9186 100644 (file)
@@ -74,10 +74,11 @@ cifs_strtoUCS(wchar_t * to, const char *from, int len,
                        cERROR(1,
                               ("cifs_strtoUCS: char2uni returned %d",
                                charlen));
-                       to[i] = cpu_to_le16(0x003f);    /* a question mark */
+                       /* A question mark */
+                       to[i] = (wchar_t)cpu_to_le16(0x003f);
                        charlen = 1;
                } else 
-                       to[i] = cpu_to_le16(to[i]);
+                       to[i] = (wchar_t)cpu_to_le16(to[i]);
 
        }
 
index 877095a1192ad8e13b7bffe6e041ab578346ec46..682b0235ad9a170df904563eea37d9a132291ce2 100644 (file)
@@ -405,6 +405,7 @@ static struct quotactl_ops cifs_quotactl_ops = {
 };
 #endif
 
+#ifdef CONFIG_CIFS_EXPERIMENTAL
 static void cifs_umount_begin(struct super_block * sblock)
 {
        struct cifs_sb_info *cifs_sb;
@@ -422,16 +423,18 @@ static void cifs_umount_begin(struct super_block * sblock)
                tcon->tidStatus = CifsExiting;
        up(&tcon->tconSem);
 
+       /* cancel_brl_requests(tcon); */
+       /* cancel_notify_requests(tcon); */
        if(tcon->ses && tcon->ses->server)
        {
-               cERROR(1,("wake up tasks now - umount begin not complete"));
+               cFYI(1,("wake up tasks now - umount begin not complete"));
                wake_up_all(&tcon->ses->server->request_q);
        }
 /* BB FIXME - finish add checks for tidStatus BB */
 
        return;
 }
-       
+#endif 
 
 static int cifs_remount(struct super_block *sb, int *flags, char *data)
 {
@@ -450,7 +453,9 @@ struct super_operations cifs_super_ops = {
    unless later we add lazy close of inodes or unless the kernel forgets to call
    us with the same number of releases (closes) as opens */
        .show_options = cifs_show_options,
-/*     .umount_begin   = cifs_umount_begin, */ /* BB finish in the future */
+#ifdef CONFIG_CIFS_EXPERIMENTAL
+       .umount_begin   = cifs_umount_begin,
+#endif
        .remount_fs = cifs_remount,
 };
 
index d301149b1bb0f808fc519e5f66faf45a935ea121..1b73f4f4c5ce6d1cb88e95e53fa8420fe1382957 100644 (file)
@@ -242,11 +242,11 @@ extern int CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
                        const int netfid, const unsigned int count,
                        const __u64 offset, unsigned int *nbytes, 
                        struct kvec *iov, const int nvec, const int long_op);
+#endif /* CONFIG_CIFS_EXPERIMENTAL */
 extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
                        const unsigned char *searchName, __u64 * inode_number,
                        const struct nls_table *nls_codepage, 
                        int remap_special_chars);
-#endif /* CONFIG_CIFS_EXPERIMENTAL */
 extern int cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
                        const struct nls_table * codepage);
 extern int cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
index 9312bfc5668202218f59efda0028f92ac5761f40..a53c596e1082fe3c90bc6e93c4736b120ef9d277 100644 (file)
@@ -2959,7 +2959,6 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle
        return rc;
 }
 
-#ifdef CONFIG_CIFS_EXPERIMENTAL
 int
 CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
                 const unsigned char *searchName,
@@ -3053,7 +3052,6 @@ GetInodeNumOut:
                goto GetInodeNumberRetry;
        return rc;
 }
-#endif /* CIFS_EXPERIMENTAL */
 
 int
 CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
diff --git a/fs/cifs/cn_cifs.h b/fs/cifs/cn_cifs.h
new file mode 100644 (file)
index 0000000..ea59cca
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *   fs/cifs/cn_cifs.h
+ *
+ *   Copyright (c) International Business Machines  Corp., 2002
+ *   Author(s): Steve French (sfrench@us.ibm.com)
+ *
+ *   This library is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU Lesser General Public License as published
+ *   by the Free Software Foundation; either version 2.1 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This library is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU Lesser General Public License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with this library; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _CN_CIFS_H
+#define _CN_CIFS_H
+#ifdef CONFIG_CIFS_UPCALL
+#include <linux/types.h>
+#include <linux/connector.h>
+
+struct cifs_upcall {
+       char signature[4]; /* CIFS */
+       enum command {
+               CIFS_GET_IP = 0x00000001,   /* get ip address for hostname */
+               CIFS_GET_SECBLOB = 0x00000002, /* get SPNEGO wrapped blob */
+       } command;
+       /* union cifs upcall data follows */
+};
+#endif /* CIFS_UPCALL */
+#endif /* _CN_CIFS_H */
index 450ab75d654623d492c6969fc312bd041083fa2a..2cb620716bc14661295a8c4fe6782d0e9ac99f62 100644 (file)
@@ -42,6 +42,7 @@
 #include "ntlmssp.h"
 #include "nterr.h"
 #include "rfc1002pdu.h"
+#include "cn_cifs.h"
 
 #define CIFS_PORT 445
 #define RFC1001_PORT 139
index 912d401600f6e2f7abce605c63e115372b9ecdaa..923d071163b2769f86e4a5b47d2e77878d13a072 100644 (file)
@@ -283,7 +283,6 @@ int cifs_get_inode_info(struct inode **pinode,
                           there Windows server or network appliances for which
                           IndexNumber field is not guaranteed unique? */
 
-#ifdef CONFIG_CIFS_EXPERIMENTAL                
                        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
                                int rc1 = 0;
                                __u64 inode_num;
@@ -299,7 +298,6 @@ int cifs_get_inode_info(struct inode **pinode,
                                } else /* do we need cast or hash to ino? */
                                        (*pinode)->i_ino = inode_num;
                        } /* else ino incremented to unique num in new_inode*/
-#endif /* CIFS_EXPERIMENTAL */
                        insert_inode_hash(*pinode);
                }
                inode = *pinode;
index 26300fccb4fc6a824eb70f8622e04123fc8e2b18..991c00de5c4e8aa7f429abcc7566c4982d4d5c32 100644 (file)
@@ -49,6 +49,8 @@
 #include <linux/vt_kern.h>
 #include <linux/fb.h>
 #include <linux/ext2_fs.h>
+#include <linux/ext3_jbd.h>
+#include <linux/ext3_fs.h>
 #include <linux/videodev.h>
 #include <linux/netdevice.h>
 #include <linux/raw.h>
 
 #include <linux/hiddev.h>
 
+#include <linux/dvb/audio.h>
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/video.h>
+
 #undef INCLUDES
 #endif
 
 /* Aiee. Someone does not find a difference between int and long */
 #define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
 #define EXT2_IOC32_SETFLAGS               _IOW('f', 2, int)
+#define EXT3_IOC32_GETVERSION             _IOR('f', 3, int)
+#define EXT3_IOC32_SETVERSION             _IOR('f', 4, int)
+#define EXT3_IOC32_GETRSVSZ               _IOR('f', 5, int)
+#define EXT3_IOC32_SETRSVSZ               _IOW('f', 6, int)
+#define EXT3_IOC32_GROUP_EXTEND           _IOW('f', 7, unsigned int)
+#ifdef CONFIG_JBD_DEBUG
+#define EXT3_IOC32_WAIT_FOR_READONLY      _IOR('f', 99, int)
+#endif
+
 #define EXT2_IOC32_GETVERSION             _IOR('v', 1, int)
 #define EXT2_IOC32_SETVERSION             _IOW('v', 2, int)
 
@@ -175,6 +191,22 @@ static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
        return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg));
 }
 
+static int do_ext3_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+       /* These are just misnamed, they actually get/put from/to user an int */
+       switch (cmd) {
+       case EXT3_IOC32_GETVERSION: cmd = EXT3_IOC_GETVERSION; break;
+       case EXT3_IOC32_SETVERSION: cmd = EXT3_IOC_SETVERSION; break;
+       case EXT3_IOC32_GETRSVSZ: cmd = EXT3_IOC_GETRSVSZ; break;
+       case EXT3_IOC32_SETRSVSZ: cmd = EXT3_IOC_SETRSVSZ; break;
+       case EXT3_IOC32_GROUP_EXTEND: cmd = EXT3_IOC_GROUP_EXTEND; break;
+#ifdef CONFIG_JBD_DEBUG
+       case EXT3_IOC32_WAIT_FOR_READONLY: cmd = EXT3_IOC_WAIT_FOR_READONLY; break;
+#endif
+       }
+       return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg));
+}
+
 struct video_tuner32 {
        compat_int_t tuner;
        char name[32];
@@ -413,6 +445,128 @@ out:
        return err;
 }
 
+struct compat_dmx_event {
+       dmx_event_t     event;
+       compat_time_t   timeStamp;
+       union
+       {
+               dmx_scrambling_status_t scrambling;
+       } u;
+};
+
+static int do_dmx_get_event(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+       struct dmx_event kevent;
+       mm_segment_t old_fs = get_fs();
+       int err;
+
+       set_fs(KERNEL_DS);
+       err = sys_ioctl(fd, cmd, (unsigned long) &kevent);
+       set_fs(old_fs);
+
+       if (!err) {
+               struct compat_dmx_event __user *up = compat_ptr(arg);
+
+               err  = put_user(kevent.event, &up->event);
+               err |= put_user(kevent.timeStamp, &up->timeStamp);
+               err |= put_user(kevent.u.scrambling, &up->u.scrambling);
+               if (err)
+                       err = -EFAULT;
+       }
+
+       return err;
+}
+
+struct compat_video_event {
+       int32_t         type;
+       compat_time_t   timestamp;
+       union {
+               video_size_t size;
+               unsigned int frame_rate;
+       } u;
+};
+
+static int do_video_get_event(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+       struct video_event kevent;
+       mm_segment_t old_fs = get_fs();
+       int err;
+
+       set_fs(KERNEL_DS);
+       err = sys_ioctl(fd, cmd, (unsigned long) &kevent);
+       set_fs(old_fs);
+
+       if (!err) {
+               struct compat_video_event __user *up = compat_ptr(arg);
+
+               err  = put_user(kevent.type, &up->type);
+               err |= put_user(kevent.timestamp, &up->timestamp);
+               err |= put_user(kevent.u.size.w, &up->u.size.w);
+               err |= put_user(kevent.u.size.h, &up->u.size.h);
+               err |= put_user(kevent.u.size.aspect_ratio,
+                               &up->u.size.aspect_ratio);
+               if (err)
+                       err = -EFAULT;
+       }
+
+       return err;
+}
+
+struct compat_video_still_picture {
+        compat_uptr_t iFrame;
+        int32_t size;
+};
+
+static int do_video_stillpicture(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+       struct compat_video_still_picture __user *up;
+       struct video_still_picture __user *up_native;
+       compat_uptr_t fp;
+       int32_t size;
+       int err;
+
+       up = (struct compat_video_still_picture __user *) arg;
+       err  = get_user(fp, &up->iFrame);
+       err |= get_user(size, &up->size);
+       if (err)
+               return -EFAULT;
+
+       up_native =
+               compat_alloc_user_space(sizeof(struct video_still_picture));
+
+       put_user(compat_ptr(fp), &up_native->iFrame);
+       put_user(size, &up_native->size);
+
+       err = sys_ioctl(fd, cmd, (unsigned long) up_native);
+
+       return err;
+}
+
+struct compat_video_spu_palette {
+       int length;
+       compat_uptr_t palette;
+};
+
+static int do_video_set_spu_palette(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+       struct compat_video_spu_palette __user *up;
+       struct video_spu_palette __user *up_native;
+       compat_uptr_t palp;
+       int length, err;
+
+       up = (struct compat_video_spu_palette __user *) arg;
+       err  = get_user(palp, &up->palette);
+       err |= get_user(length, &up->length);
+
+       up_native = compat_alloc_user_space(sizeof(struct video_spu_palette));
+       put_user(compat_ptr(palp), &up_native->palette);
+       put_user(length, &up_native->length);
+
+       err = sys_ioctl(fd, cmd, (unsigned long) up_native);
+
+       return err;
+}
+
 #ifdef CONFIG_NET
 static int do_siocgstamp(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
@@ -2854,6 +3008,15 @@ HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
 HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
 HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
 HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
+HANDLE_IOCTL(EXT3_IOC32_GETVERSION, do_ext3_ioctl)
+HANDLE_IOCTL(EXT3_IOC32_SETVERSION, do_ext3_ioctl)
+HANDLE_IOCTL(EXT3_IOC32_GETRSVSZ, do_ext3_ioctl)
+HANDLE_IOCTL(EXT3_IOC32_SETRSVSZ, do_ext3_ioctl)
+HANDLE_IOCTL(EXT3_IOC32_GROUP_EXTEND, do_ext3_ioctl)
+COMPATIBLE_IOCTL(EXT3_IOC_GROUP_ADD)
+#ifdef CONFIG_JBD_DEBUG
+HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl)
+#endif
 HANDLE_IOCTL(VIDIOCGTUNER32, do_video_ioctl)
 HANDLE_IOCTL(VIDIOCSTUNER32, do_video_ioctl)
 HANDLE_IOCTL(VIDIOCGWIN32, do_video_ioctl)
@@ -2954,5 +3117,11 @@ HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
 HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
 #endif
 
+/* dvb */
+HANDLE_IOCTL(DMX_GET_EVENT, do_dmx_get_event)
+HANDLE_IOCTL(VIDEO_GET_EVENT, do_video_get_event)
+HANDLE_IOCTL(VIDEO_STILLPICTURE, do_video_stillpicture)
+HANDLE_IOCTL(VIDEO_SET_SPU_PALETTE, do_video_set_spu_palette)
+
 #undef DECLARES
 #endif
index e4ed4b31a4333d47472936bfcc7b061e298e8496..522fa70dd8ea140cca303ea7724d32461a0a5dad 100644 (file)
@@ -881,7 +881,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
        }
        if (EXT2_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL))
                ext2_warning(sb, __FUNCTION__,
-                       "mounting ext3 filesystem as ext2\n");
+                       "mounting ext3 filesystem as ext2");
        ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY);
        percpu_counter_mod(&sbi->s_freeblocks_counter,
                                ext2_count_free_blocks(sb));
index 5d9b00e2883720a8b0e2cc48a72d05a65d696a7b..8824e84f8a56a58b8f0aee6ac99cbc9307038565 100644 (file)
@@ -1384,8 +1384,10 @@ static int ext3_journalled_writepage(struct page *page,
                ClearPageChecked(page);
                ret = block_prepare_write(page, 0, PAGE_CACHE_SIZE,
                                        ext3_get_block);
-               if (ret != 0)
+               if (ret != 0) {
+                       ext3_journal_stop(handle);
                        goto out_unlock;
+               }
                ret = walk_page_buffers(handle, page_buffers(page), 0,
                        PAGE_CACHE_SIZE, NULL, do_journal_get_write_access);
 
index d3f6b2835bc86b78c1fc73238803be149656ce4e..2d71128bd8d6b3503098b25039e30e183cd23ab5 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "vxfs.h"
 #include "vxfs_inode.h"
+#include "vxfs_extern.h"
 
 
 #ifdef DIAGNOSTIC
index 133476201d8438ef5dc43dccf74e6c76ccbcc2b0..76a0708ae9789b018335a4fc4bec6a789eb330f3 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "vxfs.h"
 #include "vxfs_olt.h"
+#include "vxfs_extern.h"
 
 
 static inline void
index d1c1f2b2c9da9796affc6be18b8793489b9f2873..4bf1c6365a19d2ce3d9ae52da457026792528f40 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/kernel.h>
 #include <linux/ioprio.h>
 #include <linux/blkdev.h>
+#include <linux/syscalls.h>
 
 static int set_task_ioprio(struct task_struct *task, int ioprio)
 {
index 053e3a98a276ec1f63d0a7035355d06b94474cdd..6da13b309bd19b533f05b6a74b456f7e0e20c738 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/blkdev.h>
 #include <linux/jffs.h>
 #include "jffs_fm.h"
+#include "intrep.h"
 
 #if defined(JFFS_MARK_OBSOLETE) && JFFS_MARK_OBSOLETE
 static int jffs_mark_obsolete(struct jffs_fmcontrol *fmc, __u32 fm_offset);
index 0e7456ec99fd05a778738da5ab69ec57cd1629a4..3e51dd1da8aa7f271dc1205139d9dc0d658cec52 100644 (file)
@@ -284,9 +284,6 @@ int jffs2_fill_scan_buf (struct jffs2_sb_info *c, void *buf,
                D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%zx bytes\n", ofs, retlen));
                return -EIO;
        }
-       D2(printk(KERN_DEBUG "Read 0x%x bytes from 0x%08x into buf\n", len, ofs));
-       D2(printk(KERN_DEBUG "000: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
-                 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]));
        return 0;
 }
 
index a1e8b2248014c0aa1d7ae8b2766440f753929908..250ef53d25ef8cfce06e333b83a746ef2577aa3d 100644 (file)
@@ -1105,7 +1105,6 @@ static void time_out_leases(struct inode *inode)
                        before = &fl->fl_next;
                        continue;
                }
-               printk(KERN_INFO "lease broken - owner pid = %d\n", fl->fl_pid);
                lease_modify(before, fl->fl_type & ~F_INPROGRESS);
                if (fl == *before)      /* lease_modify may have freed fl */
                        before = &fl->fl_next;
@@ -1430,7 +1429,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
        lock_kernel();
 
        error = __setlease(filp, arg, &flp);
-       if (error)
+       if (error || arg == F_UNLCK)
                goto out_unlock;
 
        error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
index 8a8d4d9db314f9c9d0005a8125c2fc683ba925ff..ec852c11dce48fd1e564e0e9085ca8c0ad04bb02 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "check.h"
+#include "ultrix.h"
 
 int ultrix_partition(struct parsed_partitions *state, struct block_device *bdev)
 {
index d2fa42006d8fe96cbc8fc0413d710c1df9a4255e..9ab97cef0daa001dded3c6d667e95ea4134fc0a7 100644 (file)
@@ -195,7 +195,7 @@ static int show_map_internal(struct seq_file *m, void *v, struct mem_size_stats
 
 static int show_map(struct seq_file *m, void *v)
 {
-       return show_map_internal(m, v, 0);
+       return show_map_internal(m, v, NULL);
 }
 
 static void smaps_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
index 37c1306eb9b774c9d515215a0fc85026f6781c9a..a3ec238fd9e0347bef211170353137fa5250f949 100644 (file)
@@ -19,6 +19,7 @@
 //
 
 #include <linux/kernel.h>
+#include <linux/reiserfs_fs.h>
 #include <asm/types.h>
 #include <asm/bug.h>
 
index 20ac3d95ecd9ae34ab3fcba2c58a5656c72be6d7..36505bb4e8cbb8790e4be3d44b067f44e3ede462 100644 (file)
@@ -177,6 +177,18 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
        return result;
 }
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic64_dec_return(v) atomic64_sub_return(1,(v))
 
index 7d0ab791b16cffd46856f4e1f542c9acd9e2d608..9fc4bcfa1681666126e1b7e8cf5b004324cd70fa 100644 (file)
@@ -19,7 +19,7 @@
  */
 #include <linux/config.h>
 #include <asm/arch/io.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/hardware/clps7111.h>
 
 #undef CLPS7111_BASE
index d33ad6a93749138aafdbefdef416e100a0f2c02e..fdfe0e6848f871e9488330ef3d7bb6973b3d5eca 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include "asm/arch/platform.h"
-#include "asm/arch/hardware.h"
+#include "asm/hardware.h"
 #define UART00_TYPE (volatile unsigned int*)
 #include "asm/arch/uart00.h"
 
index 2fffacf85a0101cf8d41abdd8caf4d19987c6f88..9535764bcc715705263995a201491265202ece0c 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef __ASM_ARCH_UNCOMPRESS_H
 #define __ASM_ARCH_UNCOMPRESS_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 #define LSR    0x14
 #define TEMPTY         0x40
index 238197cfb9d964a378a7e4602ff90d1970d88240..f195542898e082267f155cb718d9717b86ded4a4 100644 (file)
@@ -23,7 +23,7 @@
 #define __ARM_IRQS_H__
 
 /* Use the imx definitions */
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 /*
  *  IMX Interrupt numbers
index d65ab3cd5d5d2d6152dd7f53e717eb4bc4c06a44..8c91674706b1f276e4a08e0f3ba0b73a1a8ef24b 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef __ASM_ARCH_TIMEX_H
 #define __ASM_ARCH_TIMEX_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #define CLOCK_TICK_RATE                (CLK32)
 
 #endif
index 0ec7093f7c3701122f1043de8666fdcf56bf67cf..da6981efdc394057840030d6503bcd34ecfc446a 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <linux/config.h>
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/io.h>
 
 #define hard_smp_processor_id()                                \
index 762cbc76c5017c6d449906ef08abef8e0799ad5a..5b4396de16a0319a4ad80b82767a99461f4d1f16 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef _ASM_ARCH_AUXREG_H
 #define _ASM_ARCH_AUXREG_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 #define l7200aux_reg   *((volatile unsigned int *) (AUX_BASE))
 
index 6f20962df2480a5961158cbe7cae1bfeb835181f..9c4804d13578aa7784c5b1a3d86cff0c5ebb1ce4 100644 (file)
@@ -10,7 +10,7 @@
 #ifndef _ASM_ARCH_GPTIMERS_H
 #define _ASM_ARCH_GPTIMERS_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 /*
  * Layout of L7200 general purpose timer registers
index 1b3885741ac1ca05f83cdbf9a7b8090c7cd11c13..f486b72070eab1b39893264a5730186ca33397f9 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __ASM_ARCH_OMAP_GPIO_H
 #define __ASM_ARCH_OMAP_GPIO_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/arch/irqs.h>
 #include <asm/io.h>
 
index 9779686bdcebbe412f5ece3648ccb552e7f8a6e3..4ffce1d777591ab7e64e2a81951db78fcb768213 100644 (file)
@@ -260,7 +260,7 @@ extern void omap_init_irq(void);
  * The definition of NR_IRQS is in board-specific header file, which is
  * included via hardware.h
  */
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 #ifndef NR_IRQS
 #define NR_IRQS                 IH_BOARD_BASE
index 305bdeb16ab881d550db09aaadd970fae4119484..e79d98ab2ab63ac281ceaa1177862789a63eae8d 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef __ASM_ARCH_OMAP_MCBSP_H
 #define __ASM_ARCH_OMAP_MCBSP_H
 
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 
 #define OMAP730_MCBSP1_BASE    0xfffb1000
 #define OMAP730_MCBSP2_BASE    0xfffb1800
index b43cdd2a3874d7ead25b237d2b1c30d18512bfca..9af415d2944a57ba77b89215668158c143c8cb01 100644 (file)
@@ -7,7 +7,7 @@
 #include <linux/config.h>
 #include <asm/mach-types.h>
 #include <asm/hardware/clock.h>
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/arch/prcm.h>
 
 #ifndef CONFIG_MACH_VOICEBLUE
index 4a1fbcfccc398c96905eafb005a4ef4913cfbd0f..5d8cc1d9cb108e837eeebb0c0c46df077fb58179 100644 (file)
@@ -25,6 +25,8 @@
 /* Default Values */
 #define AKITA_IOEXP_IO_OUT     (AKITA_IOEXP_IR_ON | AKITA_IOEXP_AKIN_PULLUP)
 
+extern struct platform_device akitaioexp_device;
+
 void akita_set_ioexp(struct device *dev, unsigned char bitmask);
 void akita_reset_ioexp(struct device *dev, unsigned char bitmask);
 
index 67879cdb6ef2a21ac9b810293e28bd6ca6b094e4..9ca76dc3a7af8ef39fbb6af750a3882ada9e5231 100644 (file)
@@ -27,5 +27,6 @@
 
 /* macro to get at IO space when running virtually */
 #define IO_ADDRESS(x)          (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)
+#define __io_address(n)                __io(IO_ADDRESS(n))
 
 #endif
index 9f8fcbca0869edfbf06829657c751391d527786b..6f3d0ce0ca1ed24350c0251aa316e11660db4de7 100644 (file)
@@ -36,7 +36,7 @@ static inline void arch_idle(void)
 
 static inline void arch_reset(char mode)
 {
-       unsigned int hdr_ctrl = (IO_ADDRESS(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET);
+       void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET;
        unsigned int val;
 
        /*
index ca3277d1d5ea43ce64befa127c72b40f3d8b4342..729c2ae4b513fbbaa123c4448d10305f924e07d9 100644 (file)
@@ -7,7 +7,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #include <asm/hardware/iomd.h>
 #include <asm/io.h>
 
index 0fc555b4c912a7f5d1f92836e1e87cda6bcd0f88..018a9f0e3986d2d8f2c53f7f33b7ef17cfb86dc2 100644 (file)
 #ifndef __ASSEMBLY__
 
 #ifdef CONFIG_SA1111
-static inline void
-__arch_adjust_zones(int node, unsigned long *size, unsigned long *holes)
-{
-       unsigned int sz = SZ_1M >> PAGE_SHIFT;
-
-       if (node != 0)
-               sz = 0;
-
-       size[1] = size[0] - sz;
-       size[0] = sz;
-}
+void sa1111_adjust_zones(int node, unsigned long *size, unsigned long *holes);
 
 #define arch_adjust_zones(node, size, holes) \
-       __arch_adjust_zones(node, size, holes)
+       sa1111_adjust_zones(node, size, holes)
 
 #define ISA_DMA_THRESHOLD      (PHYS_OFFSET + SZ_1M - 1)
 
index 2885972b0855cafb87e922641560d3fcd9c4c2d8..d586f65c8228ee8bad32aaf945edc47ee727e731 100644 (file)
@@ -12,6 +12,7 @@
 #define __ASM_ARM_ATOMIC_H
 
 #include <linux/config.h>
+#include <linux/compiler.h>
 
 typedef struct { volatile int counter; } atomic_t;
 
@@ -80,6 +81,24 @@ static inline int atomic_sub_return(int i, atomic_t *v)
        return result;
 }
 
+static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+{
+       unsigned long oldval, res;
+
+       do {
+               __asm__ __volatile__("@ atomic_cmpxchg\n"
+               "ldrex  %1, [%2]\n"
+               "mov    %0, #0\n"
+               "teq    %1, %3\n"
+               "strexeq %0, %4, [%2]\n"
+                   : "=&r" (res), "=&r" (oldval)
+                   : "r" (&ptr->counter), "Ir" (old), "r" (new)
+                   : "cc");
+       } while (res);
+
+       return oldval;
+}
+
 static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 {
        unsigned long tmp, tmp2;
@@ -131,6 +150,20 @@ static inline int atomic_sub_return(int i, atomic_t *v)
        return val;
 }
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+
+       return ret;
+}
+
 static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 {
        unsigned long flags;
@@ -142,6 +175,17 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 
 #endif /* __LINUX_ARM_ARCH__ */
 
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int c, old;
+
+       c = atomic_read(v);
+       while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
+               c = old;
+       return c != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_add(i, v)       (void) atomic_add_return(i, v)
 #define atomic_inc(v)          (void) atomic_add_return(1, v)
 #define atomic_sub(i, v)       (void) atomic_sub_return(i, v)
index e007dd990da568318a73765bd68767ad7f705b36..7399d431edfeeb1a4771833ef3c2e20a85e3a1c0 100644 (file)
@@ -19,6 +19,7 @@
 
 #ifdef __KERNEL__
 
+#include <linux/compiler.h>
 #include <asm/system.h>
 
 #define smp_mb__before_clear_bit()     mb()
index 9049f0ddaecf5cfcb10ebc41d020c5449ffc18b4..6685e3fb97b1fe7afece91656f0fb6ede8bbfc83 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <linux/config.h>
 #ifndef __ASSEMBLY__
-#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
 #define DC21285_IO(x)          ((volatile unsigned long *)(ARMCSR_BASE+(x)))
 #else
 #define DC21285_IO(x)          (x)
index 3d4b810d8c3869f2265610266766d29403ef043f..81c59facea3bead1184df5cf0359058eb9a2d366 100644 (file)
@@ -13,6 +13,7 @@
 #ifndef __ASM_ARM_MMU_CONTEXT_H
 #define __ASM_ARM_MMU_CONTEXT_H
 
+#include <linux/compiler.h>
 #include <asm/cacheflush.h>
 #include <asm/proc-fns.h>
 
index 8efa4ebdcacb0c7f358f52a9e4f990e35a25d3d9..5621d61ebc07958e9e7a671def64f410fe26dcb1 100644 (file)
@@ -93,8 +93,6 @@ void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int,
                                       struct pt_regs *),
                     int sig, const char *name);
 
-#include <asm/proc-fns.h>
-
 #define xchg(ptr,x) \
        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
 
@@ -102,6 +100,8 @@ void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int,
 
 extern asmlinkage void __backtrace(void);
 extern asmlinkage void c_backtrace(unsigned long fp, int pmode);
+
+struct mm_struct;
 extern void show_pte(struct mm_struct *mm, unsigned long addr);
 extern void __show_regs(struct pt_regs *);
 
index 8252a4cd860f114557fe731e6dd4e2bf726123a5..7c98557b717ff048003e0d07c6a5e820c9ccf4e6 100644 (file)
@@ -12,6 +12,7 @@
 
 #ifdef __KERNEL__
 
+#include <linux/compiler.h>
 #include <asm/fpstate.h>
 
 #define THREAD_SIZE_ORDER      1
index 4a88235c0e76a4fc41ca372d6df413ba811ded02..a47cadc59686237260877f1874b2c18ff0ed9421 100644 (file)
@@ -62,6 +62,35 @@ static inline int atomic_sub_return(int i, atomic_t *v)
         return val;
 }
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       local_irq_restore(flags);
+
+       return ret != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 {
         unsigned long flags;
index 8c2e78304523c24da5904dc9b3d85d2988383979..683b05a57d88068527bea8d99343c2425503318c 100644 (file)
@@ -123,6 +123,33 @@ static inline int atomic_inc_and_test(volatile atomic_t *v)
        return retval;
 }
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       cris_atomic_save(v, flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       cris_atomic_restore(v, flags);
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       cris_atomic_save(v, flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       cris_atomic_restore(v, flags);
+       return ret != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 /* Atomic operations are already serializing */
 #define smp_mb__before_atomic_dec()    barrier()
 #define smp_mb__after_atomic_dec()     barrier()
index e7596846342879c7bcaa21c1b082a3d3bc07b27b..f6539ff569c5278abece2c6442cbab205dd80311 100644 (file)
@@ -414,4 +414,16 @@ extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new);
 
 #endif
 
+#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #endif /* _ASM_ATOMIC_H */
index 886dbd11689991396238d2cc6bdf9f09374762ff..0b49f9e070f14ac2ac780e0b7e4170d7677ed399 100644 (file)
@@ -13,5 +13,6 @@ extern char _eextratext[] __attribute__((weak));
 extern char _end[];
 extern char __per_cpu_start[], __per_cpu_end[];
 extern char __kprobes_text_start[], __kprobes_text_end[];
+extern char __initdata_begin[], __initdata_end[];
 
 #endif /* _ASM_GENERIC_SECTIONS_H_ */
index 7230f650799501e59044322fd7196f72eddb4400..f23d86819ea82b83fb75bcce32516b78817524e0 100644 (file)
@@ -82,6 +82,33 @@ static __inline__ int atomic_dec_and_test(atomic_t *v)
        return ret == 0;
 }
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       local_irq_restore(flags);
+       return ret != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 static __inline__ void atomic_clear_mask(unsigned long mask, unsigned long *v)
 {
        __asm__ __volatile__("stc ccr,r1l\n\t"
index 509720be772a4121aad122b2ec5fd9cf83a7cdf0..c68557aa04b2b0ef9246086f6d52b156c72966c0 100644 (file)
@@ -215,6 +215,27 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
        return atomic_add_return(-i,v);
 }
 
+#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_inc_return(v)  (atomic_add_return(1,v))
 #define atomic_dec_return(v)  (atomic_sub_return(1,v))
 
index 06ae4d81ba6a6d3421e7a95ca23e1c34dce4668c..a955e57ad016a9ce203d90cce3b1f56ad7dbd2c0 100644 (file)
@@ -19,7 +19,7 @@ static inline void kb_wait(void)
 static inline void mach_reboot(void)
 {
        int i;
-       for (i = 0; i < 100; i++) {
+       for (i = 0; i < 10; i++) {
                kb_wait();
                udelay(50);
                outb(0x60, 0x64);       /* write Controller Command Byte */
index b85393094c832085a5a0487fd49745f176ff261c..f041d4495fafeb1a5fdc44791561415f1b673684 100644 (file)
 #include <mach_apic.h>
 
 #define LAST_DEVICE_VECTOR             232
-#define MSI_DEST_MODE                  MSI_LOGICAL_MODE
-#define MSI_TARGET_CPU_SHIFT           12
-
-#ifdef CONFIG_SMP
-#define MSI_TARGET_CPU         logical_smp_processor_id()
-#else
-#define MSI_TARGET_CPU cpu_to_logical_apicid(first_cpu(cpu_online_map))
-#endif
+#define MSI_TARGET_CPU_SHIFT   12
 
 #endif /* ASM_MSI_H */
index 8c02b0318703b4c9cf8d68e665949215f97455d6..5c96cf6dcb3916f5735cdf6005b2ac7b3755cd4d 100644 (file)
@@ -65,7 +65,9 @@ struct cpuinfo_x86 {
        int     f00f_bug;
        int     coma_bug;
        unsigned long loops_per_jiffy;
-       unsigned char x86_num_cores;
+       unsigned char x86_max_cores;    /* cpuid returned max cores value */
+       unsigned char booted_cores;     /* number of cores as seen by OS */
+       unsigned char apicid;
 } __attribute__((__aligned__(SMP_CACHE_BYTES)));
 
 #define X86_VENDOR_INTEL 0
index cbb47d34aa31402f1f102183635fc5b31eff66c8..76524b4052ac02b071bb40889728c97af91cea41 100644 (file)
@@ -159,14 +159,37 @@ typedef struct sigaltstack {
 
 #define __HAVE_ARCH_SIG_BITOPS
 
-static __inline__ void sigaddset(sigset_t *set, int _sig)
+#define sigaddset(set,sig)                 \
+       (__builtin_constant_p(sig) ?       \
+       __const_sigaddset((set),(sig)) :   \
+       __gen_sigaddset((set),(sig)))
+
+static __inline__ void __gen_sigaddset(sigset_t *set, int _sig)
 {
-       __asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
+       __asm__("btsl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
 }
 
-static __inline__ void sigdelset(sigset_t *set, int _sig)
+static __inline__ void __const_sigaddset(sigset_t *set, int _sig)
 {
-       __asm__("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
+       unsigned long sig = _sig - 1;
+       set->sig[sig / _NSIG_BPW] |= 1 << (sig % _NSIG_BPW);
+}
+
+#define sigdelset(set,sig)                 \
+       (__builtin_constant_p(sig) ?       \
+       __const_sigdelset((set),(sig)) :   \
+       __gen_sigdelset((set),(sig)))
+
+
+static __inline__ void __gen_sigdelset(sigset_t *set, int _sig)
+{
+       __asm__("btrl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
+}
+
+static __inline__ void __const_sigdelset(sigset_t *set, int _sig)
+{
+       unsigned long sig = _sig - 1;
+       set->sig[sig / _NSIG_BPW] &= ~(1 << (sig % _NSIG_BPW));
 }
 
 static __inline__ int __const_sigismember(sigset_t *set, int _sig)
index 13250199976d581901aeb87d216150d721492e9b..61d3ab9db70cd7c9559907e5c0106962b110ede6 100644 (file)
@@ -45,6 +45,8 @@ extern void unlock_ipi_call_lock(void);
 #define MAX_APICID 256
 extern u8 x86_cpu_to_apicid[];
 
+#define cpu_physical_id(cpu)   x86_cpu_to_apicid[cpu]
+
 #ifdef CONFIG_HOTPLUG_CPU
 extern void cpu_exit_clear(void);
 extern void cpu_uninit(void);
@@ -92,6 +94,10 @@ extern int __cpu_disable(void);
 extern void __cpu_die(unsigned int cpu);
 #endif /* !__ASSEMBLY__ */
 
+#else /* CONFIG_SMP */
+
+#define cpu_physical_id(cpu)           boot_cpu_physical_apicid
+
 #define NO_PROC_ID             0xFF            /* No processor magic marker */
 
 #endif
index 97d52ac49e46626eac3018e388695147525c476b..772f85da1206af441de3d5df59892921931a8b51 100644 (file)
@@ -263,6 +263,10 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
 
 #ifdef CONFIG_X86_CMPXCHG
 #define __HAVE_ARCH_CMPXCHG 1
+#define cmpxchg(ptr,o,n)\
+       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
+                                       (unsigned long)(n),sizeof(*(ptr))))
+#endif
 
 static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
                                      unsigned long new, int size)
@@ -291,10 +295,42 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
        return old;
 }
 
-#define cmpxchg(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-                                       (unsigned long)(n),sizeof(*(ptr))))
+#ifndef CONFIG_X86_CMPXCHG
+/*
+ * Building a kernel capable running on 80386. It may be necessary to
+ * simulate the cmpxchg on the 80386 CPU. For that purpose we define
+ * a function for each of the sizes we support.
+ */
 
+extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8);
+extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16);
+extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32);
+
+static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old,
+                                     unsigned long new, int size)
+{
+       switch (size) {
+       case 1:
+               return cmpxchg_386_u8(ptr, old, new);
+       case 2:
+               return cmpxchg_386_u16(ptr, old, new);
+       case 4:
+               return cmpxchg_386_u32(ptr, old, new);
+       }
+       return old;
+}
+
+#define cmpxchg(ptr,o,n)                                               \
+({                                                                     \
+       __typeof__(*(ptr)) __ret;                                       \
+       if (likely(boot_cpu_data.x86 > 3))                              \
+               __ret = __cmpxchg((ptr), (unsigned long)(o),            \
+                                       (unsigned long)(n), sizeof(*(ptr))); \
+       else                                                            \
+               __ret = cmpxchg_386((ptr), (unsigned long)(o),          \
+                                       (unsigned long)(n), sizeof(*(ptr))); \
+       __ret;                                                          \
+})
 #endif
 
 #ifdef CONFIG_X86_CMPXCHG64
index 874a6f890e75c14fc2677c1b29252ef60b662234..2fbebf85c31d55a1b1ac8b5f7d69a62f5c554860 100644 (file)
@@ -88,6 +88,18 @@ ia64_atomic64_sub (__s64 i, atomic64_t *v)
        return new;
 }
 
+#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_add_return(i,v)                                         \
 ({                                                                     \
        int __ia64_aar_i = (i);                                         \
index 4d376e1663f7abec6f3a72310fbf7ede35be948f..8b01a083dde6f94dd391e042ccc641212fcf06a4 100644 (file)
@@ -22,6 +22,9 @@
  * 2005-Apr     Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
  *              <anil.s.keshavamurthy@intel.com> adopted from
  *              include/asm-x86_64/kdebug.h
+ *
+ * 2005-Oct    Keith Owens <kaos@sgi.com>.  Expand notify_die to cover more
+ *             events.
  */
 #include <linux/notifier.h>
 
@@ -35,13 +38,36 @@ struct die_args {
        int signr;
 };
 
-int register_die_notifier(struct notifier_block *nb);
+extern int register_die_notifier(struct notifier_block *);
+extern int unregister_die_notifier(struct notifier_block *);
 extern struct notifier_block *ia64die_chain;
 
 enum die_val {
        DIE_BREAK = 1,
-       DIE_SS,
+       DIE_FAULT,
+       DIE_OOPS,
        DIE_PAGE_FAULT,
+       DIE_MACHINE_HALT,
+       DIE_MACHINE_RESTART,
+       DIE_MCA_MONARCH_ENTER,
+       DIE_MCA_MONARCH_PROCESS,
+       DIE_MCA_MONARCH_LEAVE,
+       DIE_MCA_SLAVE_ENTER,
+       DIE_MCA_SLAVE_PROCESS,
+       DIE_MCA_SLAVE_LEAVE,
+       DIE_MCA_RENDZVOUS_ENTER,
+       DIE_MCA_RENDZVOUS_PROCESS,
+       DIE_MCA_RENDZVOUS_LEAVE,
+       DIE_INIT_MONARCH_ENTER,
+       DIE_INIT_MONARCH_PROCESS,
+       DIE_INIT_MONARCH_LEAVE,
+       DIE_INIT_SLAVE_ENTER,
+       DIE_INIT_SLAVE_PROCESS,
+       DIE_INIT_SLAVE_LEAVE,
+       DIE_KDEBUG_ENTER,
+       DIE_KDEBUG_LEAVE,
+       DIE_KDUMP_ENTER,
+       DIE_KDUMP_LEAVE,
 };
 
 static inline int notify_die(enum die_val val, char *str, struct pt_regs *regs,
index 8d6e72f7b08efce6251952c7e69241ce243f8e28..b5c65081a3aab49bc051b7209c03d0ca54122160 100644 (file)
@@ -7,12 +7,13 @@
  */
 
 /*
- * Routines to manage the allocation of task context numbers.  Task context numbers are
- * used to reduce or eliminate the need to perform TLB flushes due to context switches.
- * Context numbers are implemented using ia-64 region ids.  Since the IA-64 TLB does not
- * consider the region number when performing a TLB lookup, we need to assign a unique
- * region id to each region in a process.  We use the least significant three bits in a
- * region id for this purpose.
+ * Routines to manage the allocation of task context numbers.  Task context
+ * numbers are used to reduce or eliminate the need to perform TLB flushes
+ * due to context switches.  Context numbers are implemented using ia-64
+ * region ids.  Since the IA-64 TLB does not consider the region number when
+ * performing a TLB lookup, we need to assign a unique region id to each
+ * region in a process.  We use the least significant three bits in aregion
+ * id for this purpose.
  */
 
 #define IA64_REGION_ID_KERNEL  0 /* the kernel's region id (tlb.c depends on this being 0) */
 struct ia64_ctx {
        spinlock_t lock;
        unsigned int next;      /* next context number to use */
-       unsigned int limit;     /* next >= limit => must call wrap_mmu_context() */
-       unsigned int max_ctx;   /* max. context value supported by all CPUs */
+       unsigned int limit;     /* available free range */
+       unsigned int max_ctx;   /* max. context value supported by all CPUs */
+                               /* call wrap_mmu_context when next >= max */
+       unsigned long *bitmap;  /* bitmap size is max_ctx+1 */
+       unsigned long *flushmap;/* pending rid to be flushed */
 };
 
 extern struct ia64_ctx ia64_ctx;
 DECLARE_PER_CPU(u8, ia64_need_tlb_flush);
 
+extern void mmu_context_init (void);
 extern void wrap_mmu_context (struct mm_struct *mm);
 
 static inline void
@@ -47,10 +52,10 @@ enter_lazy_tlb (struct mm_struct *mm, struct task_struct *tsk)
 }
 
 /*
- * When the context counter wraps around all TLBs need to be flushed because an old
- * context number might have been reused. This is signalled by the ia64_need_tlb_flush
- * per-CPU variable, which is checked in the routine below. Called by activate_mm().
- * <efocht@ess.nec.de>
+ * When the context counter wraps around all TLBs need to be flushed because
+ * an old context number might have been reused. This is signalled by the
+ * ia64_need_tlb_flush per-CPU variable, which is checked in the routine
+ * below. Called by activate_mm(). <efocht@ess.nec.de>
  */
 static inline void
 delayed_tlb_flush (void)
@@ -60,11 +65,9 @@ delayed_tlb_flush (void)
 
        if (unlikely(__ia64_per_cpu_var(ia64_need_tlb_flush))) {
                spin_lock_irqsave(&ia64_ctx.lock, flags);
-               {
-                       if (__ia64_per_cpu_var(ia64_need_tlb_flush)) {
-                               local_flush_tlb_all();
-                               __ia64_per_cpu_var(ia64_need_tlb_flush) = 0;
-                       }
+               if (__ia64_per_cpu_var(ia64_need_tlb_flush)) {
+                       local_flush_tlb_all();
+                       __ia64_per_cpu_var(ia64_need_tlb_flush) = 0;
                }
                spin_unlock_irqrestore(&ia64_ctx.lock, flags);
        }
@@ -76,20 +79,27 @@ get_mmu_context (struct mm_struct *mm)
        unsigned long flags;
        nv_mm_context_t context = mm->context;
 
-       if (unlikely(!context)) {
-               spin_lock_irqsave(&ia64_ctx.lock, flags);
-               {
-                       /* re-check, now that we've got the lock: */
-                       context = mm->context;
-                       if (context == 0) {
-                               cpus_clear(mm->cpu_vm_mask);
-                               if (ia64_ctx.next >= ia64_ctx.limit)
-                                       wrap_mmu_context(mm);
-                               mm->context = context = ia64_ctx.next++;
-                       }
+       if (likely(context))
+               goto out;
+
+       spin_lock_irqsave(&ia64_ctx.lock, flags);
+       /* re-check, now that we've got the lock: */
+       context = mm->context;
+       if (context == 0) {
+               cpus_clear(mm->cpu_vm_mask);
+               if (ia64_ctx.next >= ia64_ctx.limit) {
+                       ia64_ctx.next = find_next_zero_bit(ia64_ctx.bitmap,
+                                       ia64_ctx.max_ctx, ia64_ctx.next);
+                       ia64_ctx.limit = find_next_bit(ia64_ctx.bitmap,
+                                       ia64_ctx.max_ctx, ia64_ctx.next);
+                       if (ia64_ctx.next >= ia64_ctx.max_ctx)
+                               wrap_mmu_context(mm);
                }
-               spin_unlock_irqrestore(&ia64_ctx.lock, flags);
+               mm->context = context = ia64_ctx.next++;
+               __set_bit(context, ia64_ctx.bitmap);
        }
+       spin_unlock_irqrestore(&ia64_ctx.lock, flags);
+out:
        /*
         * Ensure we're not starting to use "context" before any old
         * uses of it are gone from our TLB.
@@ -100,8 +110,8 @@ get_mmu_context (struct mm_struct *mm)
 }
 
 /*
- * Initialize context number to some sane value.  MM is guaranteed to be a brand-new
- * address-space, so no TLB flushing is needed, ever.
+ * Initialize context number to some sane value.  MM is guaranteed to be a
+ * brand-new address-space, so no TLB flushing is needed, ever.
  */
 static inline int
 init_new_context (struct task_struct *p, struct mm_struct *mm)
@@ -162,7 +172,10 @@ activate_context (struct mm_struct *mm)
                if (!cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
                        cpu_set(smp_processor_id(), mm->cpu_vm_mask);
                reload_context(context);
-               /* in the unlikely event of a TLB-flush by another thread, redo the load: */
+               /*
+                * in the unlikely event of a TLB-flush by another thread,
+                * redo the load.
+                */
        } while (unlikely(context != mm->context));
 }
 
@@ -175,8 +188,8 @@ static inline void
 activate_mm (struct mm_struct *prev, struct mm_struct *next)
 {
        /*
-        * We may get interrupts here, but that's OK because interrupt handlers cannot
-        * touch user-space.
+        * We may get interrupts here, but that's OK because interrupt
+        * handlers cannot touch user-space.
         */
        ia64_set_kr(IA64_KR_PT_BASE, __pa(next->pgd));
        activate_context(next);
index 60f2137f92781a29384781a2bbc81743eba7e390..97890f7762b338515302884b3b874a0831558ee3 100644 (file)
@@ -12,9 +12,6 @@
 static inline void set_intr_gate (int nr, void *func) {}
 #define IO_APIC_VECTOR(irq)    (irq)
 #define ack_APIC_irq           ia64_eoi
-#define cpu_mask_to_apicid(mask) cpu_physical_id(first_cpu(mask))
-#define MSI_DEST_MODE          MSI_PHYSICAL_MODE
-#define MSI_TARGET_CPU ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff)
 #define MSI_TARGET_CPU_SHIFT   4
 
 #endif /* ASM_MSI_H */
index 9d41548b7fef43d1f98abbbb1a5dfaa371c9a031..9dd9da10527849add26749970dc31a963237854a 100644 (file)
@@ -47,8 +47,6 @@
 #define PERCPU_PAGE_SHIFT      16      /* log2() of max. size of per-CPU area */
 #define PERCPU_PAGE_SIZE       (__IA64_UL_CONST(1) << PERCPU_PAGE_SHIFT)
 
-#define RGN_MAP_LIMIT  ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE)      /* per region addr limit */
-
 
 #ifdef CONFIG_HUGETLB_PAGE
 # define HPAGE_REGION_BASE     RGN_BASE(RGN_HPAGE)
@@ -175,11 +173,17 @@ get_order (unsigned long size)
    */
   typedef struct { unsigned long pte; } pte_t;
   typedef struct { unsigned long pmd; } pmd_t;
+#ifdef CONFIG_PGTABLE_4
+  typedef struct { unsigned long pud; } pud_t;
+#endif
   typedef struct { unsigned long pgd; } pgd_t;
   typedef struct { unsigned long pgprot; } pgprot_t;
 
 # define pte_val(x)    ((x).pte)
 # define pmd_val(x)    ((x).pmd)
+#ifdef CONFIG_PGTABLE_4
+# define pud_val(x)    ((x).pud)
+#endif
 # define pgd_val(x)    ((x).pgd)
 # define pgprot_val(x) ((x).pgprot)
 
index a5f214554afd278830788f5e0673ac2d91fbba04..f2f23384647692d9e4d0ebec0b92f086828699a1 100644 (file)
@@ -86,6 +86,25 @@ static inline void pgd_free(pgd_t * pgd)
        pgtable_quicklist_free(pgd);
 }
 
+#ifdef CONFIG_PGTABLE_4
+static inline void
+pgd_populate(struct mm_struct *mm, pgd_t * pgd_entry, pud_t * pud)
+{
+       pgd_val(*pgd_entry) = __pa(pud);
+}
+
+static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
+{
+       return pgtable_quicklist_alloc();
+}
+
+static inline void pud_free(pud_t * pud)
+{
+       pgtable_quicklist_free(pud);
+}
+#define __pud_free_tlb(tlb, pud)       pud_free(pud)
+#endif /* CONFIG_PGTABLE_4 */
+
 static inline void
 pud_populate(struct mm_struct *mm, pud_t * pud_entry, pmd_t * pmd)
 {
index c34ba80c1c31fcdd80c94cf7ec32981348f3c609..e2560c58384b04bfc8016b1034a65ffd806f657f 100644 (file)
 #define __DIRTY_BITS           _PAGE_ED | __DIRTY_BITS_NO_ED
 
 /*
- * Definitions for first level:
- *
- * PGDIR_SHIFT determines what a first-level page table entry can map.
+ * How many pointers will a page table level hold expressed in shift
  */
-#define PGDIR_SHIFT            (PAGE_SHIFT + 2*(PAGE_SHIFT-3))
-#define PGDIR_SIZE             (__IA64_UL(1) << PGDIR_SHIFT)
-#define PGDIR_MASK             (~(PGDIR_SIZE-1))
-#define PTRS_PER_PGD           (1UL << (PAGE_SHIFT-3))
-#define USER_PTRS_PER_PGD      (5*PTRS_PER_PGD/8)      /* regions 0-4 are user regions */
-#define FIRST_USER_ADDRESS     0
+#define PTRS_PER_PTD_SHIFT     (PAGE_SHIFT-3)
 
 /*
- * Definitions for second level:
+ * Definitions for fourth level:
+ */
+#define PTRS_PER_PTE   (__IA64_UL(1) << (PTRS_PER_PTD_SHIFT))
+
+/*
+ * Definitions for third level:
  *
- * PMD_SHIFT determines the size of the area a second-level page table
+ * PMD_SHIFT determines the size of the area a third-level page table
  * can map.
  */
-#define PMD_SHIFT      (PAGE_SHIFT + (PAGE_SHIFT-3))
+#define PMD_SHIFT      (PAGE_SHIFT + (PTRS_PER_PTD_SHIFT))
 #define PMD_SIZE       (1UL << PMD_SHIFT)
 #define PMD_MASK       (~(PMD_SIZE-1))
-#define PTRS_PER_PMD   (1UL << (PAGE_SHIFT-3))
+#define PTRS_PER_PMD   (1UL << (PTRS_PER_PTD_SHIFT))
 
+#ifdef CONFIG_PGTABLE_4
 /*
- * Definitions for third level:
+ * Definitions for second level:
+ *
+ * PUD_SHIFT determines the size of the area a second-level page table
+ * can map.
  */
-#define PTRS_PER_PTE   (__IA64_UL(1) << (PAGE_SHIFT-3))
+#define PUD_SHIFT      (PMD_SHIFT + (PTRS_PER_PTD_SHIFT))
+#define PUD_SIZE       (1UL << PUD_SHIFT)
+#define PUD_MASK       (~(PUD_SIZE-1))
+#define PTRS_PER_PUD   (1UL << (PTRS_PER_PTD_SHIFT))
+#endif
+
+/*
+ * Definitions for first level:
+ *
+ * PGDIR_SHIFT determines what a first-level page table entry can map.
+ */
+#ifdef CONFIG_PGTABLE_4
+#define PGDIR_SHIFT            (PUD_SHIFT + (PTRS_PER_PTD_SHIFT))
+#else
+#define PGDIR_SHIFT            (PMD_SHIFT + (PTRS_PER_PTD_SHIFT))
+#endif
+#define PGDIR_SIZE             (__IA64_UL(1) << PGDIR_SHIFT)
+#define PGDIR_MASK             (~(PGDIR_SIZE-1))
+#define PTRS_PER_PGD_SHIFT     PTRS_PER_PTD_SHIFT
+#define PTRS_PER_PGD           (1UL << PTRS_PER_PGD_SHIFT)
+#define USER_PTRS_PER_PGD      (5*PTRS_PER_PGD/8)      /* regions 0-4 are user regions */
+#define FIRST_USER_ADDRESS     0
 
 /*
  * All the normal masks have the "page accessed" bits on, as any time
 #define __S111 __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RWX)
 
 #define pgd_ERROR(e)   printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
+#ifdef CONFIG_PGTABLE_4
+#define pud_ERROR(e)   printk("%s:%d: bad pud %016lx.\n", __FILE__, __LINE__, pud_val(e))
+#endif
 #define pmd_ERROR(e)   printk("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
 #define pte_ERROR(e)   printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
 
@@ -218,6 +244,9 @@ ia64_phys_addr_valid (unsigned long addr)
 #define        kc_vaddr_to_offset(v) ((v) - RGN_BASE(RGN_GATE))
 #define        kc_offset_to_vaddr(o) ((o) + RGN_BASE(RGN_GATE))
 
+#define RGN_MAP_SHIFT (PGDIR_SHIFT + PTRS_PER_PGD_SHIFT - 3)
+#define RGN_MAP_LIMIT  ((1UL << RGN_MAP_SHIFT) - PAGE_SIZE)    /* per region addr limit */
+
 /*
  * Conversion functions: convert page frame number (pfn) and a protection value to a page
  * table entry (pte).
@@ -254,9 +283,16 @@ ia64_phys_addr_valid (unsigned long addr)
 #define pud_bad(pud)                   (!ia64_phys_addr_valid(pud_val(pud)))
 #define pud_present(pud)               (pud_val(pud) != 0UL)
 #define pud_clear(pudp)                        (pud_val(*(pudp)) = 0UL)
-
 #define pud_page(pud)                  ((unsigned long) __va(pud_val(pud) & _PFN_MASK))
 
+#ifdef CONFIG_PGTABLE_4
+#define pgd_none(pgd)                  (!pgd_val(pgd))
+#define pgd_bad(pgd)                   (!ia64_phys_addr_valid(pgd_val(pgd)))
+#define pgd_present(pgd)               (pgd_val(pgd) != 0UL)
+#define pgd_clear(pgdp)                        (pgd_val(*(pgdp)) = 0UL)
+#define pgd_page(pgd)                  ((unsigned long) __va(pgd_val(pgd) & _PFN_MASK))
+#endif
+
 /*
  * The following have defined behavior only work if pte_present() is true.
  */
@@ -324,7 +360,13 @@ pgd_offset (struct mm_struct *mm, unsigned long address)
    here.  */
 #define pgd_offset_gate(mm, addr)      pgd_offset_k(addr)
 
+#ifdef CONFIG_PGTABLE_4
 /* Find an entry in the second-level page table.. */
+#define pud_offset(dir,addr) \
+       ((pud_t *) pgd_page(*(dir)) + (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
+#endif
+
+/* Find an entry in the third-level page table.. */
 #define pmd_offset(dir,addr) \
        ((pmd_t *) pud_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
 
@@ -557,7 +599,9 @@ do {                                                                                        \
 #define __HAVE_ARCH_PGD_OFFSET_GATE
 #define __HAVE_ARCH_LAZY_MMU_PROT_UPDATE
 
+#ifndef CONFIG_PGTABLE_4
 #include <asm-generic/pgtable-nopud.h>
+#endif
 #include <asm-generic/pgtable.h>
 
 #endif /* _ASM_IA64_PGTABLE_H */
index b65c62702724afe056d5f231e5e5b2b9d08b36ef..a35b323bae4ca7e0ae6f544c4578c309804a03d2 100644 (file)
@@ -51,6 +51,7 @@ flush_tlb_mm (struct mm_struct *mm)
        if (!mm)
                return;
 
+       set_bit(mm->context, ia64_ctx.flushmap);
        mm->context = 0;
 
        if (atomic_read(&mm->mm_users) == 0)
index 38f3043e7fe1acfb9be1b8c8286eb4f488c1672b..e3c962eeabf3d37871d24e87638fcc8005bf3048 100644 (file)
@@ -139,6 +139,18 @@ static inline void atomic_set_mask(unsigned long mask, unsigned long *v)
        __asm__ __volatile__("orl %1,%0" : "+m" (*v) : "id" (mask));
 }
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 /* Atomic operations are already serializing */
 #define smp_mb__before_atomic_dec()    barrier()
 #define smp_mb__after_atomic_dec()     barrier()
index df1575db32afb0df7efbb3827762feb3fd2fd917..7982285e84edcdaf3d3f3647b45ed87687ebb542 100644 (file)
@@ -14,6 +14,7 @@
 #define current_text_addr() ({ __label__ _l; _l: &&_l;})
 
 #include <linux/config.h>
+#include <linux/thread_info.h>
 #include <asm/segment.h>
 #include <asm/fpu.h>
 #include <asm/ptrace.h>
@@ -55,17 +56,6 @@ static inline void wrusp(unsigned long usp)
 #endif
 #define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr)
 
-struct task_work {
-       unsigned char sigpending;
-       unsigned char notify_resume;    /* request for notification on
-                                          userspace execution resumption */
-       char          need_resched;
-       unsigned char delayed_trace;    /* single step a syscall */
-       unsigned char syscall_trace;    /* count of syscall interceptors */
-       unsigned char memdie;           /* task was selected to be killed */
-       unsigned char pad[2];
-};
-
 struct thread_struct {
        unsigned long  ksp;             /* kernel stack pointer */
        unsigned long  usp;             /* user stack pointer */
@@ -78,7 +68,7 @@ struct thread_struct {
        unsigned long  fp[8*3];
        unsigned long  fpcntl[3];       /* fp control regs */
        unsigned char  fpstate[FPSTATESIZE];  /* floating point state */
-       struct task_work work;
+       struct thread_info info;
 };
 
 #define INIT_THREAD  {                                                 \
index 2aed24f6fd2e75a1193036f4f14ab0bbe22eb0bd..9532ca3c45cbea08906689234ad6a3e0f6224515 100644 (file)
@@ -2,17 +2,15 @@
 #define _ASM_M68K_THREAD_INFO_H
 
 #include <asm/types.h>
-#include <asm/processor.h>
 #include <asm/page.h>
 
 struct thread_info {
        struct task_struct      *task;          /* main task structure */
+       unsigned long           flags;
        struct exec_domain      *exec_domain;   /* execution domain */
        int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
        __u32 cpu; /* should always be 0 on m68k */
        struct restart_block    restart_block;
-
-       __u8                    supervisor_stack[0];
 };
 
 #define PREEMPT_ACTIVE         0x4000000
@@ -35,84 +33,29 @@ struct thread_info {
 #define free_thread_info(ti)  free_pages((unsigned long)(ti),1)
 #endif /* PAGE_SHIFT == 13 */
 
-//#define init_thread_info     (init_task.thread.info)
+#define init_thread_info       (init_task.thread.info)
 #define init_stack             (init_thread_union.stack)
 
-#define current_thread_info()  (current->thread_info)
-
+#define task_thread_info(tsk)  (&(tsk)->thread.info)
+#define current_thread_info()  task_thread_info(current)
 
 #define __HAVE_THREAD_FUNCTIONS
 
-#define TIF_SYSCALL_TRACE      0       /* syscall trace active */
-#define TIF_DELAYED_TRACE      1       /* single step a syscall */
-#define TIF_NOTIFY_RESUME      2       /* resumption notification requested */
-#define TIF_SIGPENDING         3       /* signal pending */
-#define TIF_NEED_RESCHED       4       /* rescheduling necessary */
-#define TIF_MEMDIE             5
-
-extern int thread_flag_fixme(void);
-
-/*
- * flag set/clear/test wrappers
- * - pass TIF_xxxx constants to these functions
- */
-
-#define __set_tsk_thread_flag(tsk, flag, val) ({       \
-       switch (flag) {                                 \
-       case TIF_SIGPENDING:                            \
-               tsk->thread.work.sigpending = val;      \
-               break;                                  \
-       case TIF_NEED_RESCHED:                          \
-               tsk->thread.work.need_resched = val;    \
-               break;                                  \
-       case TIF_SYSCALL_TRACE:                         \
-               tsk->thread.work.syscall_trace = val;   \
-               break;                                  \
-       case TIF_MEMDIE:                                \
-               tsk->thread.work.memdie = val;          \
-               break;                                  \
-       default:                                        \
-               thread_flag_fixme();                    \
-       }                                               \
+#define setup_thread_stack(p, org) ({                  \
+       *(struct task_struct **)(p)->thread_info = (p); \
+       task_thread_info(p)->task = (p);                \
 })
 
-#define __get_tsk_thread_flag(tsk, flag) ({            \
-       int ___res;                                     \
-       switch (flag) {                                 \
-       case TIF_SIGPENDING:                            \
-               ___res = tsk->thread.work.sigpending;   \
-               break;                                  \
-       case TIF_NEED_RESCHED:                          \
-               ___res = tsk->thread.work.need_resched; \
-               break;                                  \
-       case TIF_SYSCALL_TRACE:                         \
-               ___res = tsk->thread.work.syscall_trace;\
-               break;                                  \
-       case TIF_MEMDIE:                                \
-               ___res = tsk->thread.work.memdie;\
-               break;                                  \
-       default:                                        \
-               ___res = thread_flag_fixme();           \
-       }                                               \
-       ___res;                                         \
-})
-
-#define __get_set_tsk_thread_flag(tsk, flag, val) ({   \
-       int __res = __get_tsk_thread_flag(tsk, flag);   \
-       __set_tsk_thread_flag(tsk, flag, val);          \
-       __res;                                          \
-})
+#define end_of_stack(p) ((unsigned long *)(p)->thread_info + 1)
 
-#define set_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, ~0)
-#define clear_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, 0)
-#define test_and_set_tsk_thread_flag(tsk, flag) __get_set_tsk_thread_flag(tsk, flag, ~0)
-#define test_tsk_thread_flag(tsk, flag) __get_tsk_thread_flag(tsk, flag)
-
-#define set_thread_flag(flag) set_tsk_thread_flag(current, flag)
-#define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag)
-#define test_thread_flag(flag) test_tsk_thread_flag(current, flag)
-
-#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
-#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
+/* entry.S relies on these definitions!
+ * bits 0-7 are tested at every exception exit
+ * bits 8-15 are also tested at syscall exit
+ */
+#define TIF_SIGPENDING         6       /* signal pending */
+#define TIF_NEED_RESCHED       7       /* rescheduling necessary */
+#define TIF_DELAYED_TRACE      14      /* single step a syscall */
+#define TIF_SYSCALL_TRACE      15      /* syscall trace active */
+#define TIF_MEMDIE             16
 
 #endif /* _ASM_M68K_THREAD_INFO_H */
index a83631ed8c8f7a487b446893562b80e12172b346..3c1cc153c4154c233fc05dc6f0f0b8f7f3b8e9f9 100644 (file)
@@ -128,6 +128,18 @@ static inline int atomic_sub_return(int i, atomic_t * v)
        return temp;
 }
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic_inc_return(v) atomic_add_return(1,(v))
 
index 6202eb8a14b75ac161db078b6566a15aad325ad0..55c37c106ef00a364a532bb966019ddda9fbcd9e 100644 (file)
@@ -231,11 +231,12 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v)
 }
 
 /*
- * atomic_sub_if_positive - add integer to atomic variable
+ * atomic_sub_if_positive - conditionally subtract integer from atomic variable
+ * @i: integer value to subtract
  * @v: pointer of type atomic_t
  *
- * Atomically test @v and decrement if it is greater than 0.
- * The function returns the old value of @v minus 1.
+ * Atomically test @v and subtract @i if @v is greater or equal than @i.
+ * The function returns the old value of @v minus @i.
  */
 static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
 {
@@ -287,6 +288,27 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
        return result;
 }
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic_inc_return(v) atomic_add_return(1,(v))
 
@@ -556,11 +578,12 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
 }
 
 /*
- * atomic64_sub_if_positive - add integer to atomic variable
+ * atomic64_sub_if_positive - conditionally subtract integer from atomic variable
+ * @i: integer value to subtract
  * @v: pointer of type atomic64_t
  *
- * Atomically test @v and decrement if it is greater than 0.
- * The function returns the old value of @v minus 1.
+ * Atomically test @v and subtract @i if @v is greater or equal than @i.
+ * The function returns the old value of @v minus @i.
  */
 static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v)
 {
index 3061870b7f6cae67d4e9e8e2eebe412ca8456539..d42685747e7d3f66d42bbd45d2d95ed718bfb1f9 100644 (file)
@@ -459,10 +459,10 @@ __BUILDIO(q, u64)
 
 #define __BUILD_MEMORY_STRING(bwlq, type)                              \
                                                                        \
-static inline void writes##bwlq(volatile void __iomem *mem, void *addr,        \
-                               unsigned int count)                     \
+static inline void writes##bwlq(volatile void __iomem *mem,            \
+                               const void *addr, unsigned int count)   \
 {                                                                      \
-       volatile type *__addr = addr;                                   \
+       const volatile type *__addr = addr;                             \
                                                                        \
        while (count--) {                                               \
                mem_write##bwlq(*__addr, mem);                          \
index 152879bae20ff64d82a59a9dc34e5cb586733e0c..a13702fafa8580839917a7d8d963860f58971367 100644 (file)
@@ -154,7 +154,7 @@ struct sgi_crime {
 #define CRIME_MEM_ERROR_ECC_REPL_MASK  0xffffffff
 };
 
-extern struct sgi_crime *crime;
+extern struct sgi_crime __iomem *crime;
 
 #define CRIME_HI_MEM_BASE      0x40000000      /* this is where whole 1G of RAM is mapped */
 
index 5bdc51d85b6c2d5f7d792ee63b76624116daa085..990082c81f3957f04abab2b5f240647216bf4742 100644 (file)
@@ -150,24 +150,34 @@ struct mace_audio {
 
 /* register definitions for parallel port DMA */
 struct mace_parport {
-/* 0 - do nothing, 1 - pulse terminal count to the device after buffer is drained */ 
-#define MACEPAR_CONTEXT_LASTFLAG BIT(63)
-/* Should not cross 4K page boundary */
-#define MACEPAR_CONTEXT_DATALEN_MASK 0xfff00000000
-/* Can be arbitrarily aligned on any byte boundary on output, 64 byte aligned on input */
-#define MACEPAR_CONTEXT_BASEADDR_MASK 0xffffffff
+       /* 0 - do nothing,
+        * 1 - pulse terminal count to the device after buffer is drained */
+#define MACEPAR_CONTEXT_LASTFLAG       BIT(63)
+       /* Should not cross 4K page boundary */
+#define MACEPAR_CONTEXT_DATA_BOUND     0x0000000000001000UL
+#define MACEPAR_CONTEXT_DATALEN_MASK   0x00000fff00000000UL
+#define MACEPAR_CONTEXT_DATALEN_SHIFT  32
+       /* Can be arbitrarily aligned on any byte boundary on output,
+        * 64 byte aligned on input */
+#define MACEPAR_CONTEXT_BASEADDR_MASK  0x00000000ffffffffUL
        volatile u64 context_a;
        volatile u64 context_b;
-#define MACEPAR_CTLSTAT_DIRECTION BIT(0) /* 0 - mem->device, 1 - device->mem */
-#define MACEPAR_CTLSTAT_ENABLE BIT(1) /* 0 - channel frozen, 1 - channel enabled */
-#define MACEPAR_CTLSTAT_RESET BIT(2) /* 0 - channel active, 1 - complete channel reset */
-#define MACEPAR_CTLSTAT_CTXB_VALID BIT(3)
-#define MACEPAR_CTLSTAT_CTXA_VALID BIT(4)
-       volatile u64 cntlstat; /* Control/Status register */
-#define MACEPAR_DIAG_CTXINUSE BIT(1)
-#define MACEPAR_DIAG_DMACTIVE BIT(2) /* 1 - Dma engine is enabled and processing something */
-#define MACEPAR_DIAG_CTRMASK 0x3ffc /* Counter of bytes left */
-       volatile u64 diagnostic; /* RO: diagnostic register */
+       /* 0 - mem->device, 1 - device->mem */
+#define MACEPAR_CTLSTAT_DIRECTION      BIT(0)
+       /* 0 - channel frozen, 1 - channel enabled */
+#define MACEPAR_CTLSTAT_ENABLE         BIT(1)
+       /* 0 - channel active, 1 - complete channel reset */
+#define MACEPAR_CTLSTAT_RESET          BIT(2)
+#define MACEPAR_CTLSTAT_CTXB_VALID     BIT(3)
+#define MACEPAR_CTLSTAT_CTXA_VALID     BIT(4)
+       volatile u64 cntlstat;          /* Control/Status register */
+#define MACEPAR_DIAG_CTXINUSE          BIT(0)
+       /* 1 - Dma engine is enabled and processing something */
+#define MACEPAR_DIAG_DMACTIVE          BIT(1)
+       /* Counter of bytes left */
+#define MACEPAR_DIAG_CTRMASK           0x0000000000003ffcUL
+#define MACEPAR_DIAG_CTRSHIFT          2
+       volatile u64 diagnostic;        /* RO: diagnostic register */
 };
 
 /* ISA Control and DMA registers */
@@ -353,6 +363,6 @@ struct sgi_mace {
        char _pad6[0x80000 - sizeof(struct mace_isa)];
 };
 
-extern struct sgi_mace *mace;
+extern struct sgi_mace __iomem *mace;
 
 #endif /* __ASM_MACE_H__ */
index 5d894376fc1a9b0a58720537782f7511b296f159..647fdb54cc1dd31a6f699bbb1c7a651b4ccd1304 100644 (file)
@@ -220,5 +220,8 @@ static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
 #define BOARD_PC1_INT DB1200_PC1_INT
 #define BOARD_CARD_INSERTED(SOCKET) bcsr->sig_status & (1<<(8+(2*SOCKET)))
 
+/* Nand chip select */
+#define NAND_CS 1
+
 #endif /* __ASM_DB1200_H */
 
index efafe65258b6eb664b766e8844b2766a07eb41ae..7b28b23f91ceefa28e1a8dd18ce82f64f90a96a3 100644 (file)
@@ -200,6 +200,12 @@ typedef volatile struct
                        ((NAND_T_PUL & 0xF)     << NAND_T_PUL_SHIFT) | \
                        ((NAND_T_SU  & 0xF)     << NAND_T_SU_SHIFT)  | \
                        ((NAND_T_WH  & 0xF)     << NAND_T_WH_SHIFT)
+#define NAND_CS 1
+
+/* should be done by yamon */
+#define NAND_STCFG  0x00400005 /* 8-bit NAND */
+#define NAND_STTIME 0x00007774 /* valid for 396MHz SD=2 only */
+#define NAND_STADDR 0x12000FFF /* physical address 0x20000000 */
 
 #endif /* __ASM_DB1X00_H */
 
index f5d780ff843f402c8427564adc2b24af1219b61a..c28ba8d840760193b697c32280c0c1cd9fcd47c2 100644 (file)
@@ -11,7 +11,6 @@
 #ifndef __ASM_MACH_IP32_MC146818RTC_H
 #define __ASM_MACH_IP32_MC146818RTC_H
 
-#include <asm/io.h>
 #include <asm/ip32/mace.h>
 
 #define RTC_PORT(x)    (0x70 + (x))
@@ -26,8 +25,10 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
        mace->isa.rtc[addr << 8] = data;
 }
 
-/* FIXME: Do it right. For now just assume that noone lives in 20th century
- * and no O2 user in 22th century ;-) */
+/*
+ * FIXME: Do it right. For now just assume that noone lives in 20th century
+ * and no O2 user in 22th century ;-)
+ */
 #define mc146818_decode_year(year) ((year) + 2000)
 
 #define RTC_ALWAYS_BCD 0
similarity index 74%
rename from include/asm-mips/mach-jmr3927/asm/ds1742.h
rename to include/asm-mips/mach-jmr3927/ds1742.h
index 134a4b6c334a689ad5ad9f8a2e81d0aeeea649a2..cff6192d4bdbd820ab659c5cf8d449413ea7b697 100644 (file)
@@ -5,12 +5,12 @@
  *
  * Copyright (C) 2003 by Ralf Baechle
  */
-#ifndef __ASM_MACH_JMR3927_ASM_DS1742_H
-#define __ASM_MACH_JMR3927_ASM_DS1742_H
+#ifndef __ASM_MACH_JMR3927_DS1742_H
+#define __ASM_MACH_JMR3927_DS1742_H
 
 #include <asm/jmr3927/jmr3927.h>
 
 #define rtc_read(reg)          (jmr3927_nvram_in(addr))
 #define rtc_write(data, reg)   (jmr3927_nvram_out((data),(reg)))
 
-#endif /* __ASM_MACH_JMR3927_ASM_DS1742_H */
+#endif /* __ASM_MACH_JMR3927_DS1742_H */
index 9a3088b19bf3c0c934359ba7a66e6950a3dc1214..409d443322c1aab08baade0369c13980e91efc4f 100644 (file)
@@ -248,5 +248,8 @@ static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
 #define BOARD_PC1_INT PB1200_PC1_INT
 #define BOARD_CARD_INSERTED(SOCKET) bcsr->sig_status & (1<<(8+(2*SOCKET)))
 
+/* Nand chip select */
+#define NAND_CS 1
+
 #endif /* __ASM_PB1200_H */
 
index 431d6088ea964bbb92ae2c7025dec6f6af8053ad..9578ead11e8a07825a8cfbc86ef21a88153ada54 100644 (file)
@@ -166,4 +166,11 @@ static BCSR * const bcsr = (BCSR *)BCSR_PHYS_ADDR;
                        ((NAND_T_SU  & 0xF)     << NAND_T_SU_SHIFT)  | \
                        ((NAND_T_WH  & 0xF)     << NAND_T_WH_SHIFT)
 
+#define NAND_CS 1
+
+/* should be done by yamon */
+#define NAND_STCFG  0x00400005 /* 8-bit NAND */
+#define NAND_STTIME 0x00007774 /* valid for 396MHz SD=2 only */
+#define NAND_STADDR 0x12000FFF /* physical address 0x20000000 */
+
 #endif /* __ASM_PB1550_H */
index c3dcfcb928b6b41966b9dde1376941f3ced19115..365c2a3c64f5edb1c39017ed2185afac369c96cc 100644 (file)
 #ifndef _MIPS_SEADINT_H
 #define _MIPS_SEADINT_H
 
-#define SEADINT_UART0     2
-#define SEADINT_UART1     3
+/*
+ * Interrupts 0..7 are used for SEAD CPU interrupts
+ */
+#define MIPSCPU_INT_BASE       0
+
+#define MIPSCPU_INT_UART0      2
+#define MIPSCPU_INT_UART1      3
 
-extern void seadint_init(void);
+#define MIPSCPU_INT_CPUCTR     7
 
 #endif /* !(_MIPS_SEADINT_H) */
index 8ca539e80d87eca9815d25a4e25754d0614403cd..6fe903e09c62b4eab0275d7bffba74d196ce3f47 100644 (file)
@@ -155,27 +155,6 @@ typedef struct sigaltstack {
 #ifdef __KERNEL__
 #include <asm/sigcontext.h>
 
-/*
- * The following break codes are or were in use for specific purposes in
- * other MIPS operating systems.  Linux/MIPS doesn't use all of them.  The
- * unused ones are here as placeholders; we might encounter them in
- * non-Linux/MIPS object files or make use of them in the future.
- */
-#define BRK_USERBP     0       /* User bp (used by debuggers) */
-#define BRK_KERNELBP   1       /* Break in the kernel */
-#define BRK_ABORT      2       /* Sometimes used by abort(3) to SIGIOT */
-#define BRK_BD_TAKEN   3       /* For bd slot emulation - not implemented */
-#define BRK_BD_NOTTAKEN        4       /* For bd slot emulation - not implemented */
-#define BRK_SSTEPBP    5       /* User bp (used by debuggers) */
-#define BRK_OVERFLOW   6       /* Overflow check */
-#define BRK_DIVZERO    7       /* Divide by zero check */
-#define BRK_RANGE      8       /* Range error check */
-#define BRK_STACKOVERFLOW 9    /* For Ada stackchecking */
-#define BRK_NORLD      10      /* No rld found - not used by Linux/MIPS */
-#define _BRK_THREADBP  11      /* For threads, user bp (used by debuggers) */
-#define BRK_MULOVF     1023    /* Multiply overflow */
-#define BRK_BUG                512     /* Used by BUG() */
-
 #define ptrace_signal_deliver(regs, cookie) do { } while (0)
 
 #endif /* __KERNEL__ */
index 048a2c7fd0c0a54530fdabb5350915652fa1e2c0..983e9a2b6042858b492d8dbde8b97b9d5f96b701 100644 (file)
@@ -164,6 +164,26 @@ static __inline__ int atomic_read(const atomic_t *v)
 }
 
 /* exported interface */
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
 #define atomic_add(i,v)        ((void)(__atomic_add_return( ((int)i),(v))))
 #define atomic_sub(i,v)        ((void)(__atomic_add_return(-((int)i),(v))))
index f876bdf220569f0f90eaec0436665a8bf95d1464..b0a30e2c9813b7369837a533b3673b7528dfb60c 100644 (file)
@@ -8,6 +8,7 @@
 #define _ASM_PARISC_IRQ_H
 
 #include <linux/config.h>
+#include <linux/cpumask.h>
 #include <asm/types.h>
 
 #define NO_IRQ         (-1)
@@ -49,10 +50,10 @@ extern int txn_alloc_irq(unsigned int nbits);
 extern int txn_claim_irq(int);
 extern unsigned int txn_alloc_data(unsigned int);
 extern unsigned long txn_alloc_addr(unsigned int);
+extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
 
 extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);
-
-extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);
+extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest);
 
 /* soft power switch support (power.c) */
 extern struct tasklet_struct power_tasklet;
index 9413f67a540bb24ae2b2d2866a48c3fc8dc1a37a..dbdbd2e9fdf9304e658a6ea61a56cdf8c6688e67 100644 (file)
@@ -29,6 +29,7 @@ extern cpumask_t cpu_online_map;
 #define cpu_logical_map(cpu)   (cpu)
 
 extern void smp_send_reschedule(int cpu);
+extern void smp_send_all_nop(void);
 
 #endif /* !ASSEMBLY */
 
@@ -53,7 +54,11 @@ extern unsigned long cpu_present_mask;
 
 #define raw_smp_processor_id() (current_thread_info()->cpu)
 
-#endif /* CONFIG_SMP */
+#else /* CONFIG_SMP */
+
+static inline void smp_send_all_nop(void) { return; }
+
+#endif
 
 #define NO_PROC_ID             0xFF            /* No processor magic marker */
 #define ANY_PROC_ID            0xFF            /* Any processor magic marker */
index 7c3f406a746a4f0984b07efc40e533b24d076561..16c2ac075fc5248973f578133376a41857dbd5a6 100644 (file)
@@ -11,18 +11,25 @@ static inline int __raw_spin_is_locked(raw_spinlock_t *x)
        return *a == 0;
 }
 
-#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
+#define __raw_spin_lock(lock) __raw_spin_lock_flags(lock, 0)
 #define __raw_spin_unlock_wait(x) \
                do { cpu_relax(); } while (__raw_spin_is_locked(x))
 
-static inline void __raw_spin_lock(raw_spinlock_t *x)
+static inline void __raw_spin_lock_flags(raw_spinlock_t *x,
+                                        unsigned long flags)
 {
        volatile unsigned int *a;
 
        mb();
        a = __ldcw_align(x);
        while (__ldcw(a) == 0)
-               while (*a == 0);
+               while (*a == 0)
+                       if (flags & PSW_SM_I) {
+                               local_irq_enable();
+                               cpu_relax();
+                               local_irq_disable();
+                       } else
+                               cpu_relax();
        mb();
 }
 
@@ -60,26 +67,20 @@ static inline int __raw_spin_trylock(raw_spinlock_t *x)
 
 static  __inline__ void __raw_read_lock(raw_rwlock_t *rw)
 {
-       unsigned long flags;
-       local_irq_save(flags);
        __raw_spin_lock(&rw->lock);
 
        rw->counter++;
 
        __raw_spin_unlock(&rw->lock);
-       local_irq_restore(flags);
 }
 
 static  __inline__ void __raw_read_unlock(raw_rwlock_t *rw)
 {
-       unsigned long flags;
-       local_irq_save(flags);
        __raw_spin_lock(&rw->lock);
 
        rw->counter--;
 
        __raw_spin_unlock(&rw->lock);
-       local_irq_restore(flags);
 }
 
 /* write_lock is less trivial.  We optimistically grab the lock and check
index e97aa8d1eff5f99bf84596d64602e252c356ff71..c9ec39c6fc6cf8b098f41058b4ab456f803ee80f 100644 (file)
  * N class systems, only one PxTLB inter processor broadcast can be
  * active at any one time on the Merced bus.  This tlb purge
  * synchronisation is fairly lightweight and harmless so we activate
- * it on all SMP systems not just the N class. */
-#ifdef CONFIG_SMP
+ * it on all SMP systems not just the N class.  We also need to have
+ * preemption disabled on uniprocessor machines, and spin_lock does that
+ * nicely.
+ */
 extern spinlock_t pa_tlb_lock;
 
 #define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
 #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
 
-#else
-
-#define purge_tlb_start(x) do { } while(0)
-#define purge_tlb_end(x) do { } while (0)
-
-#endif
-
-
 extern void flush_tlb_all(void);
 
 /*
@@ -88,7 +82,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
        if (npages >= 512)  /* 2MB of space: arbitrary, should be tuned */
                flush_tlb_all();
        else {
-               preempt_disable();
                mtsp(vma->vm_mm->context,1);
                purge_tlb_start();
                if (split_tlb) {
@@ -102,7 +95,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
                                pdtlb(start);
                                start += PAGE_SIZE;
                        }
-               preempt_enable();
                }
                purge_tlb_end();
        }
index 9c0b372a46e1ffb4f0160857ff0f21192f401692..ec4b14468959e295dc29ebbd0b212b6899597f70 100644 (file)
@@ -164,6 +164,33 @@ static __inline__ int atomic_dec_return(atomic_t *v)
        return t;
 }
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                                                      \
+({                                                                                                                      \
+          int c, old;                                                                                   \
+          c = atomic_read(v);                                                                   \
+          for (;;) {                                                                                     \
+                          if (unlikely(c == (u)))                                               \
+                                          break;                                                                 \
+                          old = atomic_cmpxchg((v), c, c + (a));                 \
+                          if (likely(old == c))                                                   \
+                                          break;                                                                 \
+                          c = old;                                                                             \
+          }                                                                                                       \
+          c != (u);                                                                                       \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_sub_and_test(a, v)      (atomic_sub_return((a), (v)) == 0)
 #define atomic_dec_and_test(v)         (atomic_dec_return((v)) == 0)
 
index 79d8c47323093508bf0b78223712e60115c81386..19a099b62cd6aae4100129e52bfa1679e0bba9e8 100644 (file)
@@ -14,8 +14,6 @@
 /* The vDSO location. We have to use the same value as x86 for glibc's
  * sake :-)
  */
-#ifdef __powerpc64__
 #define AT_SYSINFO_EHDR                33
-#endif
 
 #endif
index 04e2726002cf2d3fadd1bff2cc653b003e80e550..d1cfa3f515ea2d2162941c42ea534a567d22d7b5 100644 (file)
@@ -90,6 +90,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
 #define CPU_FTR_NEED_COHERENT          ASM_CONST(0x0000000000020000)
 #define CPU_FTR_NO_BTIC                        ASM_CONST(0x0000000000040000)
 #define CPU_FTR_BIG_PHYS               ASM_CONST(0x0000000000080000)
+#define CPU_FTR_NODSISRALIGN           ASM_CONST(0x0000000000100000)
 
 #ifdef __powerpc64__
 /* Add the 64b processor unique features in the top half of the word */
@@ -97,7 +98,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
 #define CPU_FTR_16M_PAGE               ASM_CONST(0x0000000200000000)
 #define CPU_FTR_TLBIEL                         ASM_CONST(0x0000000400000000)
 #define CPU_FTR_NOEXECUTE              ASM_CONST(0x0000000800000000)
-#define CPU_FTR_NODSISRALIGN           ASM_CONST(0x0000001000000000)
 #define CPU_FTR_IABR                   ASM_CONST(0x0000002000000000)
 #define CPU_FTR_MMCRA                          ASM_CONST(0x0000004000000000)
 #define CPU_FTR_CTRL                   ASM_CONST(0x0000008000000000)
@@ -113,7 +113,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
 #define CPU_FTR_16M_PAGE               ASM_CONST(0x0)
 #define CPU_FTR_TLBIEL                         ASM_CONST(0x0)
 #define CPU_FTR_NOEXECUTE              ASM_CONST(0x0)
-#define CPU_FTR_NODSISRALIGN           ASM_CONST(0x0)
 #define CPU_FTR_IABR                   ASM_CONST(0x0)
 #define CPU_FTR_MMCRA                          ASM_CONST(0x0)
 #define CPU_FTR_CTRL                   ASM_CONST(0x0)
@@ -273,18 +272,21 @@ enum {
        CPU_FTRS_POWER3_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
        CPU_FTRS_POWER4_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
-           CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
+           CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_NODSISRALIGN,
        CPU_FTRS_970_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP |
-           CPU_FTR_MAYBE_CAN_NAP,
+           CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN,
        CPU_FTRS_8XX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
-       CPU_FTRS_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
-       CPU_FTRS_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
-       CPU_FTRS_E200 = CPU_FTR_USE_TB,
-       CPU_FTRS_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
+       CPU_FTRS_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+           CPU_FTR_NODSISRALIGN,
+       CPU_FTRS_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+           CPU_FTR_NODSISRALIGN,
+       CPU_FTRS_E200 = CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN,
+       CPU_FTRS_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+           CPU_FTR_NODSISRALIGN,
        CPU_FTRS_E500_2 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-           CPU_FTR_BIG_PHYS,
-       CPU_FTRS_GENERIC_32 = CPU_FTR_COMMON,
+           CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN,
+       CPU_FTRS_GENERIC_32 = CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN,
 #ifdef __powerpc64__
        CPU_FTRS_POWER3 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
            CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
diff --git a/include/asm-powerpc/delay.h b/include/asm-powerpc/delay.h
new file mode 100644 (file)
index 0000000..54fe1f4
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _ASM_POWERPC_DELAY_H
+#define _ASM_POWERPC_DELAY_H
+
+/*
+ * Copyright 1996, Paul Mackerras.
+ *
+ * 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.
+ *
+ * PPC64 Support added by Dave Engebretsen, Todd Inglett, Mike Corrigan,
+ * Anton Blanchard.
+ */
+
+extern void __delay(unsigned long loops);
+extern void udelay(unsigned long usecs);
+
+#endif /* _ASM_POWERPC_DELAY_H */
similarity index 98%
rename from include/asm-ppc64/eeh.h
rename to include/asm-powerpc/eeh.h
index 89f26ab31908df6e72932291568340243ba7b4b3..f8633aafe4baa5d000e608b35b92e5f13be45311 100644 (file)
@@ -30,6 +30,8 @@ struct device_node;
 
 #ifdef CONFIG_EEH
 
+extern int eeh_subsystem_enabled;
+
 /* Values for eeh_mode bits in device_node */
 #define EEH_MODE_SUPPORTED     (1<<0)
 #define EEH_MODE_NOCHECK       (1<<1)
@@ -75,7 +77,7 @@ void eeh_remove_device(struct pci_dev *);
  * If this macro yields TRUE, the caller relays to eeh_check_failure()
  * which does further tests out of line.
  */
-#define EEH_POSSIBLE_ERROR(val, type)  ((val) == (type)~0)
+#define EEH_POSSIBLE_ERROR(val, type)  ((val) == (type)~0 && eeh_subsystem_enabled)
 
 /*
  * Reads from a device which has been isolated by EEH will return
index feac3458d71f693a9a31b31f263f5b0106978fc8..3dcd65edf97805daf4f496fc4ecaf83f3cfe81f1 100644 (file)
@@ -269,14 +269,12 @@ extern int dcache_bsize;
 extern int icache_bsize;
 extern int ucache_bsize;
 
-#ifdef __powerpc64__
+/* vDSO has arch_setup_additional_pages */
+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
 struct linux_binprm;
-#define ARCH_HAS_SETUP_ADDITIONAL_PAGES        /* vDSO has arch_setup_additional_pages */
-extern int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack);
+extern int arch_setup_additional_pages(struct linux_binprm *bprm,
+                                      int executable_stack);
 #define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b);
-#else
-#define VDSO_AUX_ENT(a,b)
-#endif /* __powerpc64__ */
 
 /*
  * The requirements here are:
similarity index 78%
rename from include/asm-ppc64/floppy.h
rename to include/asm-powerpc/floppy.h
index 5c497b588e542acf78cb00e1e33a509050a28fca..64276a3f6153f7ea6461233287ad9c4473f87b88 100644 (file)
@@ -7,22 +7,22 @@
  *
  * Copyright (C) 1995
  */
-#ifndef __ASM_PPC64_FLOPPY_H
-#define __ASM_PPC64_FLOPPY_H
+#ifndef __ASM_POWERPC_FLOPPY_H
+#define __ASM_POWERPC_FLOPPY_H
 
 #include <linux/config.h>
 #include <asm/machdep.h>
 
-#define fd_inb(port)                   inb_p(port)
-#define fd_outb(value,port)            outb_p(value,port)
+#define fd_inb(port)           inb_p(port)
+#define fd_outb(value,port)    outb_p(value,port)
 
 #define fd_enable_dma()         enable_dma(FLOPPY_DMA)
 #define fd_disable_dma()        disable_dma(FLOPPY_DMA)
-#define fd_request_dma()        request_dma(FLOPPY_DMA,"floppy")
+#define fd_request_dma()        request_dma(FLOPPY_DMA, "floppy")
 #define fd_free_dma()           free_dma(FLOPPY_DMA)
 #define fd_clear_dma_ff()       clear_dma_ff(FLOPPY_DMA)
-#define fd_set_dma_mode(mode)   set_dma_mode(FLOPPY_DMA,mode)
-#define fd_set_dma_count(count) set_dma_count(FLOPPY_DMA,count)
+#define fd_set_dma_mode(mode)   set_dma_mode(FLOPPY_DMA, mode)
+#define fd_set_dma_count(count) set_dma_count(FLOPPY_DMA, count)
 #define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
 #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
 #define fd_cacheflush(addr,size) /* nothing */
 
 #include <linux/pci.h>
 
-#define fd_dma_setup(addr,size,mode,io) ppc64_fd_dma_setup(addr,size,mode,io)
+#define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io)
 
-static __inline__ int 
-ppc64_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
+static __inline__ int powerpc_fd_dma_setup(char *addr, unsigned long size,
+                                          int mode, int io)
 {
        static unsigned long prev_size;
        static dma_addr_t bus_addr = 0;
@@ -55,9 +55,8 @@ ppc64_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
                bus_addr = 0;
        }
 
-       if (!bus_addr)  /* need to map it */ {
+       if (!bus_addr)  /* need to map it */
                bus_addr = pci_map_single(NULL, addr, size, dir);
-       }
 
        /* remember this one as prev */
        prev_addr = addr;
@@ -103,4 +102,4 @@ static int FDC2 = -1;
 
 #define EXTRA_FLOPPY_PARAMS
 
-#endif /* __ASM_PPC64_FLOPPY_H */
+#endif /* __ASM_POWERPC_FLOPPY_H */
index c9fbcede0ef9faf5773db4d69663e8b7c3661d52..8eb7e857ec4cd167176c78b644ee046a6fbe09b5 100644 (file)
@@ -389,6 +389,7 @@ extern u64 ppc64_interrupt_controller;
 #define        SIU_INT_TIMER4          ((uint)0x0f + CPM_IRQ_OFFSET)
 #define        SIU_INT_TMCNT           ((uint)0x10 + CPM_IRQ_OFFSET)
 #define        SIU_INT_PIT             ((uint)0x11 + CPM_IRQ_OFFSET)
+#define        SIU_INT_PCI             ((uint)0x12 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ1            ((uint)0x13 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ2            ((uint)0x14 + CPM_IRQ_OFFSET)
 #define        SIU_INT_IRQ3            ((uint)0x15 + CPM_IRQ_OFFSET)
index 062ab9ba68eb31d0f6fcc711b4259202a467e6f2..c72ffc709ea8ac0143ab13270895263c05394789 100644 (file)
@@ -40,6 +40,7 @@ extern note_buf_t crash_notes[];
 #ifdef __powerpc64__
 extern void kexec_smp_wait(void);      /* get and clear naca physid, wait for
                                          master to copy new code to 0 */
+extern void __init kexec_setup(void);
 #else
 struct kimage;
 extern void machine_kexec_simple(struct kimage *image);
index 5670f0cd61433e69b1bcb05aff5dd7ea3c7e9f9e..c011abb8b600f1248fdfed9bb4ff9bbbd88ef87b 100644 (file)
@@ -93,7 +93,9 @@ struct machdep_calls {
 
        void            (*init_IRQ)(void);
        int             (*get_irq)(struct pt_regs *);
-       void            (*cpu_irq_down)(int secondary);
+#ifdef CONFIG_KEXEC
+       void            (*kexec_cpu_down)(int crash_shutdown, int secondary);
+#endif
 
        /* PCI stuff */
        /* Called after scanning the bus, before allocating resources */
similarity index 90%
rename from include/asm-ppc64/nvram.h
rename to include/asm-powerpc/nvram.h
index def47d720d3da822259bf0e5834effc447a9593d..24bd8c2388ea5b912546423b04dd8ca13ed03141 100644 (file)
@@ -1,6 +1,5 @@
 /*
- * PreP compliant NVRAM access
- * This needs to be updated for PPC64
+ * NVRAM definitions and access functions.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -8,8 +7,8 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#ifndef _PPC64_NVRAM_H
-#define _PPC64_NVRAM_H
+#ifndef _ASM_POWERPC_NVRAM_H
+#define _ASM_POWERPC_NVRAM_H
 
 #define NVRW_CNT 0x20
 #define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
@@ -69,7 +68,6 @@ extern int nvram_clear_error_log(void);
 extern struct nvram_partition *nvram_find_partition(int sig, const char *name);
 
 extern int pSeries_nvram_init(void);
-extern int pmac_nvram_init(void);
 extern int mmio_nvram_init(void);
 
 /* PowerMac specific nvram stuffs */
@@ -88,7 +86,11 @@ extern u8    pmac_xpram_read(int xpaddr);
 extern void    pmac_xpram_write(int xpaddr, u8 data);
 
 /* Synchronize NVRAM */
-extern int     nvram_sync(void);
+extern void    nvram_sync(void);
+
+/* Normal access to NVRAM */
+extern unsigned char nvram_read_byte(int i);
+extern void nvram_write_byte(unsigned char c, int i);
 
 /* Some offsets in XPRAM */
 #define PMAC_XPRAM_MACHINE_LOC 0xe4
@@ -112,5 +114,6 @@ struct pmac_machine_location {
                                _IOWR('p', 0x40, int)
 
 #define IOC_NVRAM_GET_OFFSET   _IOWR('p', 0x42, int)   /* Get NVRAM partition offset */
+#define IOC_NVRAM_SYNC         _IO('p', 0x43)          /* Sync NVRAM image */
 
-#endif /* _PPC64_NVRAM_H */
+#endif /* _ASM_POWERPC_NVRAM_H */
diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h
new file mode 100644 (file)
index 0000000..18c1e5e
--- /dev/null
@@ -0,0 +1,179 @@
+#ifndef _ASM_POWERPC_PAGE_H
+#define _ASM_POWERPC_PAGE_H
+
+/*
+ * Copyright (C) 2001,2005 IBM Corporation.
+ *
+ * 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.
+ */
+
+#ifdef __KERNEL__
+#include <linux/config.h>
+#include <asm/asm-compat.h>
+
+/*
+ * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software
+ * page size. When using 64K pages however, whether we are really supporting
+ * 64K pages in HW or not is irrelevant to those definitions.
+ */
+#ifdef CONFIG_PPC_64K_PAGES
+#define PAGE_SHIFT             16
+#else
+#define PAGE_SHIFT             12
+#endif
+
+#define PAGE_SIZE              (ASM_CONST(1) << PAGE_SHIFT)
+
+/* We do define AT_SYSINFO_EHDR but don't use the gate mechanism */
+#define __HAVE_ARCH_GATE_AREA          1
+
+/*
+ * Subtle: (1 << PAGE_SHIFT) is an int, not an unsigned long. So if we
+ * assign PAGE_MASK to a larger type it gets extended the way we want
+ * (i.e. with 1s in the high bits)
+ */
+#define PAGE_MASK      (~((1 << PAGE_SHIFT) - 1))
+
+#define PAGE_OFFSET     ASM_CONST(CONFIG_KERNEL_START)
+#define KERNELBASE      PAGE_OFFSET
+
+#ifdef CONFIG_DISCONTIGMEM
+#define page_to_pfn(page)      discontigmem_page_to_pfn(page)
+#define pfn_to_page(pfn)       discontigmem_pfn_to_page(pfn)
+#define pfn_valid(pfn)         discontigmem_pfn_valid(pfn)
+#endif
+
+#ifdef CONFIG_FLATMEM
+#define pfn_to_page(pfn)       (mem_map + (pfn))
+#define page_to_pfn(page)      ((unsigned long)((page) - mem_map))
+#define pfn_valid(pfn)         ((pfn) < max_mapnr)
+#endif
+
+#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
+#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
+
+#define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
+#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET)
+
+/*
+ * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
+ * and needs to be executable.  This means the whole heap ends
+ * up being executable.
+ */
+#define VM_DATA_DEFAULT_FLAGS32        (VM_READ | VM_WRITE | VM_EXEC | \
+                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+#define VM_DATA_DEFAULT_FLAGS64        (VM_READ | VM_WRITE | \
+                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+#ifdef __powerpc64__
+#include <asm/page_64.h>
+#else
+#include <asm/page_32.h>
+#endif
+
+/* align addr on a size boundary - adjust address up/down if needed */
+#define _ALIGN_UP(addr,size)   (((addr)+((size)-1))&(~((size)-1)))
+#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
+
+/* align addr on a size boundary - adjust address up if needed */
+#define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
+
+/* to align the pointer to the (next) page boundary */
+#define PAGE_ALIGN(addr)       _ALIGN(addr, PAGE_SIZE)
+
+#ifndef __ASSEMBLY__
+
+#undef STRICT_MM_TYPECHECKS
+
+#ifdef STRICT_MM_TYPECHECKS
+/* These are used to make use of C type-checking. */
+
+/* PTE level */
+typedef struct { pte_basic_t pte; } pte_t;
+#define pte_val(x)     ((x).pte)
+#define __pte(x)       ((pte_t) { (x) })
+
+/* 64k pages additionally define a bigger "real PTE" type that gathers
+ * the "second half" part of the PTE for pseudo 64k pages
+ */
+#ifdef CONFIG_PPC_64K_PAGES
+typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
+#else
+typedef struct { pte_t pte; } real_pte_t;
+#endif
+
+/* PMD level */
+typedef struct { unsigned long pmd; } pmd_t;
+#define pmd_val(x)     ((x).pmd)
+#define __pmd(x)       ((pmd_t) { (x) })
+
+/* PUD level exusts only on 4k pages */
+#ifndef CONFIG_PPC_64K_PAGES
+typedef struct { unsigned long pud; } pud_t;
+#define pud_val(x)     ((x).pud)
+#define __pud(x)       ((pud_t) { (x) })
+#endif
+
+/* PGD level */
+typedef struct { unsigned long pgd; } pgd_t;
+#define pgd_val(x)     ((x).pgd)
+#define __pgd(x)       ((pgd_t) { (x) })
+
+/* Page protection bits */
+typedef struct { unsigned long pgprot; } pgprot_t;
+#define pgprot_val(x)  ((x).pgprot)
+#define __pgprot(x)    ((pgprot_t) { (x) })
+
+#else
+
+/*
+ * .. while these make it easier on the compiler
+ */
+
+typedef pte_basic_t pte_t;
+#define pte_val(x)     (x)
+#define __pte(x)       (x)
+
+#ifdef CONFIG_PPC_64K_PAGES
+typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
+#else
+typedef unsigned long real_pte_t;
+#endif
+
+
+typedef unsigned long pmd_t;
+#define pmd_val(x)     (x)
+#define __pmd(x)       (x)
+
+#ifndef CONFIG_PPC_64K_PAGES
+typedef unsigned long pud_t;
+#define pud_val(x)     (x)
+#define __pud(x)       (x)
+#endif
+
+typedef unsigned long pgd_t;
+#define pgd_val(x)     (x)
+#define pgprot_val(x)  (x)
+
+typedef unsigned long pgprot_t;
+#define __pgd(x)       (x)
+#define __pgprot(x)    (x)
+
+#endif
+
+struct page;
+extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
+extern void copy_user_page(void *to, void *from, unsigned long vaddr,
+               struct page *p);
+extern int page_is_ram(unsigned long pfn);
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_POWERPC_PAGE_H */
diff --git a/include/asm-powerpc/page_32.h b/include/asm-powerpc/page_32.h
new file mode 100644 (file)
index 0000000..7259cfd
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _ASM_POWERPC_PAGE_32_H
+#define _ASM_POWERPC_PAGE_32_H
+
+#define VM_DATA_DEFAULT_FLAGS  VM_DATA_DEFAULT_FLAGS32
+
+#define PPC_MEMSTART   0
+
+#ifndef __ASSEMBLY__
+/*
+ * The basic type of a PTE - 64 bits for those CPUs with > 32 bit
+ * physical addressing.  For now this just the IBM PPC440.
+ */
+#ifdef CONFIG_PTE_64BIT
+typedef unsigned long long pte_basic_t;
+#define PTE_SHIFT      (PAGE_SHIFT - 3)        /* 512 ptes per page */
+#define PTE_FMT                "%16Lx"
+#else
+typedef unsigned long pte_basic_t;
+#define PTE_SHIFT      (PAGE_SHIFT - 2)        /* 1024 ptes per page */
+#define PTE_FMT                "%.8lx"
+#endif
+
+struct page;
+extern void clear_pages(void *page, int order);
+static inline void clear_page(void *page) { clear_pages(page, 0); }
+extern void copy_page(void *to, void *from);
+
+/* Pure 2^n version of get_order */
+extern __inline__ int get_order(unsigned long size)
+{
+       int lz;
+
+       size = (size-1) >> PAGE_SHIFT;
+       asm ("cntlzw %0,%1" : "=r" (lz) : "r" (size));
+       return 32 - lz;
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _ASM_POWERPC_PAGE_32_H */
diff --git a/include/asm-powerpc/page_64.h b/include/asm-powerpc/page_64.h
new file mode 100644 (file)
index 0000000..1e6e784
--- /dev/null
@@ -0,0 +1,178 @@
+#ifndef _ASM_POWERPC_PAGE_64_H
+#define _ASM_POWERPC_PAGE_64_H
+
+/*
+ * Copyright (C) 2001 PPC64 Team, IBM Corp
+ *
+ * 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.
+ */
+
+/*
+ * We always define HW_PAGE_SHIFT to 12 as use of 64K pages remains Linux
+ * specific, every notion of page number shared with the firmware, TCEs,
+ * iommu, etc... still uses a page size of 4K.
+ */
+#define HW_PAGE_SHIFT          12
+#define HW_PAGE_SIZE           (ASM_CONST(1) << HW_PAGE_SHIFT)
+#define HW_PAGE_MASK           (~(HW_PAGE_SIZE-1))
+
+/*
+ * PAGE_FACTOR is the number of bits factor between PAGE_SHIFT and
+ * HW_PAGE_SHIFT, that is 4K pages.
+ */
+#define PAGE_FACTOR            (PAGE_SHIFT - HW_PAGE_SHIFT)
+
+#define REGION_SIZE   4UL
+#define REGION_SHIFT  60UL
+#define REGION_MASK   (((1UL<<REGION_SIZE)-1UL)<<REGION_SHIFT)
+
+#define VMALLOCBASE            ASM_CONST(0xD000000000000000)
+#define VMALLOC_REGION_ID      (VMALLOCBASE >> REGION_SHIFT)
+#define KERNEL_REGION_ID       (KERNELBASE >> REGION_SHIFT)
+#define USER_REGION_ID         (0UL)
+#define REGION_ID(ea)          (((unsigned long)(ea)) >> REGION_SHIFT)
+
+/* Segment size */
+#define SID_SHIFT              28
+#define SID_MASK               0xfffffffffUL
+#define ESID_MASK              0xfffffffff0000000UL
+#define GET_ESID(x)            (((x) >> SID_SHIFT) & SID_MASK)
+
+#ifndef __ASSEMBLY__
+#include <asm/cache.h>
+
+typedef unsigned long pte_basic_t;
+
+static __inline__ void clear_page(void *addr)
+{
+       unsigned long lines, line_size;
+
+       line_size = ppc64_caches.dline_size;
+       lines = ppc64_caches.dlines_per_page;
+
+       __asm__ __volatile__(
+       "mtctr  %1      # clear_page\n\
+1:      dcbz   0,%0\n\
+       add     %0,%0,%3\n\
+       bdnz+   1b"
+        : "=r" (addr)
+        : "r" (lines), "0" (addr), "r" (line_size)
+       : "ctr", "memory");
+}
+
+extern void copy_4K_page(void *to, void *from);
+
+#ifdef CONFIG_PPC_64K_PAGES
+static inline void copy_page(void *to, void *from)
+{
+       unsigned int i;
+       for (i=0; i < (1 << (PAGE_SHIFT - 12)); i++) {
+               copy_4K_page(to, from);
+               to += 4096;
+               from += 4096;
+       }
+}
+#else /* CONFIG_PPC_64K_PAGES */
+static inline void copy_page(void *to, void *from)
+{
+       copy_4K_page(to, from);
+}
+#endif /* CONFIG_PPC_64K_PAGES */
+
+/* Log 2 of page table size */
+extern u64 ppc64_pft_size;
+
+/* Large pages size */
+#ifdef CONFIG_HUGETLB_PAGE
+extern unsigned int HPAGE_SHIFT;
+#else
+#define HPAGE_SHIFT PAGE_SHIFT
+#endif
+#define HPAGE_SIZE             ((1UL) << HPAGE_SHIFT)
+#define HPAGE_MASK             (~(HPAGE_SIZE - 1))
+#define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
+
+#endif /* __ASSEMBLY__ */
+
+#ifdef CONFIG_HUGETLB_PAGE
+
+#define HTLB_AREA_SHIFT                40
+#define HTLB_AREA_SIZE         (1UL << HTLB_AREA_SHIFT)
+#define GET_HTLB_AREA(x)       ((x) >> HTLB_AREA_SHIFT)
+
+#define LOW_ESID_MASK(addr, len)    (((1U << (GET_ESID(addr+len-1)+1)) \
+                                     - (1U << GET_ESID(addr))) & 0xffff)
+#define HTLB_AREA_MASK(addr, len)   (((1U << (GET_HTLB_AREA(addr+len-1)+1)) \
+                                     - (1U << GET_HTLB_AREA(addr))) & 0xffff)
+
+#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
+#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
+#define ARCH_HAS_SETCLEAR_HUGE_PTE
+
+#define touches_hugepage_low_range(mm, addr, len) \
+       (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas)
+#define touches_hugepage_high_range(mm, addr, len) \
+       (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas)
+
+#define __within_hugepage_low_range(addr, len, segmask) \
+       ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask))
+#define within_hugepage_low_range(addr, len) \
+       __within_hugepage_low_range((addr), (len), \
+                                   current->mm->context.low_htlb_areas)
+#define __within_hugepage_high_range(addr, len, zonemask) \
+       ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask))
+#define within_hugepage_high_range(addr, len) \
+       __within_hugepage_high_range((addr), (len), \
+                                   current->mm->context.high_htlb_areas)
+
+#define is_hugepage_only_range(mm, addr, len) \
+       (touches_hugepage_high_range((mm), (addr), (len)) || \
+         touches_hugepage_low_range((mm), (addr), (len)))
+#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
+
+#define in_hugepage_area(context, addr) \
+       (cpu_has_feature(CPU_FTR_16M_PAGE) && \
+        ( ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) || \
+          ( ((addr) < 0x100000000L) && \
+            ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) )
+
+#else /* !CONFIG_HUGETLB_PAGE */
+
+#define in_hugepage_area(mm, addr)     0
+
+#endif /* !CONFIG_HUGETLB_PAGE */
+
+#ifdef MODULE
+#define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
+#else
+#define __page_aligned \
+       __attribute__((__aligned__(PAGE_SIZE), \
+               __section__(".data.page_aligned")))
+#endif
+
+#define VM_DATA_DEFAULT_FLAGS \
+       (test_thread_flag(TIF_32BIT) ? \
+        VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
+
+/*
+ * This is the default if a program doesn't have a PT_GNU_STACK
+ * program header entry. The PPC64 ELF ABI has a non executable stack
+ * stack by default, so in the absense of a PT_GNU_STACK program header
+ * we turn execute permission off.
+ */
+#define VM_STACK_DEFAULT_FLAGS32       (VM_READ | VM_WRITE | VM_EXEC | \
+                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+#define VM_STACK_DEFAULT_FLAGS64       (VM_READ | VM_WRITE | \
+                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+#define VM_STACK_DEFAULT_FLAGS \
+       (test_thread_flag(TIF_32BIT) ? \
+        VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64)
+
+#include <asm-generic/page.h>
+
+#endif /* _ASM_POWERPC_PAGE_64_H */
index 9896fade98a74999cd9c298d029cfac5090f66fd..2e36e5a7f4f351b1dc8b4de02411ad6445857bb1 100644 (file)
@@ -14,7 +14,6 @@
 
 extern unsigned long isa_io_base;
 
-extern void pci_setup_pci_controller(struct pci_controller *hose);
 extern void pci_setup_phb_io(struct pci_controller *hose, int primary);
 extern void pci_setup_phb_io_dynamic(struct pci_controller *hose, int primary);
 
index f6f186b56b0f57966733f945db65fd42525232d5..d12382d292d421931234e1d59007e4f070bf376b 100644 (file)
@@ -177,8 +177,8 @@ struct thread_struct {
 #ifdef CONFIG_PPC64
        unsigned long   start_tb;       /* Start purr when proc switched in */
        unsigned long   accum_tb;       /* Total accumilated purr for process */
-       unsigned long   vdso_base;      /* base of the vDSO library */
 #endif
+       unsigned long   vdso_base;      /* base of the vDSO library */
        unsigned long   dabr;           /* Data address breakpoint register */
 #ifdef CONFIG_ALTIVEC
        /* Complete AltiVec register set */
similarity index 53%
rename from include/asm-ppc64/serial.h
rename to include/asm-powerpc/serial.h
index d6bcb79b7d7b5d78055d6f870904659fa1efbf8e..b273d630b32ffea833e3fec9fbf76243d2666d86 100644 (file)
@@ -1,21 +1,16 @@
 /*
- * include/asm-ppc64/serial.h
- */
-#ifndef _PPC64_SERIAL_H
-#define _PPC64_SERIAL_H
-
-/*
- * This assumes you have a 1.8432 MHz clock for your UART.
- *
- * It'd be nice if someone built a serial card with a 24.576 MHz
- * clock, since the 16550A is capable of handling a top speed of 1.5
- * megabits/second; but this requires the faster clock.
- *
  * 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.
  */
+#ifndef _ASM_POWERPC_SERIAL_H
+#define _ASM_POWERPC_SERIAL_H
+
+/*
+ * Serial ports are not listed here, because they are discovered
+ * through the device tree.
+ */
 
 /* Default baud base if not found in device-tree */
 #define BASE_BAUD ( 1843200 / 16 )
index 58d2aab416f8f21f7574acedeefaeffcf43878b8..ba1b34fdb967e86c7cd761f8e91c2317cd5adf36 100644 (file)
@@ -8,8 +8,8 @@
  * MAX_PHYSMEM_BITS            2^N: how much memory we can have in that space
  */
 #define SECTION_SIZE_BITS       24
-#define MAX_PHYSADDR_BITS       38
-#define MAX_PHYSMEM_BITS        36
+#define MAX_PHYSADDR_BITS       44
+#define MAX_PHYSMEM_BITS        44
 
 #ifdef CONFIG_MEMORY_HOTPLUG
 extern void create_section_mapping(unsigned long start, unsigned long end);
diff --git a/include/asm-powerpc/systemcfg.h b/include/asm-powerpc/systemcfg.h
deleted file mode 100644 (file)
index 36b5cbe..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _SYSTEMCFG_H
-#define _SYSTEMCFG_H
-
-/*
- * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
- *
- * 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.
- */
-
-/* Change Activity:
- * 2002/09/30 : bergner  : Created
- * End Change Activity
- */
-
-/*
- * If the major version changes we are incompatible.
- * Minor version changes are a hint.
- */
-#define SYSTEMCFG_MAJOR 1
-#define SYSTEMCFG_MINOR 1
-
-#ifndef __ASSEMBLY__
-
-#include <linux/unistd.h>
-
-#define SYSCALL_MAP_SIZE      ((__NR_syscalls + 31) / 32)
-
-struct systemcfg {
-       __u8  eye_catcher[16];          /* Eyecatcher: SYSTEMCFG:PPC64  0x00 */
-       struct {                        /* Systemcfg version numbers         */
-               __u32 major;            /* Major number                 0x10 */
-               __u32 minor;            /* Minor number                 0x14 */
-       } version;
-
-       __u32 platform;                 /* Platform flags               0x18 */
-       __u32 processor;                /* Processor type               0x1C */
-       __u64 processorCount;           /* # of physical processors     0x20 */
-       __u64 physicalMemorySize;       /* Size of real memory(B)       0x28 */
-       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
-       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
-       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
-       __u64 stamp_xsec;               /*                              0x48 */
-       __u64 tb_update_count;          /* Timebase atomicity ctr       0x50 */
-       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
-       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
-       /* next four are no longer used except to be exported to /proc */
-       __u32 dcache_size;              /* L1 d-cache size              0x60 */
-       __u32 dcache_line_size;         /* L1 d-cache line size         0x64 */
-       __u32 icache_size;              /* L1 i-cache size              0x68 */
-       __u32 icache_line_size;         /* L1 i-cache line size         0x6C */
-       __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of available syscalls 0x70 */
-       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of available syscalls */
-};
-
-#ifdef __KERNEL__
-extern struct systemcfg *_systemcfg; /* to be renamed */
-#endif
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _SYSTEMCFG_H */
index 2512e3836bf4de90ba130054b7a889920ab5031b..db8095cbe09bb0d59ba8432974ecfbef426ad9c9 100644 (file)
@@ -9,15 +9,7 @@
 
 static inline int cpu_to_node(int cpu)
 {
-       int node;
-
-       node = numa_cpu_lookup_table[cpu];
-
-#ifdef DEBUG_NUMA
-       BUG_ON(node == -1);
-#endif
-
-       return node;
+       return numa_cpu_lookup_table[cpu];
 }
 
 #define parent_node(node)      (node)
@@ -37,8 +29,6 @@ static inline int node_to_first_cpu(int node)
 #define pcibus_to_node(node)    (-1)
 #define pcibus_to_cpumask(bus) (cpu_online_map)
 
-#define nr_cpus_node(node)     (nr_cpus_in_node[node])
-
 /* sched_domains SD_NODE_INIT for PPC64 machines */
 #define SD_NODE_INIT (struct sched_domain) {           \
        .span                   = CPU_MASK_NONE,        \
@@ -51,6 +41,10 @@ static inline int node_to_first_cpu(int node)
        .cache_hot_time         = (10*1000000),         \
        .cache_nice_tries       = 1,                    \
        .per_cpu_gain           = 100,                  \
+       .busy_idx               = 3,                    \
+       .idle_idx               = 1,                    \
+       .newidle_idx            = 2,                    \
+       .wake_idx               = 1,                    \
        .flags                  = SD_LOAD_BALANCE       \
                                | SD_BALANCE_EXEC       \
                                | SD_BALANCE_NEWIDLE    \
similarity index 90%
rename from include/asm-ppc64/udbg.h
rename to include/asm-powerpc/udbg.h
index e3b927991851d357e6efe9d1ce30bda3f6d298ee..a383383bc4d43006f76dcad304ef0346c336a4fd 100644 (file)
@@ -1,9 +1,3 @@
-#ifndef __UDBG_HDR
-#define __UDBG_HDR
-
-#include <linux/compiler.h>
-#include <linux/init.h>
-
 /*
  * c 2001 PPC 64 Team, IBM Corp
  *
@@ -13,6 +7,12 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#ifndef _ASM_POWERPC_UDBG_H
+#define _ASM_POWERPC_UDBG_H
+
+#include <linux/compiler.h>
+#include <linux/init.h>
+
 extern void (*udbg_putc)(unsigned char c);
 extern unsigned char (*udbg_getc)(void);
 extern int (*udbg_getc_poll)(void);
@@ -28,4 +28,4 @@ extern void udbg_init_uart(void __iomem *comport, unsigned int speed);
 
 struct device_node;
 extern void udbg_init_scc(struct device_node *np);
-#endif
+#endif /* _ASM_POWERPC_UDBG_H */
similarity index 97%
rename from include/asm-ppc64/vdso.h
rename to include/asm-powerpc/vdso.h
index 85d8a7be25c482a359bee0baf3b96f028f577983..b9f9118b1607e667ebbc6df2f1145c18494180fe 100644 (file)
@@ -11,7 +11,7 @@
 #define VDSO32_MBASE   VDSO32_LBASE
 #define VDSO64_MBASE   VDSO64_LBASE
 
-#define VDSO_VERSION_STRING    LINUX_2.6.12
+#define VDSO_VERSION_STRING    LINUX_2.6.15
 
 /* Define if 64 bits VDSO has procedure descriptors */
 #undef VDS64_HAS_DESCRIPTORS
diff --git a/include/asm-powerpc/vdso_datapage.h b/include/asm-powerpc/vdso_datapage.h
new file mode 100644 (file)
index 0000000..411832d
--- /dev/null
@@ -0,0 +1,108 @@
+#ifndef _VDSO_DATAPAGE_H
+#define _VDSO_DATAPAGE_H
+
+/*
+ * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
+ * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>,
+ *                   IBM Corp.
+ *
+ * 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.
+ */
+
+
+/*
+ * Note about this structure:
+ *
+ * This structure was historically called systemcfg and exposed to
+ * userland via /proc/ppc64/systemcfg. Unfortunately, this became an
+ * ABI issue as some proprietary software started relying on being able
+ * to mmap() it, thus we have to keep the base layout at least for a
+ * few kernel versions.
+ *
+ * However, since ppc32 doesn't suffer from this backward handicap,
+ * a simpler version of the data structure is used there with only the
+ * fields actually used by the vDSO.
+ *
+ */
+
+/*
+ * If the major version changes we are incompatible.
+ * Minor version changes are a hint.
+ */
+#define SYSTEMCFG_MAJOR 1
+#define SYSTEMCFG_MINOR 1
+
+#ifndef __ASSEMBLY__
+
+#include <linux/unistd.h>
+
+#define SYSCALL_MAP_SIZE      ((__NR_syscalls + 31) / 32)
+
+/*
+ * So here is the ppc64 backward compatible version
+ */
+
+#ifdef CONFIG_PPC64
+
+struct vdso_data {
+       __u8  eye_catcher[16];          /* Eyecatcher: SYSTEMCFG:PPC64  0x00 */
+       struct {                        /* Systemcfg version numbers         */
+               __u32 major;            /* Major number                 0x10 */
+               __u32 minor;            /* Minor number                 0x14 */
+       } version;
+
+       __u32 platform;                 /* Platform flags               0x18 */
+       __u32 processor;                /* Processor type               0x1C */
+       __u64 processorCount;           /* # of physical processors     0x20 */
+       __u64 physicalMemorySize;       /* Size of real memory(B)       0x28 */
+       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
+       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
+       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
+       __u64 stamp_xsec;               /*                              0x48 */
+       __u64 tb_update_count;          /* Timebase atomicity ctr       0x50 */
+       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
+       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
+       __u32 dcache_size;              /* L1 d-cache size              0x60 */
+       __u32 dcache_line_size;         /* L1 d-cache line size         0x64 */
+       __u32 icache_size;              /* L1 i-cache size              0x68 */
+       __u32 icache_line_size;         /* L1 i-cache line size         0x6C */
+
+       /* those additional ones don't have to be located anywhere
+        * special as they were not part of the original systemcfg
+        */
+       __s32 wtom_clock_sec;                   /* Wall to monotonic clock */
+       __s32 wtom_clock_nsec;
+       __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls  */
+       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
+};
+
+#else /* CONFIG_PPC64 */
+
+/*
+ * And here is the simpler 32 bits version
+ */
+struct vdso_data {
+       __u64 tb_orig_stamp;            /* Timebase at boot             0x30 */
+       __u64 tb_ticks_per_sec;         /* Timebase tics / sec          0x38 */
+       __u64 tb_to_xs;                 /* Inverse of TB to 2^20        0x40 */
+       __u64 stamp_xsec;               /*                              0x48 */
+       __u32 tb_update_count;          /* Timebase atomicity ctr       0x50 */
+       __u32 tz_minuteswest;           /* Minutes west of Greenwich    0x58 */
+       __u32 tz_dsttime;               /* Type of dst correction       0x5C */
+       __s32 wtom_clock_sec;                   /* Wall to monotonic clock */
+       __s32 wtom_clock_nsec;
+       __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
+};
+
+#endif /* CONFIG_PPC64 */
+
+#ifdef __KERNEL__
+extern struct vdso_data *vdso_data;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _SYSTEMCFG_H */
index 43d2ebbc7748fba88bbd0dfbd6cbeb4ca6daa17e..b638b87cebe3381a0312e34bd7618810463e0df0 100644 (file)
@@ -1091,5 +1091,7 @@ typedef struct im_idma {
 #define CPM_IMMR_OFFSET        0x101a8
 #endif
 
+#define FCC_PSMR_RMII  ((uint)0x00020000)      /* Use RMII interface */
+
 #endif /* __CPM2__ */
 #endif /* __KERNEL__ */
index 50fb5e47094a169e26714857e90f909c280b7f9e..9383d0c13ff810a64c8f6c65b10f35097f9b8e95 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx Internal Memory Map
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor, Inc
  *
index 9092b920997a6012151ddd3cb08f43e11616ac0f..0fe396a2b666aa7b3481828c00365adc0761e9ed 100644 (file)
@@ -3,7 +3,7 @@
  *
  * IPIC external definitions and structure.
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor, Inc
  *
index ce212201db2aeec7c7ea9d161d4f66228c79953d..7cdf60fa69b63a91baf01b3bec3348471ce9378d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC83xx definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor, Inc
  *
index d98db980cd498cdfbdf424c471d166a4fd652eb1..9d14baea3d71000e0cebab13ed01fed743159b3e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * MPC85xx definitions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor, Inc
  *
diff --git a/include/asm-ppc/nvram.h b/include/asm-ppc/nvram.h
deleted file mode 100644 (file)
index 31ef16e..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * PreP compliant NVRAM access
- */
-
-#ifdef __KERNEL__
-#ifndef _PPC_NVRAM_H
-#define _PPC_NVRAM_H
-
-#define NVRAM_AS0  0x74
-#define NVRAM_AS1  0x75
-#define NVRAM_DATA 0x77
-
-
-/* RTC Offsets */
-
-#define MOTO_RTC_SECONDS               0x1FF9
-#define MOTO_RTC_MINUTES               0x1FFA
-#define MOTO_RTC_HOURS         0x1FFB
-#define MOTO_RTC_DAY_OF_WEEK           0x1FFC
-#define MOTO_RTC_DAY_OF_MONTH  0x1FFD
-#define MOTO_RTC_MONTH         0x1FFE
-#define MOTO_RTC_YEAR          0x1FFF
-#define MOTO_RTC_CONTROLA            0x1FF8
-#define MOTO_RTC_CONTROLB            0x1FF9
-
-/* PowerMac specific nvram stuffs */
-
-enum {
-       pmac_nvram_OF,          /* Open Firmware partition */
-       pmac_nvram_XPRAM,       /* MacOS XPRAM partition */
-       pmac_nvram_NR           /* MacOS Name Registry partition */
-};
-
-/* Return partition offset in nvram */
-extern int     pmac_get_partition(int partition);
-
-/* Direct access to XPRAM on PowerMacs */
-extern u8      pmac_xpram_read(int xpaddr);
-extern void    pmac_xpram_write(int xpaddr, u8 data);
-
-/* Synchronize NVRAM */
-extern void    nvram_sync(void);
-
-/* Normal access to NVRAM */
-extern unsigned char nvram_read_byte(int i);
-extern void nvram_write_byte(unsigned char c, int i);
-
-/* Some offsets in XPRAM */
-#define PMAC_XPRAM_MACHINE_LOC 0xe4
-#define PMAC_XPRAM_SOUND_VOLUME        0x08
-
-/* Machine location structure in PowerMac XPRAM */
-struct pmac_machine_location {
-       unsigned int    latitude;       /* 2+30 bit Fractional number */
-       unsigned int    longitude;      /* 2+30 bit Fractional number */
-       unsigned int    delta;          /* mix of GMT delta and DLS */
-};
-
-/*
- * /dev/nvram ioctls
- *
- * Note that PMAC_NVRAM_GET_OFFSET is still supported, but is
- * definitely obsolete. Do not use it if you can avoid it
- */
-
-#define OBSOLETE_PMAC_NVRAM_GET_OFFSET \
-                               _IOWR('p', 0x40, int)
-
-#define IOC_NVRAM_GET_OFFSET   _IOWR('p', 0x42, int)   /* Get NVRAM partition offset */
-#define IOC_NVRAM_SYNC         _IO('p', 0x43)          /* Sync NVRAM image */
-
-#endif
-#endif /* __KERNEL__ */
index fc44f7ca62d7699977e39918b543dbd658ea0d23..538e0c8ab2434758682d44d4e234e9f595b7ef6a 100644 (file)
@@ -1,9 +1,12 @@
 #ifndef _PPC_PAGE_H
 #define _PPC_PAGE_H
 
+#include <linux/config.h>
+#include <asm/asm-compat.h>
+
 /* PAGE_SHIFT determines the page size */
 #define PAGE_SHIFT     12
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
+#define PAGE_SIZE      (ASM_CONST(1) << PAGE_SHIFT)
 
 /*
  * Subtle: this is an int (not an unsigned long) and so it
@@ -169,5 +172,8 @@ extern __inline__ int get_order(unsigned long size)
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
+/* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */
+#define __HAVE_ARCH_GATE_AREA          1
+
 #endif /* __KERNEL__ */
 #endif /* _PPC_PAGE_H */
index 931b6de7ef536aa6688ffffc1884fecbe6be62dc..bdefd1c4a5581b5a4317587bd2377e075ea7ed81 100644 (file)
@@ -28,7 +28,7 @@ extern void pgd_free(pgd_t *pgd);
 #define pmd_populate_kernel(mm, pmd, pte)      \
                (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT)
 #define pmd_populate(mm, pmd, pte)     \
-               (pmd_val(*(pmd)) = (unsigned long)page_to_virt(pte) | _PMD_PRESENT)
+               (pmd_val(*(pmd)) = (unsigned long)lowmem_page_address(pte) | _PMD_PRESENT)
 #endif
 
 extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
index bba5305c29ed72f6c9407be3373183f030ecd569..83d8c77c124df3e2bae74b046c0cfce1d797821f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * PPC system definitions and library functions
  *
- * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2005 Freescale Semiconductor, Inc
  *
diff --git a/include/asm-ppc64/delay.h b/include/asm-ppc64/delay.h
deleted file mode 100644 (file)
index 05f198c..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _PPC64_DELAY_H
-#define _PPC64_DELAY_H
-
-/*
- * Copyright 1996, Paul Mackerras.
- *
- * 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.
- *
- * PPC64 Support added by Dave Engebretsen, Todd Inglett, Mike Corrigan,
- * Anton Blanchard.
- */
-
-extern unsigned long tb_ticks_per_usec;
-
-/* define these here to prevent circular dependencies */ 
-#define __HMT_low()    asm volatile("or 1,1,1")
-#define __HMT_medium() asm volatile("or 2,2,2")
-#define __barrier()    asm volatile("":::"memory")
-
-static inline unsigned long __get_tb(void)
-{
-       unsigned long rval;
-
-       asm volatile("mftb %0" : "=r" (rval));
-       return rval;
-}
-
-static inline void __delay(unsigned long loops)
-{
-       unsigned long start = __get_tb();
-
-       while((__get_tb()-start) < loops)
-               __HMT_low();
-       __HMT_medium();
-       __barrier();
-}
-
-static inline void udelay(unsigned long usecs)
-{
-       unsigned long loops = tb_ticks_per_usec * usecs;
-
-       __delay(loops);
-}
-
-#endif /* _PPC64_DELAY_H */
index 15e777ce0f4ab66fe61f64ff4fed055c4a86d7fc..54958d6cae0440353ade0ff8a73f8668a52e5bac 100644 (file)
@@ -8,15 +8,14 @@
 #define _ASM_MMZONE_H_
 
 #include <linux/config.h>
-#include <asm/smp.h>
 
-/* generic non-linear memory support:
+/*
+ * generic non-linear memory support:
  *
  * 1) we will not split memory into more chunks than will fit into the
  *    flags field of the struct page
  */
 
-
 #ifdef CONFIG_NEED_MULTIPLE_NODES
 
 extern struct pglist_data *node_data[];
@@ -30,44 +29,11 @@ extern struct pglist_data *node_data[];
  */
 
 extern int numa_cpu_lookup_table[];
-extern char *numa_memory_lookup_table;
 extern cpumask_t numa_cpumask_lookup_table[];
-extern int nr_cpus_in_node[];
 #ifdef CONFIG_MEMORY_HOTPLUG
 extern unsigned long max_pfn;
 #endif
 
-/* 16MB regions */
-#define MEMORY_INCREMENT_SHIFT 24
-#define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT)
-
-/* NUMA debugging, will not work on a DLPAR machine */
-#undef DEBUG_NUMA
-
-static inline int pa_to_nid(unsigned long pa)
-{
-       int nid;
-
-#ifdef CONFIG_MEMORY_HOTPLUG
-       /* kludge hot added sections default to node 0 */
-       if (pa >= (max_pfn << PAGE_SHIFT))
-               return 0;
-#endif
-       nid = numa_memory_lookup_table[pa >> MEMORY_INCREMENT_SHIFT];
-
-#ifdef DEBUG_NUMA
-       /* the physical address passed in is not in the map for the system */
-       if (nid == -1) {
-               printk("bad address: %lx\n", pa);
-               BUG();
-       }
-#endif
-
-       return nid;
-}
-
-#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
-
 /*
  * Following are macros that each numa implmentation must define.
  */
@@ -75,39 +41,10 @@ static inline int pa_to_nid(unsigned long pa)
 #define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
 #define node_end_pfn(nid)      (NODE_DATA(nid)->node_end_pfn)
 
-#ifdef CONFIG_DISCONTIGMEM
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define kvaddr_to_nid(kaddr)   pa_to_nid(__pa(kaddr))
-
-#define pfn_to_nid(pfn)                pa_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
-
-/* Written this way to avoid evaluating arguments twice */
-#define discontigmem_pfn_to_page(pfn) \
-({ \
-       unsigned long __tmp = pfn; \
-       (NODE_DATA(pfn_to_nid(__tmp))->node_mem_map + \
-        node_localnr(__tmp, pfn_to_nid(__tmp))); \
-})
-
-#define discontigmem_page_to_pfn(p) \
-({ \
-       struct page *__tmp = p; \
-       (((__tmp) - page_zone(__tmp)->zone_mem_map) + \
-        page_zone(__tmp)->zone_start_pfn); \
-})
-
-/* XXX fix for discontiguous physical memory */
-#define discontigmem_pfn_valid(pfn)            ((pfn) < num_physpages)
-
-#endif /* CONFIG_DISCONTIGMEM */
-
 #endif /* CONFIG_NEED_MULTIPLE_NODES */
 
 #ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
-#define early_pfn_to_nid(pfn)  pa_to_nid(((unsigned long)pfn) << PAGE_SHIFT)
+extern int __init early_pfn_to_nid(unsigned long pfn);
 #endif
 
 #endif /* _ASM_MMZONE_H_ */
diff --git a/include/asm-ppc64/page.h b/include/asm-ppc64/page.h
deleted file mode 100644 (file)
index e32f118..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-#ifndef _PPC64_PAGE_H
-#define _PPC64_PAGE_H
-
-/*
- * Copyright (C) 2001 PPC64 Team, IBM Corp
- *
- * 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/config.h>
-#include <asm/asm-compat.h>
-
-/*
- * We support either 4k or 64k software page size. When using 64k pages
- * however, wether we are really supporting 64k pages in HW or not is
- * irrelevant to those definitions. We always define HW_PAGE_SHIFT to 12
- * as use of 64k pages remains a linux kernel specific, every notion of
- * page number shared with the firmware, TCEs, iommu, etc... still assumes
- * a page size of 4096.
- */
-#ifdef CONFIG_PPC_64K_PAGES
-#define PAGE_SHIFT             16
-#else
-#define PAGE_SHIFT             12
-#endif
-
-#define PAGE_SIZE              (ASM_CONST(1) << PAGE_SHIFT)
-#define PAGE_MASK              (~(PAGE_SIZE-1))
-
-/* HW_PAGE_SHIFT is always 4k pages */
-#define HW_PAGE_SHIFT          12
-#define HW_PAGE_SIZE           (ASM_CONST(1) << HW_PAGE_SHIFT)
-#define HW_PAGE_MASK           (~(HW_PAGE_SIZE-1))
-
-/* PAGE_FACTOR is the number of bits factor between PAGE_SHIFT and
- * HW_PAGE_SHIFT, that is 4k pages
- */
-#define PAGE_FACTOR            (PAGE_SHIFT - HW_PAGE_SHIFT)
-
-/* Segment size */
-#define SID_SHIFT              28
-#define SID_MASK               0xfffffffffUL
-#define ESID_MASK              0xfffffffff0000000UL
-#define GET_ESID(x)            (((x) >> SID_SHIFT) & SID_MASK)
-
-/* Large pages size */
-
-#ifndef __ASSEMBLY__
-extern unsigned int HPAGE_SHIFT;
-#define HPAGE_SIZE             ((1UL) << HPAGE_SHIFT)
-#define HPAGE_MASK             (~(HPAGE_SIZE - 1))
-#define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
-#endif /* __ASSEMBLY__ */
-
-#ifdef CONFIG_HUGETLB_PAGE
-
-
-#define HTLB_AREA_SHIFT                40
-#define HTLB_AREA_SIZE         (1UL << HTLB_AREA_SHIFT)
-#define GET_HTLB_AREA(x)       ((x) >> HTLB_AREA_SHIFT)
-
-#define LOW_ESID_MASK(addr, len)    (((1U << (GET_ESID(addr+len-1)+1)) \
-                                     - (1U << GET_ESID(addr))) & 0xffff)
-#define HTLB_AREA_MASK(addr, len)   (((1U << (GET_HTLB_AREA(addr+len-1)+1)) \
-                                     - (1U << GET_HTLB_AREA(addr))) & 0xffff)
-
-#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
-#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
-#define ARCH_HAS_SETCLEAR_HUGE_PTE
-
-#define touches_hugepage_low_range(mm, addr, len) \
-       (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas)
-#define touches_hugepage_high_range(mm, addr, len) \
-       (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas)
-
-#define __within_hugepage_low_range(addr, len, segmask) \
-       ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask))
-#define within_hugepage_low_range(addr, len) \
-       __within_hugepage_low_range((addr), (len), \
-                                   current->mm->context.low_htlb_areas)
-#define __within_hugepage_high_range(addr, len, zonemask) \
-       ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask))
-#define within_hugepage_high_range(addr, len) \
-       __within_hugepage_high_range((addr), (len), \
-                                   current->mm->context.high_htlb_areas)
-
-#define is_hugepage_only_range(mm, addr, len) \
-       (touches_hugepage_high_range((mm), (addr), (len)) || \
-         touches_hugepage_low_range((mm), (addr), (len)))
-#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
-
-#define in_hugepage_area(context, addr) \
-       (cpu_has_feature(CPU_FTR_16M_PAGE) && \
-        ( ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) || \
-          ( ((addr) < 0x100000000L) && \
-            ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) )
-
-#else /* !CONFIG_HUGETLB_PAGE */
-
-#define in_hugepage_area(mm, addr)     0
-
-#endif /* !CONFIG_HUGETLB_PAGE */
-
-/* align addr on a size boundary - adjust address up/down if needed */
-#define _ALIGN_UP(addr,size)   (((addr)+((size)-1))&(~((size)-1)))
-#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
-
-/* align addr on a size boundary - adjust address up if needed */
-#define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       _ALIGN(addr, PAGE_SIZE)
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-#include <asm/cache.h>
-
-#undef STRICT_MM_TYPECHECKS
-
-#define REGION_SIZE   4UL
-#define REGION_SHIFT  60UL
-#define REGION_MASK   (((1UL<<REGION_SIZE)-1UL)<<REGION_SHIFT)
-
-static __inline__ void clear_page(void *addr)
-{
-       unsigned long lines, line_size;
-
-       line_size = ppc64_caches.dline_size;
-       lines = ppc64_caches.dlines_per_page;
-
-       __asm__ __volatile__(
-       "mtctr          %1      # clear_page\n\
-1:      dcbz   0,%0\n\
-       add     %0,%0,%3\n\
-       bdnz+   1b"
-        : "=r" (addr)
-        : "r" (lines), "0" (addr), "r" (line_size)
-       : "ctr", "memory");
-}
-
-extern void copy_4K_page(void *to, void *from);
-
-#ifdef CONFIG_PPC_64K_PAGES
-static inline void copy_page(void *to, void *from)
-{
-       unsigned int i;
-       for (i=0; i < (1 << (PAGE_SHIFT - 12)); i++) {
-               copy_4K_page(to, from);
-               to += 4096;
-               from += 4096;
-       }
-}
-#else /* CONFIG_PPC_64K_PAGES */
-static inline void copy_page(void *to, void *from)
-{
-       copy_4K_page(to, from);
-}
-#endif /* CONFIG_PPC_64K_PAGES */
-
-struct page;
-extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
-extern void copy_user_page(void *to, void *from, unsigned long vaddr, struct page *p);
-
-#ifdef STRICT_MM_TYPECHECKS
-/*
- * These are used to make use of C type-checking.  
- * Entries in the pte table are 64b, while entries in the pgd & pmd are 32b.
- */
-
-/* PTE level */
-typedef struct { unsigned long pte; } pte_t;
-#define pte_val(x)     ((x).pte)
-#define __pte(x)       ((pte_t) { (x) })
-
-/* 64k pages additionally define a bigger "real PTE" type that gathers
- * the "second half" part of the PTE for pseudo 64k pages
- */
-#ifdef CONFIG_PPC_64K_PAGES
-typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
-#else
-typedef struct { pte_t pte; } real_pte_t;
-#endif
-
-/* PMD level */
-typedef struct { unsigned long pmd; } pmd_t;
-#define pmd_val(x)     ((x).pmd)
-#define __pmd(x)       ((pmd_t) { (x) })
-
-/* PUD level exusts only on 4k pages */
-#ifndef CONFIG_PPC_64K_PAGES
-typedef struct { unsigned long pud; } pud_t;
-#define pud_val(x)     ((x).pud)
-#define __pud(x)       ((pud_t) { (x) })
-#endif
-
-/* PGD level */
-typedef struct { unsigned long pgd; } pgd_t;
-#define pgd_val(x)     ((x).pgd)
-#define __pgd(x)       ((pgd_t) { (x) })
-
-/* Page protection bits */
-typedef struct { unsigned long pgprot; } pgprot_t;
-#define pgprot_val(x)  ((x).pgprot)
-#define __pgprot(x)    ((pgprot_t) { (x) })
-
-#else
-
-/*
- * .. while these make it easier on the compiler
- */
-
-typedef unsigned long pte_t;
-#define pte_val(x)     (x)
-#define __pte(x)       (x)
-
-#ifdef CONFIG_PPC_64K_PAGES
-typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
-#else
-typedef unsigned long real_pte_t;
-#endif
-
-
-typedef unsigned long pmd_t;
-#define pmd_val(x)     (x)
-#define __pmd(x)       (x)
-
-#ifndef CONFIG_PPC_64K_PAGES
-typedef unsigned long pud_t;
-#define pud_val(x)     (x)
-#define __pud(x)       (x)
-#endif
-
-typedef unsigned long pgd_t;
-#define pgd_val(x)     (x)
-#define pgprot_val(x)  (x)
-
-typedef unsigned long pgprot_t;
-#define __pgd(x)       (x)
-#define __pgprot(x)    (x)
-
-#endif
-
-#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
-
-extern int page_is_ram(unsigned long pfn);
-
-extern u64 ppc64_pft_size;             /* Log 2 of page table size */
-
-/* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */
-#define __HAVE_ARCH_GATE_AREA          1
-
-#endif /* __ASSEMBLY__ */
-
-#ifdef MODULE
-#define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
-#else
-#define __page_aligned \
-       __attribute__((__aligned__(PAGE_SIZE), \
-               __section__(".data.page_aligned")))
-#endif
-
-
-/* This must match the -Ttext linker address            */
-/* Note: tophys & tovirt make assumptions about how     */
-/*       KERNELBASE is defined for performance reasons. */
-/*       When KERNELBASE moves, those macros may have   */
-/*             to change!                               */
-#define PAGE_OFFSET     ASM_CONST(0xC000000000000000)
-#define KERNELBASE      PAGE_OFFSET
-#define VMALLOCBASE     ASM_CONST(0xD000000000000000)
-
-#define VMALLOC_REGION_ID  (VMALLOCBASE >> REGION_SHIFT)
-#define KERNEL_REGION_ID   (KERNELBASE >> REGION_SHIFT)
-#define USER_REGION_ID     (0UL)
-#define REGION_ID(ea)     (((unsigned long)(ea)) >> REGION_SHIFT)
-
-#define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
-
-#ifdef CONFIG_DISCONTIGMEM
-#define page_to_pfn(page)      discontigmem_page_to_pfn(page)
-#define pfn_to_page(pfn)       discontigmem_pfn_to_page(pfn)
-#define pfn_valid(pfn)         discontigmem_pfn_valid(pfn)
-#endif
-#ifdef CONFIG_FLATMEM
-#define pfn_to_page(pfn)       (mem_map + (pfn))
-#define page_to_pfn(page)      ((unsigned long)((page) - mem_map))
-#define pfn_valid(pfn)         ((pfn) < max_mapnr)
-#endif
-
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-
-#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-
-/*
- * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
- * and needs to be executable.  This means the whole heap ends
- * up being executable.
- */
-#define VM_DATA_DEFAULT_FLAGS32        (VM_READ | VM_WRITE | VM_EXEC | \
-                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#define VM_DATA_DEFAULT_FLAGS64        (VM_READ | VM_WRITE | \
-                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#define VM_DATA_DEFAULT_FLAGS \
-       (test_thread_flag(TIF_32BIT) ? \
-        VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
-
-/*
- * This is the default if a program doesn't have a PT_GNU_STACK
- * program header entry. The PPC64 ELF ABI has a non executable stack
- * stack by default, so in the absense of a PT_GNU_STACK program header
- * we turn execute permission off.
- */
-#define VM_STACK_DEFAULT_FLAGS32       (VM_READ | VM_WRITE | VM_EXEC | \
-                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#define VM_STACK_DEFAULT_FLAGS64       (VM_READ | VM_WRITE | \
-                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#define VM_STACK_DEFAULT_FLAGS \
-       (test_thread_flag(TIF_32BIT) ? \
-        VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64)
-
-#endif /* __KERNEL__ */
-
-#include <asm-generic/page.h>
-
-#endif /* _PPC64_PAGE_H */
index efbdaece0cf022fdd10bb2228368448240836af6..cf04327a597af1107f98f836476aa5c9b725a86e 100644 (file)
@@ -61,12 +61,14 @@ struct pci_dn {
        int     busno;                  /* for pci devices */
        int     bussubno;               /* for pci devices */
        int     devfn;                  /* for pci devices */
+
+#ifdef CONFIG_PPC_PSERIES
        int     eeh_mode;               /* See eeh.h for possible EEH_MODEs */
        int     eeh_config_addr;
        int     eeh_check_count;        /* # times driver ignored error */
        int     eeh_freeze_count;       /* # times this device froze up. */
        int     eeh_is_bridge;          /* device is pci-to-pci bridge */
-
+#endif
        int     pci_ext_config_space;   /* for pci devices */
        struct  pci_controller *phb;    /* for pci devices */
        struct  iommu_table *iommu_table;       /* for phb's or bridges */
@@ -74,9 +76,9 @@ struct pci_dn {
        struct  device_node *node;      /* back-pointer to the device_node */
 #ifdef CONFIG_PPC_ISERIES
        struct  list_head Device_List;
-       int             Irq;            /* Assigned IRQ */
-       int             Flags;          /* Possible flags(disable/bist)*/
-       u8              LogicalSlot;    /* Hv Slot Index for Tces */
+       int     Irq;                    /* Assigned IRQ */
+       int     Flags;                  /* Possible flags(disable/bist)*/
+       u8      LogicalSlot;            /* Hv Slot Index for Tces */
 #endif
        u32     config_space[16];       /* saved PCI config space */
 };
@@ -136,6 +138,10 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
        return PCI_DN(busdn)->phb;
 }
 
+extern struct pci_controller *
+pcibios_alloc_controller(struct device_node *dev);
+extern void pcibios_free_controller(struct pci_controller *phb);
+
 /* Return values for ppc_md.pci_probe_mode function */
 #define PCI_PROBE_NONE         -1      /* Don't look at this bus at all */
 #define PCI_PROBE_NORMAL       0       /* Do normal PCI probing */
diff --git a/include/asm-ppc64/prom.h b/include/asm-ppc64/prom.h
deleted file mode 100644 (file)
index ddfe186..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-#ifndef _PPC64_PROM_H
-#define _PPC64_PROM_H
-
-/*
- * Definitions for talking to the Open Firmware PROM on
- * Power Macintosh computers.
- *
- * Copyright (C) 1996 Paul Mackerras.
- *
- * Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
- *
- * 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/config.h>
-#include <linux/proc_fs.h>
-#include <asm/atomic.h>
-
-#define PTRRELOC(x)     ((typeof(x))((unsigned long)(x) - offset))
-#define PTRUNRELOC(x)   ((typeof(x))((unsigned long)(x) + offset))
-#define RELOC(x)        (*PTRRELOC(&(x)))
-
-/* Definitions used by the flattened device tree */
-#define OF_DT_HEADER           0xd00dfeed      /* marker */
-#define OF_DT_BEGIN_NODE       0x1             /* Start of node, full name */
-#define OF_DT_END_NODE         0x2             /* End node */
-#define OF_DT_PROP             0x3             /* Property: name off, size,
-                                                * content */
-#define OF_DT_NOP              0x4             /* nop */
-#define OF_DT_END              0x9
-
-#define OF_DT_VERSION          0x10
-
-/*
- * This is what gets passed to the kernel by prom_init or kexec
- *
- * The dt struct contains the device tree structure, full pathes and
- * property contents. The dt strings contain a separate block with just
- * the strings for the property names, and is fully page aligned and
- * self contained in a page, so that it can be kept around by the kernel,
- * each property name appears only once in this page (cheap compression)
- *
- * the mem_rsvmap contains a map of reserved ranges of physical memory,
- * passing it here instead of in the device-tree itself greatly simplifies
- * the job of everybody. It's just a list of u64 pairs (base/size) that
- * ends when size is 0
- */
-struct boot_param_header
-{
-       u32     magic;                  /* magic word OF_DT_HEADER */
-       u32     totalsize;              /* total size of DT block */
-       u32     off_dt_struct;          /* offset to structure */
-       u32     off_dt_strings;         /* offset to strings */
-       u32     off_mem_rsvmap;         /* offset to memory reserve map */
-       u32     version;                /* format version */
-       u32     last_comp_version;      /* last compatible version */
-       /* version 2 fields below */
-       u32     boot_cpuid_phys;        /* Physical CPU id we're booting on */
-       /* version 3 fields below */
-       u32     dt_strings_size;        /* size of the DT strings block */
-};
-
-
-
-typedef u32 phandle;
-typedef u32 ihandle;
-
-struct address_range {
-       unsigned long space;
-       unsigned long address;
-       unsigned long size;
-};
-
-struct interrupt_info {
-       int     line;
-       int     sense;          /* +ve/-ve logic, edge or level, etc. */
-};
-
-struct pci_address {
-       u32 a_hi;
-       u32 a_mid;
-       u32 a_lo;
-};
-
-struct isa_address {
-       u32 a_hi;
-       u32 a_lo;
-};
-
-struct isa_range {
-       struct isa_address isa_addr;
-       struct pci_address pci_addr;
-       unsigned int size;
-};
-
-struct reg_property {
-       unsigned long address;
-       unsigned long size;
-};
-
-struct reg_property32 {
-       unsigned int address;
-       unsigned int size;
-};
-
-struct reg_property64 {
-       unsigned long address;
-       unsigned long size;
-};
-
-struct property {
-       char    *name;
-       int     length;
-       unsigned char *value;
-       struct property *next;
-};
-
-struct device_node {
-       char    *name;
-       char    *type;
-       phandle node;
-       phandle linux_phandle;
-       int     n_addrs;
-       struct  address_range *addrs;
-       int     n_intrs;
-       struct  interrupt_info *intrs;
-       char    *full_name;
-
-       struct  property *properties;
-       struct  device_node *parent;
-       struct  device_node *child;
-       struct  device_node *sibling;
-       struct  device_node *next;      /* next device of same type */
-       struct  device_node *allnext;   /* next in list of all nodes */
-       struct  proc_dir_entry *pde;    /* this node's proc directory */
-       struct  kref kref;
-       unsigned long _flags;
-       void    *data;
-#ifdef CONFIG_PPC_ISERIES
-       struct list_head Device_List;
-#endif
-};
-
-extern struct device_node *of_chosen;
-
-/* flag descriptions */
-#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
-
-#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
-#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
-
-/*
- * Until 32-bit ppc can add proc_dir_entries to its device_node
- * definition, we cannot refer to pde, name_link, and addr_link
- * in arch-independent code.
- */
-#define HAVE_ARCH_DEVTREE_FIXUPS
-
-static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
-{
-       dn->pde = de;
-}
-
-
-/* OBSOLETE: Old stlye node lookup */
-extern struct device_node *find_devices(const char *name);
-extern struct device_node *find_type_devices(const char *type);
-extern struct device_node *find_path_device(const char *path);
-extern struct device_node *find_compatible_devices(const char *type,
-                                                  const char *compat);
-extern struct device_node *find_all_nodes(void);
-
-/* New style node lookup */
-extern struct device_node *of_find_node_by_name(struct device_node *from,
-       const char *name);
-extern struct device_node *of_find_node_by_type(struct device_node *from,
-       const char *type);
-extern struct device_node *of_find_compatible_node(struct device_node *from,
-       const char *type, const char *compat);
-extern struct device_node *of_find_node_by_path(const char *path);
-extern struct device_node *of_find_node_by_phandle(phandle handle);
-extern struct device_node *of_find_all_nodes(struct device_node *prev);
-extern struct device_node *of_get_parent(const struct device_node *node);
-extern struct device_node *of_get_next_child(const struct device_node *node,
-                                            struct device_node *prev);
-extern struct device_node *of_node_get(struct device_node *node);
-extern void of_node_put(struct device_node *node);
-
-/* For scanning the flat device-tree at boot time */
-int __init of_scan_flat_dt(int (*it)(unsigned long node,
-                                    const char *uname, int depth,
-                                    void *data),
-                          void *data);
-void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
-                                unsigned long *size);
-
-/* For updating the device tree at runtime */
-extern void of_attach_node(struct device_node *);
-extern void of_detach_node(const struct device_node *);
-
-/* Other Prototypes */
-extern unsigned long prom_init(unsigned long, unsigned long, unsigned long,
-       unsigned long, unsigned long);
-extern void finish_device_tree(void);
-extern void unflatten_device_tree(void);
-extern void early_init_devtree(void *);
-extern int device_is_compatible(struct device_node *device, const char *);
-extern int machine_is_compatible(const char *compat);
-extern unsigned char *get_property(struct device_node *node, const char *name,
-                                  int *lenp);
-extern void print_properties(struct device_node *node);
-extern int prom_n_addr_cells(struct device_node* np);
-extern int prom_n_size_cells(struct device_node* np);
-extern int prom_n_intr_cells(struct device_node* np);
-extern void prom_get_irq_senses(unsigned char *senses, int off, int max);
-extern int prom_add_property(struct device_node* np, struct property* prop);
-
-#endif /* _PPC64_PROM_H */
diff --git a/include/asm-ppc64/system.h b/include/asm-ppc64/system.h
deleted file mode 100644 (file)
index bf9a6ab..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-#ifndef __PPC64_SYSTEM_H
-#define __PPC64_SYSTEM_H
-
-/*
- * 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/config.h>
-#include <linux/compiler.h>
-#include <asm/page.h>
-#include <asm/processor.h>
-#include <asm/hw_irq.h>
-#include <asm/synch.h>
-
-/*
- * Memory barrier.
- * The sync instruction guarantees that all memory accesses initiated
- * by this processor have been performed (with respect to all other
- * mechanisms that access memory).  The eieio instruction is a barrier
- * providing an ordering (separately) for (a) cacheable stores and (b)
- * loads and stores to non-cacheable memory (e.g. I/O devices).
- *
- * mb() prevents loads and stores being reordered across this point.
- * rmb() prevents loads being reordered across this point.
- * wmb() prevents stores being reordered across this point.
- * read_barrier_depends() prevents data-dependent loads being reordered
- *     across this point (nop on PPC).
- *
- * We have to use the sync instructions for mb(), since lwsync doesn't
- * order loads with respect to previous stores.  Lwsync is fine for
- * rmb(), though.
- * For wmb(), we use sync since wmb is used in drivers to order
- * stores to system memory with respect to writes to the device.
- * However, smp_wmb() can be a lighter-weight eieio barrier on
- * SMP since it is only used to order updates to system memory.
- */
-#define mb()   __asm__ __volatile__ ("sync" : : : "memory")
-#define rmb()  __asm__ __volatile__ ("lwsync" : : : "memory")
-#define wmb()  __asm__ __volatile__ ("sync" : : : "memory")
-#define read_barrier_depends()  do { } while(0)
-
-#define set_mb(var, value)     do { var = value; smp_mb(); } while (0)
-#define set_wmb(var, value)    do { var = value; smp_wmb(); } while (0)
-
-#ifdef CONFIG_SMP
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      eieio()
-#define smp_read_barrier_depends()  read_barrier_depends()
-#else
-#define smp_mb()       __asm__ __volatile__("": : :"memory")
-#define smp_rmb()      __asm__ __volatile__("": : :"memory")
-#define smp_wmb()      __asm__ __volatile__("": : :"memory")
-#define smp_read_barrier_depends()  do { } while(0)
-#endif /* CONFIG_SMP */
-
-#ifdef __KERNEL__
-struct task_struct;
-struct pt_regs;
-
-#ifdef CONFIG_DEBUGGER
-
-extern int (*__debugger)(struct pt_regs *regs);
-extern int (*__debugger_ipi)(struct pt_regs *regs);
-extern int (*__debugger_bpt)(struct pt_regs *regs);
-extern int (*__debugger_sstep)(struct pt_regs *regs);
-extern int (*__debugger_iabr_match)(struct pt_regs *regs);
-extern int (*__debugger_dabr_match)(struct pt_regs *regs);
-extern int (*__debugger_fault_handler)(struct pt_regs *regs);
-
-#define DEBUGGER_BOILERPLATE(__NAME) \
-static inline int __NAME(struct pt_regs *regs) \
-{ \
-       if (unlikely(__ ## __NAME)) \
-               return __ ## __NAME(regs); \
-       return 0; \
-}
-
-DEBUGGER_BOILERPLATE(debugger)
-DEBUGGER_BOILERPLATE(debugger_ipi)
-DEBUGGER_BOILERPLATE(debugger_bpt)
-DEBUGGER_BOILERPLATE(debugger_sstep)
-DEBUGGER_BOILERPLATE(debugger_iabr_match)
-DEBUGGER_BOILERPLATE(debugger_dabr_match)
-DEBUGGER_BOILERPLATE(debugger_fault_handler)
-
-#ifdef CONFIG_XMON
-extern void xmon_init(int enable);
-#endif
-
-#else
-static inline int debugger(struct pt_regs *regs) { return 0; }
-static inline int debugger_ipi(struct pt_regs *regs) { return 0; }
-static inline int debugger_bpt(struct pt_regs *regs) { return 0; }
-static inline int debugger_sstep(struct pt_regs *regs) { return 0; }
-static inline int debugger_iabr_match(struct pt_regs *regs) { return 0; }
-static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; }
-static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
-#endif
-
-extern int set_dabr(unsigned long dabr);
-extern void _exception(int signr, struct pt_regs *regs, int code,
-                      unsigned long addr);
-extern int fix_alignment(struct pt_regs *regs);
-extern void bad_page_fault(struct pt_regs *regs, unsigned long address,
-                          int sig);
-extern void show_regs(struct pt_regs * regs);
-extern void low_hash_fault(struct pt_regs *regs, unsigned long address);
-extern int die(const char *str, struct pt_regs *regs, long err);
-
-extern int _get_PVR(void);
-extern void giveup_fpu(struct task_struct *);
-extern void disable_kernel_fp(void);
-extern void flush_fp_to_thread(struct task_struct *);
-extern void enable_kernel_fp(void);
-extern void giveup_altivec(struct task_struct *);
-extern void disable_kernel_altivec(void);
-extern void enable_kernel_altivec(void);
-extern int emulate_altivec(struct pt_regs *);
-extern void cvt_fd(float *from, double *to, struct thread_struct *thread);
-extern void cvt_df(double *from, float *to, struct thread_struct *thread);
-
-#ifdef CONFIG_ALTIVEC
-extern void flush_altivec_to_thread(struct task_struct *);
-#else
-static inline void flush_altivec_to_thread(struct task_struct *t)
-{
-}
-#endif
-
-static inline void flush_spe_to_thread(struct task_struct *t)
-{
-}
-
-extern int mem_init_done;      /* set on boot once kmalloc can be called */
-extern unsigned long memory_limit;
-
-/* EBCDIC -> ASCII conversion for [0-9A-Z] on iSeries */
-extern unsigned char e2a(unsigned char);
-
-extern struct task_struct *__switch_to(struct task_struct *,
-                                      struct task_struct *);
-#define switch_to(prev, next, last)    ((last) = __switch_to((prev), (next)))
-
-struct thread_struct;
-extern struct task_struct * _switch(struct thread_struct *prev,
-                                   struct thread_struct *next);
-
-extern unsigned long klimit;
-
-extern int powersave_nap;      /* set if nap mode can be used in idle loop */
-
-/*
- * Atomic exchange
- *
- * Changes the memory location '*ptr' to be val and returns
- * the previous value stored there.
- *
- * Inline asm pulled from arch/ppc/kernel/misc.S so ppc64
- * is more like most of the other architectures.
- */
-static __inline__ unsigned long
-__xchg_u32(volatile unsigned int *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       EIEIO_ON_SMP
-"1:    lwarx %0,0,%3           # __xchg_u32\n\
-       stwcx. %2,0,%3\n\
-2:     bne- 1b"
-       ISYNC_ON_SMP
-       : "=&r" (dummy), "=m" (*m)
-       : "r" (val), "r" (m)
-       : "cc", "memory");
-
-       return (dummy);
-}
-
-static __inline__ unsigned long
-__xchg_u64(volatile long *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       EIEIO_ON_SMP
-"1:    ldarx %0,0,%3           # __xchg_u64\n\
-       stdcx. %2,0,%3\n\
-2:     bne- 1b"
-       ISYNC_ON_SMP
-       : "=&r" (dummy), "=m" (*m)
-       : "r" (val), "r" (m)
-       : "cc", "memory");
-
-       return (dummy);
-}
-
-/*
- * This function doesn't exist, so you'll get a linker error
- * if something tries to do an invalid xchg().
- */
-extern void __xchg_called_with_bad_pointer(void);
-
-static __inline__ unsigned long
-__xchg(volatile void *ptr, unsigned long x, unsigned int size)
-{
-       switch (size) {
-       case 4:
-               return __xchg_u32(ptr, x);
-       case 8:
-               return __xchg_u64(ptr, x);
-       }
-       __xchg_called_with_bad_pointer();
-       return x;
-}
-
-#define xchg(ptr,x)                                                         \
-  ({                                                                        \
-     __typeof__(*(ptr)) _x_ = (x);                                          \
-     (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \
-  })
-
-#define tas(ptr) (xchg((ptr),1))
-
-#define __HAVE_ARCH_CMPXCHG    1
-
-static __inline__ unsigned long
-__cmpxchg_u32(volatile unsigned int *p, unsigned long old, unsigned long new)
-{
-       unsigned int prev;
-
-       __asm__ __volatile__ (
-       EIEIO_ON_SMP
-"1:    lwarx   %0,0,%2         # __cmpxchg_u32\n\
-       cmpw    0,%0,%3\n\
-       bne-    2f\n\
-       stwcx.  %4,0,%2\n\
-       bne-    1b"
-       ISYNC_ON_SMP
-       "\n\
-2:"
-       : "=&r" (prev), "=m" (*p)
-       : "r" (p), "r" (old), "r" (new), "m" (*p)
-       : "cc", "memory");
-
-       return prev;
-}
-
-static __inline__ unsigned long
-__cmpxchg_u64(volatile unsigned long *p, unsigned long old, unsigned long new)
-{
-       unsigned long prev;
-
-       __asm__ __volatile__ (
-       EIEIO_ON_SMP
-"1:    ldarx   %0,0,%2         # __cmpxchg_u64\n\
-       cmpd    0,%0,%3\n\
-       bne-    2f\n\
-       stdcx.  %4,0,%2\n\
-       bne-    1b"
-       ISYNC_ON_SMP
-       "\n\
-2:"
-       : "=&r" (prev), "=m" (*p)
-       : "r" (p), "r" (old), "r" (new), "m" (*p)
-       : "cc", "memory");
-
-       return prev;
-}
-
-/* This function doesn't exist, so you'll get a linker error
-   if something tries to do an invalid cmpxchg().  */
-extern void __cmpxchg_called_with_bad_pointer(void);
-
-static __inline__ unsigned long
-__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new,
-         unsigned int size)
-{
-       switch (size) {
-       case 4:
-               return __cmpxchg_u32(ptr, old, new);
-       case 8:
-               return __cmpxchg_u64(ptr, old, new);
-       }
-       __cmpxchg_called_with_bad_pointer();
-       return old;
-}
-
-#define cmpxchg(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-       (unsigned long)(n),sizeof(*(ptr))))
-
-/*
- * We handle most unaligned accesses in hardware. On the other hand 
- * unaligned DMA can be very expensive on some ppc64 IO chips (it does
- * powers of 2 writes until it reaches sufficient alignment).
- *
- * Based on this we disable the IP header alignment in network drivers.
- */
-#define NET_IP_ALIGN   0
-
-#define arch_align_stack(x) (x)
-
-extern unsigned long reloc_offset(void);
-
-#endif /* __KERNEL__ */
-#endif
index 9d86ba6f12d004031b0338c2e1ffd9ccb5f1fae2..b3bd4f679f727d2c3bc24293d845e6f6166ff471 100644 (file)
@@ -198,6 +198,18 @@ atomic_compare_and_swap(int expected_oldval,int new_val,atomic_t *v)
         return retval;
 }
 
+#define atomic_cmpxchg(v, o, n) (atomic_compare_and_swap((o), (n), &((v)->counter)))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define smp_mb__before_atomic_dec()    smp_mb()
 #define smp_mb__after_atomic_dec()     smp_mb()
 #define smp_mb__before_atomic_inc()    smp_mb()
index 3c4f805da1ac929fd7e7d7bdcb562882a7847645..aabfd334462c178bbba76327a86a48a1efef70ab 100644 (file)
@@ -87,6 +87,35 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v)
 #define atomic_inc(v) atomic_add(1,(v))
 #define atomic_dec(v) atomic_sub(1,(v))
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       local_irq_restore(flags);
+
+       return ret != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t *v)
 {
        unsigned long flags;
index 8c3872d3e65f6f4e12ac10c3d2144ff14af7e22a..927a2bc27b3086140bea65c7345f49b2f97bd995 100644 (file)
@@ -99,6 +99,35 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v)
 #define atomic_inc(v) atomic_add(1,(v))
 #define atomic_dec(v) atomic_sub(1,(v))
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       local_irq_restore(flags);
+
+       return ret != u;
+}
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t *v)
 {
        unsigned long flags;
index 37f6ab601c3ddf846392e1ef8d732a778e10a55e..62bec7ad271c496e81a8f2d95d4f4377cb16c952 100644 (file)
@@ -19,6 +19,8 @@ typedef struct { volatile int counter; } atomic_t;
 #define ATOMIC_INIT(i)  { (i) }
 
 extern int __atomic_add_return(int, atomic_t *);
+extern int atomic_cmpxchg(atomic_t *, int, int);
+extern int atomic_add_unless(atomic_t *, int, int);
 extern void atomic_set(atomic_t *, int);
 
 #define atomic_read(v)          ((v)->counter)
@@ -48,6 +50,8 @@ extern void atomic_set(atomic_t *, int);
 #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
 #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
 
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 /* This is the old 24-bit implementation.  It's still used internally
  * by some sparc-specific code, notably the semaphore implementation.
  */
index e175afcf2cdeb852d712a40f51b87678dbb26521..8198c3d0d0074368b0d9fbba5d72969b403c4884 100644 (file)
@@ -70,6 +70,18 @@ extern int atomic64_sub_ret(int, atomic64_t *);
 #define atomic_add_negative(i, v) (atomic_add_ret(i, v) < 0)
 #define atomic64_add_negative(i, v) (atomic64_add_ret(i, v) < 0)
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 /* Atomic operations are already serializing */
 #ifdef CONFIG_SMP
 #define smp_mb__before_atomic_dec()    membar_storeload_loadload();
index 395268a8c0dec1787fca9f39d29eab8df1d51797..bede3172ce7f7e999e202fde6b04d31a6e281478 100644 (file)
@@ -90,6 +90,36 @@ static __inline__ void atomic_clear_mask (unsigned long mask, unsigned long *add
 #define atomic_dec_and_test(v)         (atomic_sub_return (1, (v)) == 0)
 #define atomic_add_negative(i,v)       (atomic_add_return ((i), (v)) < 0)
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (likely(ret == old))
+               v->counter = new;
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int ret;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       ret = v->counter;
+       if (ret != u)
+               v->counter += a;
+       local_irq_restore(flags);
+
+       return ret != u;
+}
+
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 /* Atomic operations are already serializing on ARM */
 #define smp_mb__before_atomic_dec()    barrier()
 #define smp_mb__after_atomic_dec()     barrier()
index 5dfca8047cbec2a7c49952d369c24d9490f2e37c..d98488cd5af1fb0dd793863ebdb74ed36b6e4be6 100644 (file)
@@ -5,6 +5,8 @@
 #include <linux/threads.h>
 #include <linux/cache.h>
 
+#include <asm/irq.h>
+
 typedef struct {
        unsigned int __softirq_pending;
 } ____cacheline_aligned irq_cpustat_t;
@@ -22,4 +24,6 @@ typedef struct {
 # error HARDIRQ_BITS is too low!
 #endif
 
+void ack_bad_irq(unsigned int irq);
+
 #endif /* __V850_HARDIRQ_H__ */
index 6c5d5ca8383a2abf4e2bd437bdb4ea865a6ec1e5..5647b7de1749a8589f677092e770c015f1d7fa8c 100644 (file)
@@ -111,6 +111,8 @@ extern unsigned int nmi_watchdog;
 
 extern int disable_timer_pin_1;
 
+extern void setup_threshold_lvt(unsigned long lvt_off);
+
 #endif /* CONFIG_X86_LOCAL_APIC */
 
 extern unsigned boot_cpu_id;
index fc4c5956e1eaf82d76b4f1e1bc98de2b26bbfab3..0866ef67f198d8380a8241727ea21f0a16a19ec1 100644 (file)
@@ -360,6 +360,27 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
        return atomic_add_return(-i,v);
 }
 
+#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 #define atomic_inc_return(v)  (atomic_add_return(1,v))
 #define atomic_dec_return(v)  (atomic_sub_return(1,v))
 
index eda62bae1240366bd83ad33f6e97284cca260d66..33e53424128b33a4096162bfe29848b2885a8b16 100644 (file)
@@ -9,6 +9,6 @@
 /* L1 cache line size */
 #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
-#define L1_CACHE_SHIFT_MAX 6   /* largest L1 which this arch supports */
+#define L1_CACHE_SHIFT_MAX 7   /* largest L1 which this arch supports */
 
 #endif
index 68ac3c62fe3defd95145eb2bc80b7c2361c2e1d7..33764869387bc1c5ad9a707df503e5eef0c8bedf 100644 (file)
@@ -98,16 +98,19 @@ static inline void _set_gate(void *adr, unsigned type, unsigned long func, unsig
 
 static inline void set_intr_gate(int nr, void *func) 
 { 
+       BUG_ON((unsigned)nr > 0xFF);
        _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, 0); 
 } 
 
 static inline void set_intr_gate_ist(int nr, void *func, unsigned ist) 
 { 
+       BUG_ON((unsigned)nr > 0xFF);
        _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, ist); 
 } 
 
 static inline void set_system_gate(int nr, void *func) 
 { 
+       BUG_ON((unsigned)nr > 0xFF);
        _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, 0); 
 } 
 
@@ -129,9 +132,16 @@ static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned
 
 static inline void set_tss_desc(unsigned cpu, void *addr)
 { 
-       set_tssldt_descriptor(&cpu_gdt_table[cpu][GDT_ENTRY_TSS], (unsigned long)addr, 
-                             DESC_TSS,
-                             sizeof(struct tss_struct) - 1);
+       /*
+        * sizeof(unsigned long) coming from an extra "long" at the end
+        * of the iobitmap. See tss_struct definition in processor.h
+        *
+        * -1? seg base+limit should be pointing to the address of the
+        * last valid byte
+        */
+       set_tssldt_descriptor(&cpu_gdt_table[cpu][GDT_ENTRY_TSS],
+               (unsigned long)addr, DESC_TSS,
+               IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
 } 
 
 static inline void set_ldt_desc(unsigned cpu, void *addr, int size)
index 16fa3a064d0cf2d6b65d9785c2cd2a4653fa61a8..6f2a817b6a7c6d1ce382e6850a1a3cc3ff0c4078 100644 (file)
 
 #define MAX_DMA_CHANNELS       8
 
-/* The maximum address that we can perform a DMA transfer to on this platform */
-#define MAX_DMA_ADDRESS      (PAGE_OFFSET+0x1000000)
+
+/* 16MB ISA DMA zone */
+#define MAX_DMA_PFN   ((16*1024*1024) >> PAGE_SHIFT)
+
+/* 4GB broken PCI/AGP hardware bus master zone */
+#define MAX_DMA32_PFN ((4UL*1024*1024*1024) >> PAGE_SHIFT)
+
+/* Compat define for old dma zone */
+#define MAX_DMA_ADDRESS ((unsigned long)__va(MAX_DMA_PFN << PAGE_SHIFT))
 
 /* 8237 DMA controllers */
 #define IO_DMA1_BASE   0x00    /* 8 bit slave DMA, channels 0..3 */
index a3877f5709986e80f5dfdfe12b2d7a191face5ff..c20c28f5c7a00aa017ff38ddc4f26c95dabd978d 100644 (file)
 #define HPET_CFG       0x010
 #define HPET_STATUS    0x020
 #define HPET_COUNTER   0x0f0
-#define HPET_T0_CFG    0x100
-#define HPET_T0_CMP    0x108
-#define HPET_T0_ROUTE  0x110
-#define HPET_T1_CFG    0x120
-#define HPET_T1_CMP    0x128
-#define HPET_T1_ROUTE  0x130
-#define HPET_T2_CFG    0x140
-#define HPET_T2_CMP    0x148
-#define HPET_T2_ROUTE  0x150
+#define HPET_Tn_OFFSET 0x20
+#define HPET_Tn_CFG(n)  (0x100 + (n) * HPET_Tn_OFFSET)
+#define HPET_Tn_ROUTE(n) (0x104 + (n) * HPET_Tn_OFFSET)
+#define HPET_Tn_CMP(n)  (0x108 + (n) * HPET_Tn_OFFSET)
+#define HPET_T0_CFG    HPET_Tn_CFG(0)
+#define HPET_T0_CMP    HPET_Tn_CMP(0)
+#define HPET_T1_CFG    HPET_Tn_CFG(1)
+#define HPET_T1_CMP    HPET_Tn_CMP(1)
 
 #define HPET_ID_VENDOR 0xffff0000
 #define HPET_ID_LEGSUP 0x00008000
+#define HPET_ID_64BIT  0x00002000
 #define HPET_ID_NUMBER 0x00001f00
 #define HPET_ID_REV    0x000000ff
 #define        HPET_ID_NUMBER_SHIFT    8
 #define        HPET_LEGACY_8254        2
 #define        HPET_LEGACY_RTC         8
 
-#define HPET_TN_ENABLE         0x004
-#define HPET_TN_PERIODIC       0x008
-#define HPET_TN_PERIODIC_CAP   0x010
-#define HPET_TN_SETVAL         0x040
-#define HPET_TN_32BIT          0x100
+#define HPET_TN_LEVEL          0x0002
+#define HPET_TN_ENABLE         0x0004
+#define HPET_TN_PERIODIC       0x0008
+#define HPET_TN_PERIODIC_CAP   0x0010
+#define HPET_TN_64BIT_CAP      0x0020
+#define HPET_TN_SETVAL         0x0040
+#define HPET_TN_32BIT          0x0100
+#define HPET_TN_ROUTE          0x3e00
+#define HPET_TN_FSB            0x4000
+#define HPET_TN_FSB_CAP                0x8000
+
+#define HPET_TN_ROUTE_SHIFT    9
 
 extern int is_hpet_enabled(void);
 extern int hpet_rtc_timer_init(void);
index dc97668ea0f9d3bc76ffa960fdfc50e596745847..c14a8c7267a69b4230ca0b92a68ffa9db5686b92 100644 (file)
@@ -55,7 +55,7 @@ struct hw_interrupt_type;
 #define CALL_FUNCTION_VECTOR   0xfc
 #define KDB_VECTOR             0xfb    /* reserved for KDB */
 #define THERMAL_APIC_VECTOR    0xfa
-/* 0xf9 free */
+#define THRESHOLD_APIC_VECTOR   0xf9
 #define INVALIDATE_TLB_VECTOR_END      0xf8
 #define INVALIDATE_TLB_VECTOR_START    0xf0    /* f0-f8 used for TLB flush */
 
index 6efa00fe4e7be71d3404d52f305aabe3b8e4ea0c..c7bc9c0525ba94e043ace30292192747a953e956 100644 (file)
@@ -165,6 +165,11 @@ struct siginfo_t;
 int do_get_thread_area(struct thread_struct *t, struct user_desc __user *info);
 int do_set_thread_area(struct thread_struct *t, struct user_desc __user *info);
 int ia32_child_tls(struct task_struct *p, struct pt_regs *childregs);
+
+struct linux_binprm;
+extern int ia32_setup_arg_pages(struct linux_binprm *bprm,
+                               unsigned long stack_top, int exec_stack);
+
 #endif
 
 #endif /* !CONFIG_IA32_SUPPORT */
index 869249db6795bada384358c713a2cec928ef512c..5d298b799a9f5ff6c036efad1b8f6afc6d899820 100644 (file)
@@ -67,6 +67,8 @@ struct mce_log {
 /* Software defined banks */
 #define MCE_EXTENDED_BANK      128
 #define MCE_THERMAL_BANK       MCE_EXTENDED_BANK + 0
+#define MCE_THRESHOLD_BASE      MCE_EXTENDED_BANK + 1 /* MCE_AMD */
+#define MCE_THRESHOLD_DRAM_ECC  MCE_THRESHOLD_BASE + 4
 
 void mce_log(struct mce *m);
 #ifdef CONFIG_X86_MCE_INTEL
@@ -77,4 +79,12 @@ static inline void mce_intel_feature_init(struct cpuinfo_x86 *c)
 }
 #endif
 
+#ifdef CONFIG_X86_MCE_AMD
+void mce_amd_feature_init(struct cpuinfo_x86 *c);
+#else
+static inline void mce_amd_feature_init(struct cpuinfo_x86 *c)
+{
+}
+#endif
+
 #endif
index b40c661f111e32b58f2c07bdd081a89fa4aa4b40..69baaa8a3ce0078b5f9226b218bc0944272bc9c4 100644 (file)
 /* Simple perfect hash to map physical addresses to node numbers */
 extern int memnode_shift; 
 extern u8  memnodemap[NODEMAPSIZE]; 
-extern int maxnode;
 
 extern struct pglist_data *node_data[];
 
 static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) 
 { 
-       int nid; 
+       unsigned nid; 
        VIRTUAL_BUG_ON((addr >> memnode_shift) >= NODEMAPSIZE);
        nid = memnodemap[addr >> memnode_shift]; 
-       VIRTUAL_BUG_ON(nid > maxnode); 
+       VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]); 
        return nid; 
 } 
 
@@ -41,9 +40,7 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
 #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
 #define kvaddr_to_nid(kaddr)   phys_to_nid(__pa(kaddr))
 
-/* AK: this currently doesn't deal with invalid addresses. We'll see 
-   if the 2.5 kernel doesn't pass them
-   (2.4 used to). */
+/* Requires pfn_valid(pfn) to be true */
 #define pfn_to_page(pfn) ({ \
        int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT);    \
        ((pfn) - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map;   \
index f267e10c023df25debbba406a52f6a237a2bebb4..6f8a17d105abaeb7ac90f222b84bea64e64983d4 100644 (file)
@@ -16,7 +16,7 @@
 /*
  * A maximum of 255 APICs with the current APIC ID architecture.
  */
-#define MAX_APICS 128
+#define MAX_APICS 255
 
 struct intel_mp_floating
 {
@@ -157,7 +157,8 @@ struct mpc_config_lintsrc
  */
 
 #define MAX_MP_BUSSES 256
-#define MAX_IRQ_SOURCES 256
+/* Each PCI slot may be a combo card with its own bus.  4 IRQ pins per slot. */
+#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4)
 enum mp_bustype {
        MP_BUS_ISA = 1,
        MP_BUS_EISA,
@@ -172,7 +173,7 @@ extern int smp_found_config;
 extern void find_smp_config (void);
 extern void get_smp_config (void);
 extern int nr_ioapics;
-extern int apic_version [MAX_APICS];
+extern unsigned char apic_version [MAX_APICS];
 extern int mp_irq_entries;
 extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
 extern int mpc_default_type;
index 85c427e472bf9466946367d7a631d7acded36df7..356e0e82f50bdbb0f21d98b168d3eb93f0a7ee2c 100644 (file)
@@ -11,8 +11,6 @@
 #include <asm/smp.h>
 
 #define LAST_DEVICE_VECTOR             232
-#define MSI_DEST_MODE                  MSI_LOGICAL_MODE
-#define MSI_TARGET_CPU_SHIFT           12
-#define MSI_TARGET_CPU                 logical_smp_processor_id()
+#define MSI_TARGET_CPU_SHIFT   12
 
 #endif /* ASM_MSI_H */
index 5a7fe3c6c3d8427c51e3bbf8daf54c81a4ec05dc..24dc39651bc4780d5f1166e49d31c7bbfa328503 100644 (file)
@@ -19,7 +19,7 @@
                            : "=a" (a__), "=d" (b__) \
                            : "c" (msr)); \
        val = a__ | (b__<<32); \
-} while(0)
+} while(0)
 
 #define wrmsr(msr,val1,val2) \
      __asm__ __volatile__("wrmsr" \
index bcf55c3f7f7f35e0f162c504c5f6030578a857f8..d51e56fdc3da04d534a5cf618548b0956f1d7868 100644 (file)
@@ -17,6 +17,8 @@ extern void numa_add_cpu(int cpu);
 extern void numa_init_array(void);
 extern int numa_off;
 
+extern void numa_set_node(int cpu, int node);
+
 extern unsigned char apicid_to_node[256];
 
 #define NUMA_NO_NODE 0xff
index e5ab4d231f2ce2d837dea8476e7a024f5436060a..06e489f32472ed0c3241aa651d59a4005b2160cc 100644 (file)
@@ -11,7 +11,7 @@
 #define PAGE_SIZE      (1UL << PAGE_SHIFT)
 #endif
 #define PAGE_MASK      (~(PAGE_SIZE-1))
-#define PHYSICAL_PAGE_MASK     (~(PAGE_SIZE-1) & (__PHYSICAL_MASK << PAGE_SHIFT))
+#define PHYSICAL_PAGE_MASK     (~(PAGE_SIZE-1) & __PHYSICAL_MASK)
 
 #define THREAD_ORDER 1 
 #ifdef __ASSEMBLY__
index bbf89aa8a1afe67a7178b5ada67c3e7368e71484..8733ccfa442ef7802967fd05d4c84859691ba74e 100644 (file)
@@ -15,6 +15,7 @@ struct x8664_pda {
         int irqcount;              /* Irq nesting counter. Starts with -1 */   
        int cpunumber;              /* Logical CPU number */
        char *irqstackptr;      /* top of irqstack */
+       int nodenumber;             /* number of current node */
        unsigned int __softirq_pending;
        unsigned int __nmi_count;       /* number of NMI on this CPUs */
        struct mm_struct *active_mm;
index 7309fffeec9a04fe0b45abd0b7a39060a9abe19d..ecf58c7c16500908f40d93f76e5f00959d3ac9ca 100644 (file)
@@ -16,6 +16,7 @@ extern pud_t level3_physmem_pgt[512];
 extern pud_t level3_ident_pgt[512];
 extern pmd_t level2_kernel_pgt[512];
 extern pgd_t init_level4_pgt[];
+extern pgd_t boot_level4_pgt[];
 extern unsigned long __supported_pte_mask;
 
 #define swapper_pg_dir init_level4_pgt
@@ -247,7 +248,7 @@ static inline unsigned long pud_bad(pud_t pud)
 #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))        /* FIXME: is this
                                                   right? */
 #define pte_page(x)    pfn_to_page(pte_pfn(x))
-#define pte_pfn(x)  ((pte_val(x) >> PAGE_SHIFT) & __PHYSICAL_MASK)
+#define pte_pfn(x)  ((pte_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
 
 static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
 {
@@ -354,7 +355,7 @@ static inline pud_t *__pud_offset_k(pud_t *pud, unsigned long address)
 #define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
 #define        pmd_bad(x)      ((pmd_val(x) & (~PTE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE )
 #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
-#define pmd_pfn(x)  ((pmd_val(x) >> PAGE_SHIFT) & __PHYSICAL_MASK)
+#define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
 
 #define pte_to_pgoff(pte) ((pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
 #define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
index 03837d34fba0ccdb4caab752902f1bc943755876..4861246548f716cf5981c2f1f5029bcaa49a9db5 100644 (file)
@@ -61,10 +61,12 @@ struct cpuinfo_x86 {
        int     x86_cache_alignment;
        int     x86_tlbsize;    /* number of 4K pages in DTLB/ITLB combined(in pages)*/
         __u8    x86_virt_bits, x86_phys_bits;
-       __u8    x86_num_cores;
+       __u8    x86_max_cores;  /* cpuid returned max cores value */
         __u32   x86_power;     
        __u32   extended_cpuid_level;   /* Max extended CPUID function supported */
        unsigned long loops_per_jiffy;
+       __u8    apicid;
+       __u8    booted_cores;   /* number of cores as seen by OS */
 } ____cacheline_aligned;
 
 #define X86_VENDOR_INTEL 0
index dbb37b0adb43df3f2ea20d62bc4e398c9bd469be..34501086afef57a81ab0369dcea9e0e1bad2c76f 100644 (file)
@@ -11,6 +11,8 @@ struct pt_regs;
 extern void start_kernel(void);
 extern void pda_init(int); 
 
+extern void zap_low_mappings(int cpu);
+
 extern void early_idt_handler(void);
 
 extern void mcheck_init(struct cpuinfo_x86 *c);
@@ -22,6 +24,8 @@ extern void mtrr_bp_init(void);
 #define mtrr_bp_init() do {} while (0)
 #endif
 extern void init_memory_mapping(unsigned long start, unsigned long end);
+extern void size_zones(unsigned long *z, unsigned long *h,
+                       unsigned long start_pfn, unsigned long end_pfn);
 
 extern void system_call(void); 
 extern int kernel_syscall(void);
diff --git a/include/asm-x86_64/rwsem.h b/include/asm-x86_64/rwsem.h
deleted file mode 100644 (file)
index 46077e9..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/* rwsem.h: R/W semaphores implemented using XADD/CMPXCHG for x86_64+
- *
- * Written by David Howells (dhowells@redhat.com).
- * Ported by Andi Kleen <ak@suse.de> to x86-64.
- *
- * Derived from asm-i386/semaphore.h and asm-i386/rwsem.h
- *
- *
- * The MSW of the count is the negated number of active writers and waiting
- * lockers, and the LSW is the total number of active locks
- *
- * The lock count is initialized to 0 (no active and no waiting lockers).
- *
- * When a writer subtracts WRITE_BIAS, it'll get 0xffff0001 for the case of an
- * uncontended lock. This can be determined because XADD returns the old value.
- * Readers increment by 1 and see a positive value when uncontended, negative
- * if there are writers (and maybe) readers waiting (in which case it goes to
- * sleep).
- *
- * The value of WAITING_BIAS supports up to 32766 waiting processes. This can
- * be extended to 65534 by manually checking the whole MSW rather than relying
- * on the S flag.
- *
- * The value of ACTIVE_BIAS supports up to 65535 active processes.
- *
- * This should be totally fair - if anything is waiting, a process that wants a
- * lock will go to the back of the queue. When the currently active lock is
- * released, if there's a writer at the front of the queue, then that and only
- * that will be woken up; if there's a bunch of consecutive readers at the
- * front, then they'll all be woken up, but no other readers will be.
- */
-
-#ifndef _X8664_RWSEM_H
-#define _X8664_RWSEM_H
-
-#ifndef _LINUX_RWSEM_H
-#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
-#endif
-
-#ifdef __KERNEL__
-
-#include <linux/list.h>
-#include <linux/spinlock.h>
-
-struct rwsem_waiter;
-
-extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
-extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
-extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
-
-/*
- * the semaphore definition
- */
-struct rw_semaphore {
-       signed int              count;
-#define RWSEM_UNLOCKED_VALUE           0x00000000
-#define RWSEM_ACTIVE_BIAS              0x00000001
-#define RWSEM_ACTIVE_MASK              0x0000ffff
-#define RWSEM_WAITING_BIAS             (-0x00010000)
-#define RWSEM_ACTIVE_READ_BIAS         RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS                (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
-       spinlock_t              wait_lock;
-       struct list_head        wait_list;
-#if RWSEM_DEBUG
-       int                     debug;
-#endif
-};
-
-/*
- * initialisation
- */
-#if RWSEM_DEBUG
-#define __RWSEM_DEBUG_INIT      , 0
-#else
-#define __RWSEM_DEBUG_INIT     /* */
-#endif
-
-#define __RWSEM_INITIALIZER(name) \
-{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \
-       __RWSEM_DEBUG_INIT }
-
-#define DECLARE_RWSEM(name) \
-       struct rw_semaphore name = __RWSEM_INITIALIZER(name)
-
-static inline void init_rwsem(struct rw_semaphore *sem)
-{
-       sem->count = RWSEM_UNLOCKED_VALUE;
-       spin_lock_init(&sem->wait_lock);
-       INIT_LIST_HEAD(&sem->wait_list);
-#if RWSEM_DEBUG
-       sem->debug = 0;
-#endif
-}
-
-/*
- * lock for reading
- */
-static inline void __down_read(struct rw_semaphore *sem)
-{
-       __asm__ __volatile__(
-               "# beginning down_read\n\t"
-LOCK_PREFIX    "  incl      (%%rdi)\n\t" /* adds 0x00000001, returns the old value */
-               "  js        2f\n\t" /* jump if we weren't granted the lock */
-               "1:\n\t"
-               LOCK_SECTION_START("") \
-               "2:\n\t"
-               "  call      rwsem_down_read_failed_thunk\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END \
-               "# ending down_read\n\t"
-               : "+m"(sem->count)
-               : "D"(sem)
-               : "memory", "cc");
-}
-
-
-/*
- * trylock for reading -- returns 1 if successful, 0 if contention
- */
-static inline int __down_read_trylock(struct rw_semaphore *sem)
-{
-       __s32 result, tmp;
-       __asm__ __volatile__(
-               "# beginning __down_read_trylock\n\t"
-               "  movl      %0,%1\n\t"
-               "1:\n\t"
-               "  movl      %1,%2\n\t"
-               "  addl      %3,%2\n\t"
-               "  jle       2f\n\t"
-LOCK_PREFIX    "  cmpxchgl  %2,%0\n\t"
-               "  jnz       1b\n\t"
-               "2:\n\t"
-               "# ending __down_read_trylock\n\t"
-               : "+m"(sem->count), "=&a"(result), "=&r"(tmp)
-               : "i"(RWSEM_ACTIVE_READ_BIAS)
-               : "memory", "cc");
-       return result>=0 ? 1 : 0;
-}
-
-
-/*
- * lock for writing
- */
-static inline void __down_write(struct rw_semaphore *sem)
-{
-       int tmp;
-
-       tmp = RWSEM_ACTIVE_WRITE_BIAS;
-       __asm__ __volatile__(
-               "# beginning down_write\n\t"
-LOCK_PREFIX    "  xaddl      %0,(%%rdi)\n\t" /* subtract 0x0000ffff, returns the old value */
-               "  testl     %0,%0\n\t" /* was the count 0 before? */
-               "  jnz       2f\n\t" /* jump if we weren't granted the lock */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  call      rwsem_down_write_failed_thunk\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
-               "# ending down_write"
-               : "=&r" (tmp) 
-               : "0"(tmp), "D"(sem)
-               : "memory", "cc");
-}
-
-/*
- * trylock for writing -- returns 1 if successful, 0 if contention
- */
-static inline int __down_write_trylock(struct rw_semaphore *sem)
-{
-       signed long ret = cmpxchg(&sem->count,
-                                 RWSEM_UNLOCKED_VALUE, 
-                                 RWSEM_ACTIVE_WRITE_BIAS);
-       if (ret == RWSEM_UNLOCKED_VALUE)
-               return 1;
-       return 0;
-}
-
-/*
- * unlock after reading
- */
-static inline void __up_read(struct rw_semaphore *sem)
-{
-       __s32 tmp = -RWSEM_ACTIVE_READ_BIAS;
-       __asm__ __volatile__(
-               "# beginning __up_read\n\t"
-LOCK_PREFIX    "  xaddl      %[tmp],(%%rdi)\n\t" /* subtracts 1, returns the old value */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  decw      %w[tmp]\n\t" /* do nothing if still outstanding active readers */
-               "  jnz       1b\n\t"
-               "  call      rwsem_wake_thunk\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
-               "# ending __up_read\n"
-               : "+m"(sem->count), [tmp] "+r" (tmp)
-               : "D"(sem)
-               : "memory", "cc");
-}
-
-/*
- * unlock after writing
- */
-static inline void __up_write(struct rw_semaphore *sem)
-{
-       unsigned tmp; 
-       __asm__ __volatile__(
-               "# beginning __up_write\n\t"
-               "  movl     %[bias],%[tmp]\n\t"
-LOCK_PREFIX    "  xaddl     %[tmp],(%%rdi)\n\t" /* tries to transition 0xffff0001 -> 0x00000000 */
-               "  jnz       2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  decw      %w[tmp]\n\t" /* did the active count reduce to 0? */
-               "  jnz       1b\n\t" /* jump back if not */
-               "  call      rwsem_wake_thunk\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
-               "# ending __up_write\n"
-               : "+m"(sem->count), [tmp] "=r" (tmp)
-               : "D"(sem), [bias] "i"(-RWSEM_ACTIVE_WRITE_BIAS)
-               : "memory", "cc");
-}
-
-/*
- * downgrade write lock to read lock
- */
-static inline void __downgrade_write(struct rw_semaphore *sem)
-{
-       __asm__ __volatile__(
-               "# beginning __downgrade_write\n\t"
-LOCK_PREFIX    "  addl      %[bias],(%%rdi)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  call      rwsem_downgrade_thunk\n"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
-               "# ending __downgrade_write\n"
-               : "=m"(sem->count)
-               : "D"(sem), [bias] "i"(-RWSEM_WAITING_BIAS), "m"(sem->count)
-               : "memory", "cc");
-}
-
-/*
- * implement atomic add functionality
- */
-static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
-{
-       __asm__ __volatile__(
-LOCK_PREFIX    "addl %1,%0"
-               :"=m"(sem->count)
-               :"ir"(delta), "m"(sem->count));
-}
-
-/*
- * implement exchange and add functionality
- */
-static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
-{
-       int tmp = delta;
-
-       __asm__ __volatile__(
-LOCK_PREFIX    "xaddl %0,(%2)"
-               : "=r"(tmp), "=m"(sem->count)
-               : "r"(sem), "m"(sem->count), "0" (tmp)
-               : "memory");
-
-       return tmp+delta;
-}
-
-static inline int rwsem_is_locked(struct rw_semaphore *sem)
-{
-       return (sem->count != 0);
-}
-
-#endif /* __KERNEL__ */
-#endif /* _X8664_RWSEM_H */
index c57ce40713426d6ef69b657adccb8d3e274745bb..d030409a8fb5c61a2663249894834384d106f7f1 100644 (file)
@@ -47,7 +47,6 @@ extern void lock_ipi_call_lock(void);
 extern void unlock_ipi_call_lock(void);
 extern int smp_num_siblings;
 extern void smp_send_reschedule(int cpu);
-extern void zap_low_mappings(void);
 void smp_stop_cpu(void);
 extern int smp_call_function_single(int cpuid, void (*func) (void *info),
                                void *info, int retry, int wait);
@@ -82,6 +81,8 @@ extern int safe_smp_processor_id(void);
 extern int __cpu_disable(void);
 extern void __cpu_die(unsigned int cpu);
 extern void prefill_possible_map(void);
+extern unsigned num_processors;
+extern unsigned disabled_cpus;
 
 #endif /* !ASSEMBLY */
 
@@ -135,5 +136,11 @@ static __inline int logical_smp_processor_id(void)
 }
 #endif
 
+#ifdef CONFIG_SMP
+#define cpu_physical_id(cpu)           x86_cpu_to_apicid[cpu]
+#else
+#define cpu_physical_id(cpu)           boot_cpu_id
+#endif
+
 #endif
 
index 69636831ad2f4e3f5d756ab4bbec60da5bfd18f9..fe484a699cc3609cca9d1c592e17624bd7bd22a8 100644 (file)
  */
 
 #define __raw_spin_is_locked(x) \
-               (*(volatile signed char *)(&(x)->slock) <= 0)
+               (*(volatile signed int *)(&(x)->slock) <= 0)
 
 #define __raw_spin_lock_string \
        "\n1:\t" \
-       "lock ; decb %0\n\t" \
+       "lock ; decl %0\n\t" \
        "js 2f\n" \
        LOCK_SECTION_START("") \
        "2:\t" \
        "rep;nop\n\t" \
-       "cmpb $0,%0\n\t" \
+       "cmpl $0,%0\n\t" \
        "jle 2b\n\t" \
        "jmp 1b\n" \
        LOCK_SECTION_END
 
 #define __raw_spin_unlock_string \
-       "movb $1,%0" \
+       "movl $1,%0" \
                :"=m" (lock->slock) : : "memory"
 
 static inline void __raw_spin_lock(raw_spinlock_t *lock)
@@ -47,10 +47,10 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock)
 
 static inline int __raw_spin_trylock(raw_spinlock_t *lock)
 {
-       char oldval;
+       int oldval;
 
        __asm__ __volatile__(
-               "xchgb %b0,%1"
+               "xchgl %0,%1"
                :"=q" (oldval), "=m" (lock->slock)
                :"0" (0) : "memory");
 
index 1c603cd7e4d096389d7cf92f11b79afcc338b288..d39ebd5263ed4ff1fdf98739c93fe1a51750d903 100644 (file)
@@ -28,6 +28,8 @@ extern int __node_distance(int, int);
 #define pcibus_to_node(bus)            ((long)(bus->sysdata))  
 #define pcibus_to_cpumask(bus)         node_to_cpumask(pcibus_to_node(bus));
 
+#define numa_node_id()                 read_pda(nodenumber)
+
 /* sched_domains SD_NODE_INIT for x86_64 machines */
 #define SD_NODE_INIT (struct sched_domain) {           \
        .span                   = CPU_MASK_NONE,        \
index 3c494b65d33a06a5f71e0956e0a69dd1e206b6e3..2c42150bce0c372e651f6736ae14f3cf70829ccb 100644 (file)
@@ -462,7 +462,7 @@ __SYSCALL(__NR_fremovexattr, sys_fremovexattr)
 #define __NR_tkill     200
 __SYSCALL(__NR_tkill, sys_tkill) 
 #define __NR_time      201
-__SYSCALL(__NR_time, sys_time64)
+__SYSCALL(__NR_time, sys_time)
 #define __NR_futex     202
 __SYSCALL(__NR_futex, sys_futex)
 #define __NR_sched_setaffinity    203
@@ -608,6 +608,7 @@ do { \
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
 #define __ARCH_WANT_SYS_RT_SIGACTION
+#define __ARCH_WANT_SYS_TIME
 #define __ARCH_WANT_COMPAT_SYS_TIME
 #endif
 
index 12b5732dc6e5986ef4966ca87afe7f019745ef3e..3670cc7695dad79d3326323e8c974abf417851f6 100644 (file)
@@ -223,6 +223,26 @@ static inline int atomic_sub_return(int i, atomic_t * v)
  */
 #define atomic_add_negative(i,v) (atomic_add_return((i),(v)) < 0)
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
 static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
 {
index 93c5b3cdf9519a34d73f6e4eec697b3b0836b395..9a66401073fc1b8ff8e90b2d70d020c032a9900e 100644 (file)
@@ -16,6 +16,8 @@
 #define _LINUX_ACCT_H
 
 #include <linux/types.h>
+#include <linux/jiffies.h>
+
 #include <asm/param.h>
 #include <asm/byteorder.h>
 
index 403d71dcb7c818beb2b43101af33d6133f6d5622..49fd37629ee475a64a7f82a84e74e5e1e204f9cc 100644 (file)
@@ -124,7 +124,7 @@ struct kiocb {
                (x)->ki_users = 1;                      \
                (x)->ki_key = KIOCB_SYNC_KEY;           \
                (x)->ki_filp = (filp);                  \
-               (x)->ki_ctx = &tsk->active_mm->default_kioctx;  \
+               (x)->ki_ctx = NULL;                     \
                (x)->ki_cancel = NULL;                  \
                (x)->ki_dtor = NULL;                    \
                (x)->ki_obj.tsk = tsk;                  \
@@ -210,8 +210,15 @@ struct kioctx *lookup_ioctx(unsigned long ctx_id);
 int FASTCALL(io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
                                  struct iocb *iocb));
 
-#define get_ioctx(kioctx)      do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0)
-#define put_ioctx(kioctx)      do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0)
+#define get_ioctx(kioctx) do {                                         \
+       BUG_ON(unlikely(atomic_read(&(kioctx)->users) <= 0));           \
+       atomic_inc(&(kioctx)->users);                                   \
+} while (0)
+#define put_ioctx(kioctx) do {                                         \
+       BUG_ON(unlikely(atomic_read(&(kioctx)->users) <= 0));           \
+       if (unlikely(atomic_dec_and_test(&(kioctx)->users)))            \
+               __put_ioctx(kioctx);                                    \
+} while (0)
 
 #define in_aio() !is_sync_wait(current->io_wait)
 /* may be used for debugging */
index cb3c3ef50f504408c242028ef3b2e9f1feb7347a..38c2fb7ebe091bc7c252193a614abca2c5c244bb 100644 (file)
@@ -84,6 +84,16 @@ static __inline__ int get_bitmask_order(unsigned int count)
        return order;   /* We could be slightly more clever with -1 here... */
 }
 
+static __inline__ int get_count_order(unsigned int count)
+{
+       int order;
+       
+       order = fls(count) - 1;
+       if (count & (count - 1))
+               order++;
+       return order;
+}
+
 /*
  * hweightN: returns the hamming weight (i.e. the number
  * of bits set) of a N-bit word
index 025a7f084dbd82b2caf7a290736287bc3f012d37..a33a31e71bbc6cb02acf3409c926137c8664b882 100644 (file)
@@ -406,6 +406,7 @@ struct request_queue
 
        atomic_t                refcnt;
 
+       unsigned int            nr_sorted;
        unsigned int            in_flight;
 
        /*
@@ -631,6 +632,7 @@ static inline void elv_dispatch_add_tail(struct request_queue *q,
 {
        if (q->last_merge == rq)
                q->last_merge = NULL;
+       q->nr_sorted--;
 
        q->end_sector = rq_end_sector(rq);
        q->boundary_rq = rq;
index 424d5e622b4331ba31b7cc83002a3f97aa5aec3f..6e27f42e3a57d12059800a088112b979aa7d5516 100644 (file)
@@ -10,8 +10,8 @@
 typedef struct _cciss_pci_info_struct
 {
        unsigned char   bus;
-       unsigned short  domain;
        unsigned char   dev_fn;
+       unsigned short  domain;
        __u32           board_id;
 } cciss_pci_info_struct; 
 
diff --git a/include/linux/cm4000_cs.h b/include/linux/cm4000_cs.h
new file mode 100644 (file)
index 0000000..605ebe2
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef        _CM4000_H_
+#define        _CM4000_H_
+
+#define        MAX_ATR                 33
+
+#define        CM4000_MAX_DEV          4
+
+/* those two structures are passed via ioctl() from/to userspace.  They are
+ * used by existing userspace programs, so I kepth the awkward "bIFSD" naming
+ * not to break compilation of userspace apps. -HW */
+
+typedef struct atreq {
+       int32_t atr_len;
+       unsigned char atr[64];
+       int32_t power_act;
+       unsigned char bIFSD;
+       unsigned char bIFSC;
+} atreq_t;
+
+
+/* what is particularly stupid in the original driver is the arch-dependant
+ * member sizes. This leads to CONFIG_COMPAT breakage, since 32bit userspace
+ * will lay out the structure members differently than the 64bit kernel.
+ *
+ * I've changed "ptsreq.protocol" from "unsigned long" to "u_int32_t".
+ * On 32bit this will make no difference.  With 64bit kernels, it will make
+ * 32bit apps work, too.
+ */
+
+typedef struct ptsreq {
+       u_int32_t protocol; /*T=0: 2^0, T=1:  2^1*/
+       unsigned char flags;
+       unsigned char pts1;
+       unsigned char pts2;
+       unsigned char pts3;
+} ptsreq_t;
+
+#define        CM_IOC_MAGIC            'c'
+#define        CM_IOC_MAXNR            255
+
+#define        CM_IOCGSTATUS           _IOR (CM_IOC_MAGIC, 0, unsigned char *)
+#define        CM_IOCGATR              _IOWR(CM_IOC_MAGIC, 1, atreq_t *)
+#define        CM_IOCSPTS              _IOW (CM_IOC_MAGIC, 2, ptsreq_t *)
+#define        CM_IOCSRDR              _IO  (CM_IOC_MAGIC, 3)
+#define CM_IOCARDOFF            _IO  (CM_IOC_MAGIC, 4)
+
+#define CM_IOSDBGLVL            _IOW(CM_IOC_MAGIC, 250, int*)
+
+/* card and device states */
+#define        CM_CARD_INSERTED                0x01
+#define        CM_CARD_POWERED                 0x02
+#define        CM_ATR_PRESENT                  0x04
+#define        CM_ATR_VALID                    0x08
+#define        CM_STATE_VALID                  0x0f
+/* extra info only from CM4000 */
+#define        CM_NO_READER                    0x10
+#define        CM_BAD_CARD                     0x20
+
+
+#ifdef __KERNEL__
+
+#define        DEVICE_NAME             "cmm"
+#define        MODULE_NAME             "cm4000_cs"
+
+#endif /* __KERNEL__ */
+#endif /* _CM4000_H_ */
index 2209ad3499a3b4b9dd0be3a32451dd161e0765d5..119f9d064cc6100a1671af7e127bdab31e9cce64 100644 (file)
@@ -259,6 +259,14 @@ COMPATIBLE_IOCTL(RTC_RD_TIME)
 COMPATIBLE_IOCTL(RTC_SET_TIME)
 COMPATIBLE_IOCTL(RTC_WKALM_SET)
 COMPATIBLE_IOCTL(RTC_WKALM_RD)
+/*
+ * These two are only for the sbus rtc driver, but
+ * hwclock tries them on every rtc device first when
+ * running on sparc.  On other architectures the entries
+ * are useless but harmless.
+ */
+COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
+COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
 /* Little m */
 COMPATIBLE_IOCTL(MTIOCTOP)
 /* Socket level stuff */
@@ -787,3 +795,70 @@ COMPATIBLE_IOCTL(HIDIOCGFLAG)
 COMPATIBLE_IOCTL(HIDIOCSFLAG)
 COMPATIBLE_IOCTL(HIDIOCGCOLLECTIONINDEX)
 COMPATIBLE_IOCTL(HIDIOCGCOLLECTIONINFO)
+/* dvb */
+COMPATIBLE_IOCTL(AUDIO_STOP)
+COMPATIBLE_IOCTL(AUDIO_PLAY)
+COMPATIBLE_IOCTL(AUDIO_PAUSE)
+COMPATIBLE_IOCTL(AUDIO_CONTINUE)
+COMPATIBLE_IOCTL(AUDIO_SELECT_SOURCE)
+COMPATIBLE_IOCTL(AUDIO_SET_MUTE)
+COMPATIBLE_IOCTL(AUDIO_SET_AV_SYNC)
+COMPATIBLE_IOCTL(AUDIO_SET_BYPASS_MODE)
+COMPATIBLE_IOCTL(AUDIO_CHANNEL_SELECT)
+COMPATIBLE_IOCTL(AUDIO_GET_STATUS)
+COMPATIBLE_IOCTL(AUDIO_GET_CAPABILITIES)
+COMPATIBLE_IOCTL(AUDIO_CLEAR_BUFFER)
+COMPATIBLE_IOCTL(AUDIO_SET_ID)
+COMPATIBLE_IOCTL(AUDIO_SET_MIXER)
+COMPATIBLE_IOCTL(AUDIO_SET_STREAMTYPE)
+COMPATIBLE_IOCTL(AUDIO_SET_EXT_ID)
+COMPATIBLE_IOCTL(AUDIO_SET_ATTRIBUTES)
+COMPATIBLE_IOCTL(AUDIO_SET_KARAOKE)
+COMPATIBLE_IOCTL(DMX_START)
+COMPATIBLE_IOCTL(DMX_STOP)
+COMPATIBLE_IOCTL(DMX_SET_FILTER)
+COMPATIBLE_IOCTL(DMX_SET_PES_FILTER)
+COMPATIBLE_IOCTL(DMX_SET_BUFFER_SIZE)
+COMPATIBLE_IOCTL(DMX_GET_PES_PIDS)
+COMPATIBLE_IOCTL(DMX_GET_CAPS)
+COMPATIBLE_IOCTL(DMX_SET_SOURCE)
+COMPATIBLE_IOCTL(DMX_GET_STC)
+COMPATIBLE_IOCTL(FE_GET_INFO)
+COMPATIBLE_IOCTL(FE_DISEQC_RESET_OVERLOAD)
+COMPATIBLE_IOCTL(FE_DISEQC_SEND_MASTER_CMD)
+COMPATIBLE_IOCTL(FE_DISEQC_RECV_SLAVE_REPLY)
+COMPATIBLE_IOCTL(FE_DISEQC_SEND_BURST)
+COMPATIBLE_IOCTL(FE_SET_TONE)
+COMPATIBLE_IOCTL(FE_SET_VOLTAGE)
+COMPATIBLE_IOCTL(FE_ENABLE_HIGH_LNB_VOLTAGE)
+COMPATIBLE_IOCTL(FE_READ_STATUS)
+COMPATIBLE_IOCTL(FE_READ_BER)
+COMPATIBLE_IOCTL(FE_READ_SIGNAL_STRENGTH)
+COMPATIBLE_IOCTL(FE_READ_SNR)
+COMPATIBLE_IOCTL(FE_READ_UNCORRECTED_BLOCKS)
+COMPATIBLE_IOCTL(FE_SET_FRONTEND)
+COMPATIBLE_IOCTL(FE_GET_FRONTEND)
+COMPATIBLE_IOCTL(FE_GET_EVENT)
+COMPATIBLE_IOCTL(FE_DISHNETWORK_SEND_LEGACY_CMD)
+COMPATIBLE_IOCTL(VIDEO_STOP)
+COMPATIBLE_IOCTL(VIDEO_PLAY)
+COMPATIBLE_IOCTL(VIDEO_FREEZE)
+COMPATIBLE_IOCTL(VIDEO_CONTINUE)
+COMPATIBLE_IOCTL(VIDEO_SELECT_SOURCE)
+COMPATIBLE_IOCTL(VIDEO_SET_BLANK)
+COMPATIBLE_IOCTL(VIDEO_GET_STATUS)
+COMPATIBLE_IOCTL(VIDEO_SET_DISPLAY_FORMAT)
+COMPATIBLE_IOCTL(VIDEO_FAST_FORWARD)
+COMPATIBLE_IOCTL(VIDEO_SLOWMOTION)
+COMPATIBLE_IOCTL(VIDEO_GET_CAPABILITIES)
+COMPATIBLE_IOCTL(VIDEO_CLEAR_BUFFER)
+COMPATIBLE_IOCTL(VIDEO_SET_ID)
+COMPATIBLE_IOCTL(VIDEO_SET_STREAMTYPE)
+COMPATIBLE_IOCTL(VIDEO_SET_FORMAT)
+COMPATIBLE_IOCTL(VIDEO_SET_SYSTEM)
+COMPATIBLE_IOCTL(VIDEO_SET_HIGHLIGHT)
+COMPATIBLE_IOCTL(VIDEO_SET_SPU)
+COMPATIBLE_IOCTL(VIDEO_GET_NAVI)
+COMPATIBLE_IOCTL(VIDEO_SET_ATTRIBUTES)
+COMPATIBLE_IOCTL(VIDEO_GET_SIZE)
+COMPATIBLE_IOCTL(VIDEO_GET_FRAME_RATE)
index c5769c6585f4cf9c623b8e086ba830310cff3256..ad1a22c1c42e24e2c2e0b93e4f090810ccb43a17 100644 (file)
@@ -32,6 +32,8 @@
  */
 #define CN_IDX_PROC                    0x1
 #define CN_VAL_PROC                    0x1
+#define CN_IDX_CIFS                    0x2
+#define CN_VAL_CIFS                     0x1
 
 #define CN_NETLINK_USERS               1
 
diff --git a/include/linux/ds17287rtc.h b/include/linux/ds17287rtc.h
new file mode 100644 (file)
index 0000000..c281ba4
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * ds17287rtc.h - register definitions for the ds1728[57] RTC / CMOS RAM
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * (C) 2003 Guido Guenther <agx@sigxcpu.org>
+ */
+#ifndef __LINUX_DS17287RTC_H
+#define __LINUX_DS17287RTC_H
+
+#include <linux/rtc.h>                 /* get the user-level API */
+#include <linux/spinlock.h>            /* spinlock_t */
+#include <linux/mc146818rtc.h>
+
+/* Register A */
+#define DS_REGA_DV2    0x40            /* countdown chain */
+#define DS_REGA_DV1    0x20            /* oscillator enable */
+#define DS_REGA_DV0    0x10            /* bank select */
+
+/* bank 1 registers */
+#define DS_B1_MODEL    0x40            /* model number byte */
+#define DS_B1_SN1      0x41            /* serial number byte 1 */
+#define DS_B1_SN2      0x42            /* serial number byte 2 */
+#define DS_B1_SN3      0x43            /* serial number byte 3 */
+#define DS_B1_SN4      0x44            /* serial number byte 4 */
+#define DS_B1_SN5      0x45            /* serial number byte 5 */
+#define DS_B1_SN6      0x46            /* serial number byte 6 */
+#define DS_B1_CRC      0x47            /* CRC byte */
+#define DS_B1_CENTURY  0x48            /* Century byte */
+#define DS_B1_DALARM   0x49            /* date alarm */
+#define DS_B1_XCTRL4A  0x4a            /* extendec control register 4a */
+#define DS_B1_XCTRL4B  0x4b            /* extendec control register 4b */
+#define DS_B1_RTCADDR2         0x4e            /* rtc address 2 */
+#define DS_B1_RTCADDR3         0x4f            /* rtc address 3 */
+#define DS_B1_RAMLSB   0x50            /* extended ram LSB */
+#define DS_B1_RAMMSB   0x51            /* extended ram MSB */
+#define DS_B1_RAMDPORT 0x53            /* extended ram data port */
+
+/* register details */
+/* extended control register 4a */
+#define DS_XCTRL4A_VRT2        0x80            /* valid ram and time */
+#define DS_XCTRL4A_INCR        0x40            /* increment progress status */
+#define DS_XCTRL4A_BME 0x20            /* burst mode enable */
+#define DS_XCTRL4A_PAB 0x08            /* power active bar ctrl */
+#define DS_XCTRL4A_RF  0x04            /* ram clear flag */
+#define DS_XCTRL4A_WF  0x02            /* wake up alarm flag */
+#define DS_XCTRL4A_KF  0x01            /* kickstart flag */
+
+/* interrupt causes */
+#define DS_XCTRL4A_IFS (DS_XCTRL4A_RF|DS_XCTRL4A_WF|DS_XCTRL4A_KF)
+
+/* extended control register 4b */
+#define DS_XCTRL4B_ABE 0x80            /* auxiliary battery enable */
+#define DS_XCTRL4B_E32K        0x40            /* enable 32.768 kHz Output */
+#define DS_XCTRL4B_CS  0x20            /* crystal select */
+#define DS_XCTRL4B_RCE 0x10            /* ram clear enable */
+#define DS_XCTRL4B_PRS 0x08            /* PAB resec select */
+#define DS_XCTRL4B_RIE 0x04            /* ram clear interrupt enable */
+#define DS_XCTRL4B_WFE 0x02            /* wake up alarm interrupt enable */
+#define DS_XCTRL4B_KFE 0x01            /* kickstart interrupt enable */
+
+/* interrupt enable bits */
+#define DS_XCTRL4B_IFES        (DS_XCTRL4B_RIE|DS_XCTRL4B_WFE|DS_XCTRL4B_KFE)
+
+#endif /* __LINUX_DS17287RTC_H */
diff --git a/include/linux/ds1742rtc.h b/include/linux/ds1742rtc.h
new file mode 100644 (file)
index 0000000..a83cdd1
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * ds1742rtc.h - register definitions for the Real-Time-Clock / CMOS RAM
+ *
+ * Copyright (C) 1999-2001 Toshiba Corporation
+ * Copyright (C) 2003 Ralf Baechle (ralf@linux-mips.org)
+ *
+ * Permission is hereby granted to copy, modify and redistribute this code
+ * in terms of the GNU Library General Public License, Version 2 or later,
+ * at your option.
+ */
+#ifndef __LINUX_DS1742RTC_H
+#define __LINUX_DS1742RTC_H
+
+#include <asm/ds1742.h>
+
+#define RTC_BRAM_SIZE          0x800
+#define RTC_OFFSET             0x7f8
+
+/*
+ * Register summary
+ */
+#define RTC_CONTROL            (RTC_OFFSET + 0)
+#define RTC_CENTURY            (RTC_OFFSET + 0)
+#define RTC_SECONDS            (RTC_OFFSET + 1)
+#define RTC_MINUTES            (RTC_OFFSET + 2)
+#define RTC_HOURS              (RTC_OFFSET + 3)
+#define RTC_DAY                        (RTC_OFFSET + 4)
+#define RTC_DATE               (RTC_OFFSET + 5)
+#define RTC_MONTH              (RTC_OFFSET + 6)
+#define RTC_YEAR               (RTC_OFFSET + 7)
+
+#define RTC_CENTURY_MASK       0x3f
+#define RTC_SECONDS_MASK       0x7f
+#define RTC_DAY_MASK           0x07
+
+/*
+ * Bits in the Control/Century register
+ */
+#define RTC_WRITE              0x80
+#define RTC_READ               0x40
+
+/*
+ * Bits in the Seconds register
+ */
+#define RTC_STOP               0x80
+
+/*
+ * Bits in the Day register
+ */
+#define RTC_BATT_FLAG          0x80
+#define RTC_FREQ_TEST          0x40
+
+#endif /* __LINUX_DS1742RTC_H */
index d3b1a15d5f21b378731bd2fca44edd2be5d3dc5d..418b6101b59a02d8b9efb7501e3de51808a59f95 100644 (file)
@@ -33,13 +33,13 @@ struct fdtable {
  * Open file table structure
  */
 struct files_struct {
-        atomic_t count;
-        spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
+       atomic_t count;
        struct fdtable *fdt;
        struct fdtable fdtab;
-        fd_set close_on_exec_init;
-        fd_set open_fds_init;
-        struct file * fd_array[NR_OPEN_DEFAULT];
+       fd_set close_on_exec_init;
+       fd_set open_fds_init;
+       struct file * fd_array[NR_OPEN_DEFAULT];
+       spinlock_t file_lock;     /* Protects concurrent writers.  Nests inside tsk->alloc_lock */
 };
 
 #define files_fdtable(files) (rcu_dereference((files)->fdt))
index 8aac48c37f3db1c7ef6fa00383e1a41a987d44d2..53b129f07f6f294a896ce4bcc62133641f79d9ef 100644 (file)
@@ -31,7 +31,6 @@ struct font_desc {
 #define SUN12x22_IDX   7
 #define ACORN8x8_IDX   8
 #define        MINI4x6_IDX     9
-#define        RL_IDX  10
 
 extern const struct font_desc  font_vga_8x8,
                        font_vga_8x16,
@@ -42,7 +41,6 @@ extern const struct font_desc font_vga_8x8,
                        font_sun_8x16,
                        font_sun_12x22,
                        font_acorn_8x8,
-                       font_rl,
                        font_mini_4x6;
 
 /* Find a font with a specific name */
index 114d5d59f695bf952837620e4c26e1b024462ca7..934aa9bda481b29bb83ba045aba298c20f3825c6 100644 (file)
@@ -4,7 +4,7 @@
  * Definitions for any platform device related flags or structures for
  * Freescale processor devices
  *
- * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
  * Copyright 2004 Freescale Semiconductor, Inc
  *
index 8eeaa53a68c9fb2a669ac23d9e81abbe62815d37..eef5ccdcd7317942755af990969ca3c9c20030d2 100644 (file)
@@ -78,7 +78,7 @@ struct hd_struct {
        sector_t start_sect;
        sector_t nr_sects;
        struct kobject kobj;
-       unsigned ios[2], sectors[2];
+       unsigned ios[2], sectors[2];    /* READs and WRITEs */
        int policy, partno;
 };
 
@@ -89,7 +89,7 @@ struct hd_struct {
 #define GENHD_FL_SUPPRESS_PARTITION_INFO       32
 
 struct disk_stats {
-       unsigned sectors[2];
+       unsigned sectors[2];            /* READs and WRITEs */
        unsigned ios[2];
        unsigned merges[2];
        unsigned ticks[2];
index c3779432a7239b5e2b85494f594d69db3adb6fb8..313dfe9b443abb0d98b890aae74158e580db3ba8 100644 (file)
@@ -14,6 +14,13 @@ struct vm_area_struct;
 /* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low two bits) */
 #define __GFP_DMA      ((__force gfp_t)0x01u)
 #define __GFP_HIGHMEM  ((__force gfp_t)0x02u)
+#ifdef CONFIG_DMA_IS_DMA32
+#define __GFP_DMA32    ((__force gfp_t)0x01)   /* ZONE_DMA is ZONE_DMA32 */
+#elif BITS_PER_LONG < 64
+#define __GFP_DMA32    ((__force gfp_t)0x00)   /* ZONE_NORMAL is ZONE_DMA32 */
+#else
+#define __GFP_DMA32    ((__force gfp_t)0x04)   /* Has own ZONE_DMA32 */
+#endif
 
 /*
  * Action modifiers - doesn't change the zoning
@@ -39,8 +46,7 @@ struct vm_area_struct;
 #define __GFP_COMP     ((__force gfp_t)0x4000u)/* Add compound page metadata */
 #define __GFP_ZERO     ((__force gfp_t)0x8000u)/* Return zeroed page on success */
 #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */
-#define __GFP_NORECLAIM  ((__force gfp_t)0x20000u) /* No realy zone reclaim during allocation */
-#define __GFP_HARDWALL   ((__force gfp_t)0x40000u) /* Enforce hardwall cpuset memory allocs */
+#define __GFP_HARDWALL   ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */
 
 #define __GFP_BITS_SHIFT 20    /* Room for 20 __GFP_FOO bits */
 #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
@@ -49,7 +55,7 @@ struct vm_area_struct;
 #define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
                        __GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \
                        __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \
-                       __GFP_NOMEMALLOC|__GFP_NORECLAIM|__GFP_HARDWALL)
+                       __GFP_NOMEMALLOC|__GFP_HARDWALL)
 
 #define GFP_ATOMIC     (__GFP_HIGH)
 #define GFP_NOIO       (__GFP_WAIT)
@@ -64,6 +70,10 @@ struct vm_area_struct;
 
 #define GFP_DMA                __GFP_DMA
 
+/* 4GB DMA on some platforms */
+#define GFP_DMA32      __GFP_DMA32
+
+
 #define gfp_zone(mask) ((__force int)((mask) & (__force gfp_t)GFP_ZONEMASK))
 
 /*
index 5912874ca83c829494775fc479fed5ebb664cca3..71d2b8a723b9ad24529f1e8c5896e38cd6419a6b 100644 (file)
@@ -90,6 +90,8 @@ extern void synchronize_irq(unsigned int irq);
 #define nmi_enter()            irq_enter()
 #define nmi_exit()             sub_preempt_count(HARDIRQ_OFFSET)
 
+struct task_struct;
+
 #ifndef CONFIG_VIRT_CPU_ACCOUNTING
 static inline void account_user_vtime(struct task_struct *tsk)
 {
index 0cea162b08c0a4fc601a96f92fcb09d90dc8f946..1056717ee5013added4ea995fdfbbe202231a22b 100644 (file)
@@ -102,8 +102,8 @@ static inline unsigned long hugetlb_total_pages(void)
 #define hugetlb_fault(mm, vma, addr, write)    ({ BUG(); 0; })
 
 #ifndef HPAGE_MASK
-#define HPAGE_MASK     0               /* Keep the compiler happy */
-#define HPAGE_SIZE     0
+#define HPAGE_MASK     PAGE_MASK               /* Keep the compiler happy */
+#define HPAGE_SIZE     PAGE_SIZE
 #endif
 
 #endif /* !CONFIG_HUGETLB_PAGE */
index 74abaecdb57268e66b155c87803f5424c162b3d5..1543daaa9c5ed962ca5e43b3df6add58cacd38d9 100644 (file)
 #define I2C_DRIVERID_CX25840   71      /* cx2584x video encoder        */
 #define I2C_DRIVERID_SAA7127   72      /* saa7124 video encoder        */
 #define I2C_DRIVERID_SAA711X   73      /* saa711x video encoders       */
+#define I2C_DRIVERID_AKITAIOEXP        74      /* IO Expander on Sharp SL-C1000 */
 
 #define I2C_DRIVERID_EXP0      0xF0    /* experimental use id's        */
 #define I2C_DRIVERID_EXP1      0xF1
index 77ae55d4c13cb5e71c8d9e1524e1a98dc5e4e352..ac8b25fa6506588fef5e0640f53b48c0591ef701 100644 (file)
@@ -1329,7 +1329,8 @@ void ide_init_disk(struct gendisk *, ide_drive_t *);
 extern int ideprobe_init(void);
 
 extern void ide_scan_pcibus(int scan_direction) __init;
-extern int ide_pci_register_driver(struct pci_driver *driver);
+extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner);
+#define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE)
 extern void ide_pci_unregister_driver(struct pci_driver *driver);
 void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
 extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
index 7fb3ff9c7b0e4763b15b3ebf1aad0148a64f8e00..d37c8d808b0fdc274819555c2a1ba693523ca1c1 100644 (file)
@@ -8,6 +8,10 @@
  * Small id to pointer translation service avoiding fixed sized
  * tables.
  */
+
+#ifndef __IDR_H__
+#define __IDR_H__
+
 #include <linux/types.h>
 #include <linux/bitops.h>
 
@@ -77,3 +81,5 @@ int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
 void idr_remove(struct idr *idp, int id);
 void idr_destroy(struct idr *idp);
 void idr_init(struct idr *idp);
+
+#endif /* __IDR_H__ */
index d21c305c6c64cec22a264fd6cb8f6ae6fb22e784..fe26d431de8704710d3ffabd9faa7d2d7fa35539 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef _LINUX_IF_ETHER_H
 #define _LINUX_IF_ETHER_H
 
+#include <linux/types.h>
+
 /*
  *     IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
  *     and FCS/CRC (frame check sequence). 
 struct ethhdr {
        unsigned char   h_dest[ETH_ALEN];       /* destination eth addr */
        unsigned char   h_source[ETH_ALEN];     /* source ether addr    */
-       unsigned short  h_proto;                /* packet type ID field */
+       __be16          h_proto;                /* packet type ID field */
 } __attribute__((packed));
 
 #ifdef __KERNEL__
index 68ab5f2ab9cdb35bd8249f03b7e3b5b0bc54e443..dcfd2ecccb5d63dbcb2718a2f3e827aef9d68a23 100644 (file)
@@ -51,7 +51,6 @@
        .page_table_lock =  SPIN_LOCK_UNLOCKED,                 \
        .mmlist         = LIST_HEAD_INIT(name.mmlist),          \
        .cpu_vm_mask    = CPU_MASK_ALL,                         \
-       .default_kioctx = INIT_KIOCTX(name.default_kioctx, name),       \
 }
 
 #define INIT_SIGNALS(sig) {    \
index 0a90205184b0b4511776604fd0b37a6fc0cf6bc1..41f150a3d2dda5a2445b100d55c87a904834ccd8 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/preempt.h>
 #include <linux/cpumask.h>
 #include <linux/hardirq.h>
+#include <linux/sched.h>
 #include <asm/atomic.h>
 #include <asm/ptrace.h>
 #include <asm/system.h>
index 6f0752219f64052018f9663b62930329c722b888..f2dbb684ce9e4fce7e76ed09399ebf68cbe2c068 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <asm/io.h>
 #include <linux/ata.h>
 #include <linux/workqueue.h>
@@ -58,6 +59,8 @@
 #define VPRINTK(fmt, args...)
 #endif /* ATA_DEBUG */
 
+#define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
+
 #ifdef ATA_NDEBUG
 #define assert(expr)
 #else
@@ -118,6 +121,7 @@ enum {
        ATA_FLAG_PIO_DMA        = (1 << 8), /* PIO cmds via DMA */
        ATA_FLAG_NOINTR         = (1 << 9), /* FIXME: Remove this once
                                             * proper HSM is in place. */
+       ATA_FLAG_DEBUGMSG       = (1 << 10),
 
        ATA_QCFLAG_ACTIVE       = (1 << 1), /* cmd not yet ack'd to scsi lyer */
        ATA_QCFLAG_SG           = (1 << 3), /* have s/g table? */
@@ -398,12 +402,13 @@ struct ata_port_operations {
 };
 
 struct ata_port_info {
-       struct scsi_host_template *sht;
+       struct scsi_host_template       *sht;
        unsigned long           host_flags;
        unsigned long           pio_mask;
        unsigned long           mwdma_mask;
        unsigned long           udma_mask;
        const struct ata_port_operations *port_ops;
+       void                    *private_data;
 };
 
 struct ata_timing {
@@ -657,6 +662,17 @@ static inline void ata_tf_init(struct ata_port *ap, struct ata_taskfile *tf, uns
                tf->device = ATA_DEVICE_OBS | ATA_DEV1;
 }
 
+static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
+{
+       qc->__sg = NULL;
+       qc->flags = 0;
+       qc->cursect = qc->cursg = qc->cursg_ofs = 0;
+       qc->nsect = 0;
+       qc->nbytes = qc->curbytes = 0;
+
+       ata_tf_init(qc->ap, &qc->tf, qc->dev->devno);
+}
+
 
 /**
  *     ata_irq_on - Enable interrupts on a port.
index 7b115feca4df23064dfd3ee80a66a9e638b0dcbd..0986d19be0b7c810c122b7decbcd24dcd7a8827b 100644 (file)
@@ -206,12 +206,6 @@ struct vm_operations_struct {
 struct mmu_gather;
 struct inode;
 
-#ifdef ARCH_HAS_ATOMIC_UNSIGNED
-typedef unsigned page_flags_t;
-#else
-typedef unsigned long page_flags_t;
-#endif
-
 /*
  * Each physical page in the system has a struct page associated with
  * it to keep track of whatever it is we are using the page for at the
@@ -219,7 +213,7 @@ typedef unsigned long page_flags_t;
  * a page.
  */
 struct page {
-       page_flags_t flags;             /* Atomic flags, some possibly
+       unsigned long flags;            /* Atomic flags, some possibly
                                         * updated asynchronously */
        atomic_t _count;                /* Usage count, see below. */
        atomic_t _mapcount;             /* Count of ptes mapped in mms,
@@ -435,7 +429,7 @@ static inline void put_page(struct page *page)
 #endif
 
 /* Page flags: | [SECTION] | [NODE] | ZONE | ... | FLAGS | */
-#define SECTIONS_PGOFF         ((sizeof(page_flags_t)*8) - SECTIONS_WIDTH)
+#define SECTIONS_PGOFF         ((sizeof(unsigned long)*8) - SECTIONS_WIDTH)
 #define NODES_PGOFF            (SECTIONS_PGOFF - NODES_WIDTH)
 #define ZONES_PGOFF            (NODES_PGOFF - ZONES_WIDTH)
 
@@ -946,7 +940,9 @@ unsigned long max_sane_readahead(unsigned long nr);
 
 /* Do stack extension */
 extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
+#ifdef CONFIG_IA64
 extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
+#endif
 
 /* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
 extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
index f5fa3082fd6a56c628730c67873429f64f8d9cbb..2c8edad5dccf3796337dcb989f55815cd53faf51 100644 (file)
@@ -71,10 +71,11 @@ struct per_cpu_pageset {
 #endif
 
 #define ZONE_DMA               0
-#define ZONE_NORMAL            1
-#define ZONE_HIGHMEM           2
+#define ZONE_DMA32             1
+#define ZONE_NORMAL            2
+#define ZONE_HIGHMEM           3
 
-#define MAX_NR_ZONES           3       /* Sync this with ZONES_SHIFT */
+#define MAX_NR_ZONES           4       /* Sync this with ZONES_SHIFT */
 #define ZONES_SHIFT            2       /* ceil(log2(MAX_NR_ZONES)) */
 
 
@@ -108,9 +109,10 @@ struct per_cpu_pageset {
 
 /*
  * On machines where it is needed (eg PCs) we divide physical memory
- * into multiple physical zones. On a PC we have 3 zones:
+ * into multiple physical zones. On a PC we have 4 zones:
  *
  * ZONE_DMA      < 16 MB       ISA DMA capable memory
+ * ZONE_DMA32       0 MB       Empty
  * ZONE_NORMAL 16-896 MB       direct mapped by the kernel
  * ZONE_HIGHMEM         > 896 MB       only page cache and user processes
  */
@@ -329,7 +331,7 @@ void get_zone_counts(unsigned long *active, unsigned long *inactive,
 void build_all_zonelists(void);
 void wakeup_kswapd(struct zone *zone, int order);
 int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
-               int alloc_type, int can_try_harder, gfp_t gfp_high);
+               int classzone_idx, int alloc_flags);
 
 #ifdef CONFIG_HAVE_MEMORY_PRESENT
 void memory_present(int nid, unsigned long start, unsigned long end);
@@ -433,7 +435,9 @@ int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *,
 
 #include <linux/topology.h>
 /* Returns the number of the current Node. */
+#ifndef numa_node_id
 #define numa_node_id()         (cpu_to_node(raw_smp_processor_id()))
+#endif
 
 #ifndef CONFIG_NEED_MULTIPLE_NODES
 
@@ -453,12 +457,12 @@ extern struct pglist_data contig_page_data;
 #include <asm/sparsemem.h>
 #endif
 
-#if BITS_PER_LONG == 32 || defined(ARCH_HAS_ATOMIC_UNSIGNED)
+#if BITS_PER_LONG == 32
 /*
- * with 32 bit page->flags field, we reserve 8 bits for node/zone info.
- * there are 3 zones (2 bits) and this leaves 8-2=6 bits for nodes.
+ * with 32 bit page->flags field, we reserve 9 bits for node/zone info.
+ * there are 4 zones (3 bits) and this leaves 9-3=6 bits for nodes.
  */
-#define FLAGS_RESERVED         8
+#define FLAGS_RESERVED         9
 
 #elif BITS_PER_LONG == 64
 /*
index c6efce4a04a47b3f1cada1796e34b73d129e6837..936f8b76114ea95901ccb74190f2ebc96fc2a3a7 100644 (file)
@@ -927,6 +927,13 @@ extern int         netdev_max_backlog;
 extern int             weight_p;
 extern int             netdev_set_master(struct net_device *dev, struct net_device *master);
 extern int skb_checksum_help(struct sk_buff *skb, int inward);
+#ifdef CONFIG_BUG
+extern void netdev_rx_csum_fault(struct net_device *dev);
+#else
+static inline void netdev_rx_csum_fault(struct net_device *dev)
+{
+}
+#endif
 /* rx skb timestamps */
 extern void            net_enable_timestamp(void);
 extern void            net_disable_timestamp(void);
index 72975fa8795d21c1c03a247ab4f9fc9aa5a91815..934a2479f16077282264e1fd75584b17ab96f8b1 100644 (file)
@@ -112,7 +112,6 @@ struct nfnl_callback
 {
        int (*call)(struct sock *nl, struct sk_buff *skb, 
                struct nlmsghdr *nlh, struct nfattr *cda[], int *errp);
-       kernel_cap_t cap_required; /* capabilities required for this msg */
        u_int16_t attr_count;   /* number of nfattr's */
 };
 
@@ -154,11 +153,14 @@ extern void nfattr_parse(struct nfattr *tb[], int maxattr,
 
 #define nfattr_bad_size(tb, max, cta_min)                              \
 ({     int __i, __res = 0;                                             \
-       for (__i=0; __i<max; __i++)                                     \
+       for (__i=0; __i<max; __i++) {                                   \
+               if (!cta_min[__i])                                      \
+                       continue;                                       \
                if (tb[__i] && NFA_PAYLOAD(tb[__i]) < cta_min[__i]){    \
                        __res = 1;                                      \
                        break;                                          \
                }                                                       \
+       }                                                               \
        __res;                                                          \
 })
 
index ba6c310a055fa123c0169dfd47ecdbdd11dcfb19..ee700c6eb4427f5582438aaf9f861c134f626a41 100644 (file)
@@ -53,12 +53,12 @@ void release_pages(struct page **pages, int nr, int cold);
 
 static inline struct page *page_cache_alloc(struct address_space *x)
 {
-       return alloc_pages(mapping_gfp_mask(x)|__GFP_NORECLAIM, 0);
+       return alloc_pages(mapping_gfp_mask(x), 0);
 }
 
 static inline struct page *page_cache_alloc_cold(struct address_space *x)
 {
-       return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD|__GFP_NORECLAIM, 0);
+       return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
 }
 
 typedef int filler_t(void *, struct page *);
index 857126a36ecc42813e085dd70e236db349d7671f..4877e35ae2028b97fe58b7756b52196c2d44ce8e 100644 (file)
                                OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL)
 
 #ifdef CONFIG_ACPI
-extern acpi_status pci_osc_control_set(u32 flags);
+extern acpi_status pci_osc_control_set(acpi_handle handle, u32 flags);
 extern acpi_status pci_osc_support_set(u32 flags);
 #else
 #if !defined(acpi_status)
 typedef u32            acpi_status;
 #define AE_ERROR       (acpi_status) (0x0001)
 #endif    
-static inline acpi_status pci_osc_control_set(u32 flags) {return AE_ERROR;}
+static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
+{return AE_ERROR;}
 static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} 
 #endif
 
index 3596ac94ecff74916f88499fb0e4bfa02a1fe1ff..de690ca73d580f06b37f1bcd8f9412bffa3981c2 100644 (file)
@@ -236,7 +236,6 @@ struct module;
 struct pci_driver {
        struct list_head node;
        char *name;
-       struct module *owner;
        const struct pci_device_id *id_table;   /* must be non-NULL for probe to be called */
        int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);   /* New device inserted */
        void (*remove) (struct pci_dev *dev);   /* Device removed (NULL if not a hot-plug capable driver) */
@@ -338,6 +337,7 @@ struct pci_dev *pci_find_device (unsigned int vendor, unsigned int device, const
 struct pci_dev *pci_find_device_reverse (unsigned int vendor, unsigned int device, const struct pci_dev *from);
 struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn);
 int pci_find_capability (struct pci_dev *dev, int cap);
+int pci_find_next_capability (struct pci_dev *dev, u8 pos, int cap);
 int pci_find_ext_capability (struct pci_dev *dev, int cap);
 struct pci_bus * pci_find_next_bus(const struct pci_bus *from);
 
@@ -432,8 +432,13 @@ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
                           void *alignf_data);
 void pci_enable_bridges(struct pci_bus *bus);
 
-/* New-style probing supporting hot-pluggable devices */
-int pci_register_driver(struct pci_driver *);
+/* Proper probing supporting hot-pluggable devices */
+int __pci_register_driver(struct pci_driver *, struct module *);
+static inline int pci_register_driver(struct pci_driver *driver)
+{
+       return __pci_register_driver(driver, THIS_MODULE);
+}
+
 void pci_unregister_driver(struct pci_driver *);
 void pci_remove_behind_bridge(struct pci_dev *);
 struct pci_driver *pci_dev_driver(const struct pci_dev *);
@@ -547,9 +552,11 @@ static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
 static inline void pci_disable_device(struct pci_dev *dev) { }
 static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
 static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
+static inline int __pci_register_driver(struct pci_driver *drv, struct module *owner) { return 0;}
 static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
 static inline void pci_unregister_driver(struct pci_driver *drv) { }
 static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
+static inline int pci_find_next_capability (struct pci_dev *dev, u8 post, int cap) { return 0; }
 static inline int pci_find_ext_capability (struct pci_dev *dev, int cap) {return 0; }
 static inline const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { return NULL; }
 
index 4e06eb0f4451114e2443f928ade60b2f5eee961d..7b387faedb4d68e94a12c1c4ef5080e90fb3f790 100644 (file)
 #define PCI_DEVICE_ID_IBM_SNIPE                0x0180
 #define PCI_DEVICE_ID_IBM_CITRINE              0x028C
 #define PCI_DEVICE_ID_IBM_GEMSTONE             0xB166
+#define PCI_DEVICE_ID_IBM_OBSIDIAN             0x02BD
 #define PCI_DEVICE_ID_IBM_ICOM_DEV_ID_1        0x0031
 #define PCI_DEVICE_ID_IBM_ICOM_DEV_ID_2        0x0219
 #define PCI_DEVICE_ID_IBM_ICOM_V2_TWO_PORTS_RVX                0x021A
 #define PCI_DEVICE_ID_APPLE_SH_SUNGEM   0x0051
 #define PCI_DEVICE_ID_APPLE_U3L_AGP    0x0058
 #define PCI_DEVICE_ID_APPLE_U3H_AGP    0x0059
+#define PCI_DEVICE_ID_APPLE_IPID2_AGP  0x0066
+#define PCI_DEVICE_ID_APPLE_IPID2_ATA  0x0069
+#define PCI_DEVICE_ID_APPLE_IPID2_FW   0x006a
+#define PCI_DEVICE_ID_APPLE_IPID2_GMAC 0x006b
 #define PCI_DEVICE_ID_APPLE_TIGON3     0x1645
 
 #define PCI_VENDOR_ID_YAMAHA           0x1073
 #define PCI_SUBDEVICE_ID_KEYSPAN_SX2   0x5334
 
 #define PCI_VENDOR_ID_MARVELL          0x11ab
+#define PCI_DEVICE_ID_MARVELL_GT64111  0x4146
 #define PCI_DEVICE_ID_MARVELL_GT64260  0x6430
 #define PCI_DEVICE_ID_MARVELL_MV64360  0x6460
 #define PCI_DEVICE_ID_MARVELL_MV64460  0x6480
 #define PCI_DEVICE_ID_ADAPTEC2_7899B   0x00c1
 #define PCI_DEVICE_ID_ADAPTEC2_7899D   0x00c3
 #define PCI_DEVICE_ID_ADAPTEC2_7899P   0x00cf
+#define PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN   0x0500
 #define PCI_DEVICE_ID_ADAPTEC2_SCAMP   0x0503
 
 
index 5451eb1e781d37f67d29ab2e140bef34182fec8e..fb8d2d24e4bb1d855b4d6017202c6dca2882dfa1 100644 (file)
@@ -38,7 +38,7 @@ extern void free_percpu(const void *);
 
 #else /* CONFIG_SMP */
 
-#define per_cpu_ptr(ptr, cpu) (ptr)
+#define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); })
 
 static inline void *__alloc_percpu(size_t size, size_t align)
 {
index 1a165b7ae01b5889b154133b345a53c4a022f58b..17e336f40b479e61e70eaac21776ca035af60a6b 100644 (file)
@@ -43,4 +43,19 @@ extern int platform_device_add_data(struct platform_device *pdev, void *data, si
 extern int platform_device_add(struct platform_device *pdev);
 extern void platform_device_put(struct platform_device *pdev);
 
+struct platform_driver {
+       int (*probe)(struct platform_device *);
+       int (*remove)(struct platform_device *);
+       void (*shutdown)(struct platform_device *);
+       int (*suspend)(struct platform_device *, pm_message_t state);
+       int (*resume)(struct platform_device *);
+       struct device_driver driver;
+};
+
+extern int platform_driver_register(struct platform_driver *);
+extern void platform_driver_unregister(struct platform_driver *);
+
+#define platform_get_drvdata(_dev)     dev_get_drvdata(&(_dev)->dev)
+#define platform_set_drvdata(_dev,data)        dev_set_drvdata(&(_dev)->dev, (data))
+
 #endif /* _PLATFORM_DEVICE_H_ */
index 1514098d156d897ba02956517bc544f7626f5f87..5be87ba3b7ac2f92ebadbe0bf30076704a2f5fe6 100644 (file)
@@ -94,55 +94,6 @@ struct pm_dev
        struct list_head entry;
 };
 
-#ifdef CONFIG_PM
-
-extern int pm_active;
-
-#define PM_IS_ACTIVE() (pm_active != 0)
-
-/*
- * Register a device with power management
- */
-struct pm_dev __deprecated *
-pm_register(pm_dev_t type, unsigned long id, pm_callback callback);
-
-/*
- * Unregister a device with power management
- */
-void __deprecated pm_unregister(struct pm_dev *dev);
-
-/*
- * Unregister all devices with matching callback
- */
-void __deprecated pm_unregister_all(pm_callback callback);
-
-/*
- * Send a request to all devices
- */
-int __deprecated pm_send_all(pm_request_t rqst, void *data);
-
-#else /* CONFIG_PM */
-
-#define PM_IS_ACTIVE() 0
-
-static inline struct pm_dev *pm_register(pm_dev_t type,
-                                        unsigned long id,
-                                        pm_callback callback)
-{
-       return NULL;
-}
-
-static inline void pm_unregister(struct pm_dev *dev) {}
-
-static inline void pm_unregister_all(pm_callback callback) {}
-
-static inline int pm_send_all(pm_request_t rqst, void *data)
-{
-       return 0;
-}
-
-#endif /* CONFIG_PM */
-
 /* Functions above this comment are list-based old-style power
  * managment. Please avoid using them.  */
 
diff --git a/include/linux/pm_legacy.h b/include/linux/pm_legacy.h
new file mode 100644 (file)
index 0000000..1252b45
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef __LINUX_PM_LEGACY_H__
+#define __LINUX_PM_LEGACY_H__
+
+#include <linux/config.h>
+
+#ifdef CONFIG_PM_LEGACY
+
+extern int pm_active;
+
+#define PM_IS_ACTIVE() (pm_active != 0)
+
+/*
+ * Register a device with power management
+ */
+struct pm_dev __deprecated *
+pm_register(pm_dev_t type, unsigned long id, pm_callback callback);
+
+/*
+ * Unregister a device with power management
+ */
+void __deprecated pm_unregister(struct pm_dev *dev);
+
+/*
+ * Unregister all devices with matching callback
+ */
+void __deprecated pm_unregister_all(pm_callback callback);
+
+/*
+ * Send a request to all devices
+ */
+int __deprecated pm_send_all(pm_request_t rqst, void *data);
+
+#else /* CONFIG_PM_LEGACY */
+
+#define PM_IS_ACTIVE() 0
+
+static inline struct pm_dev *pm_register(pm_dev_t type,
+                                        unsigned long id,
+                                        pm_callback callback)
+{
+       return NULL;
+}
+
+static inline void pm_unregister(struct pm_dev *dev) {}
+
+static inline void pm_unregister_all(pm_callback callback) {}
+
+static inline int pm_send_all(pm_request_t rqst, void *data)
+{
+       return 0;
+}
+
+#endif /* CONFIG_PM_LEGACY */
+
+#endif /* __LINUX_PM_LEGACY_H__ */
+
index dd98c54a23b4b44afd860603f2a3da73bb29ecbc..d9a2f5254a51194858091bec44bf6bfb43cb9168 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/thread_info.h>
 #include <linux/linkage.h>
 
 #ifdef CONFIG_DEBUG_PREEMPT
index a71123c282728389fdc9b0e0d2e3d3d6ea44cce2..48831eac291075b31cb45d766cc8f76b6c9cdaac 100644 (file)
@@ -1,4 +1,9 @@
 /*
+ * raid_class.h - a generic raid visualisation class
+ *
+ * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
+ *
+ * This file is licensed under GPLv2
  */
 #include <linux/transport_class.h>
 
@@ -14,20 +19,35 @@ struct raid_function_template {
 };
 
 enum raid_state {
-       RAID_ACTIVE = 1,
-       RAID_DEGRADED,
-       RAID_RESYNCING,
-       RAID_OFFLINE,
+       RAID_STATE_UNKNOWN = 0,
+       RAID_STATE_ACTIVE,
+       RAID_STATE_DEGRADED,
+       RAID_STATE_RESYNCING,
+       RAID_STATE_OFFLINE,
+};
+
+enum raid_level {
+       RAID_LEVEL_UNKNOWN = 0,
+       RAID_LEVEL_LINEAR,
+       RAID_LEVEL_0,
+       RAID_LEVEL_1,
+       RAID_LEVEL_3,
+       RAID_LEVEL_4,
+       RAID_LEVEL_5,
+       RAID_LEVEL_6,
 };
 
 struct raid_data {
        struct list_head component_list;
        int component_count;
-       int level;
+       enum raid_level level;
        enum raid_state state;
        int resync;
 };
 
+/* resync complete goes from 0 to this */
+#define RAID_MAX_RESYNC                (10000)
+
 #define DEFINE_RAID_ATTRIBUTE(type, attr)                                    \
 static inline void                                                           \
 raid_set_##attr(struct raid_template *r, struct device *dev, type value) {    \
@@ -48,7 +68,7 @@ raid_get_##attr(struct raid_template *r, struct device *dev) {                      \
        return rd->attr;                                                      \
 }
 
-DEFINE_RAID_ATTRIBUTE(int, level)
+DEFINE_RAID_ATTRIBUTE(enum raid_level, level)
 DEFINE_RAID_ATTRIBUTE(int, resync)
 DEFINE_RAID_ATTRIBUTE(enum raid_state, state)
        
index 2bbf968b23d9b62cdc58094f5799db09ecc51ff2..2038bd27b0413c74bcb66290adc3cfe33b5c0fd3 100644 (file)
@@ -357,7 +357,6 @@ struct mm_struct {
        /* aio bits */
        rwlock_t                ioctx_list_lock;
        struct kioctx           *ioctx_list;
-       struct kioctx           default_kioctx;
 };
 
 struct sighand_struct {
@@ -1233,32 +1232,49 @@ static inline void task_unlock(struct task_struct *p)
        spin_unlock(&p->alloc_lock);
 }
 
+#ifndef __HAVE_THREAD_FUNCTIONS
+
+#define task_thread_info(task) (task)->thread_info
+
+static inline void setup_thread_stack(struct task_struct *p, struct task_struct *org)
+{
+       *task_thread_info(p) = *task_thread_info(org);
+       task_thread_info(p)->task = p;
+}
+
+static inline unsigned long *end_of_stack(struct task_struct *p)
+{
+       return (unsigned long *)(p->thread_info + 1);
+}
+
+#endif
+
 /* set thread flags in other task's structures
  * - see asm/thread_info.h for TIF_xxxx flags available
  */
 static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag)
 {
-       set_ti_thread_flag(tsk->thread_info,flag);
+       set_ti_thread_flag(task_thread_info(tsk), flag);
 }
 
 static inline void clear_tsk_thread_flag(struct task_struct *tsk, int flag)
 {
-       clear_ti_thread_flag(tsk->thread_info,flag);
+       clear_ti_thread_flag(task_thread_info(tsk), flag);
 }
 
 static inline int test_and_set_tsk_thread_flag(struct task_struct *tsk, int flag)
 {
-       return test_and_set_ti_thread_flag(tsk->thread_info,flag);
+       return test_and_set_ti_thread_flag(task_thread_info(tsk), flag);
 }
 
 static inline int test_and_clear_tsk_thread_flag(struct task_struct *tsk, int flag)
 {
-       return test_and_clear_ti_thread_flag(tsk->thread_info,flag);
+       return test_and_clear_ti_thread_flag(task_thread_info(tsk), flag);
 }
 
 static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag)
 {
-       return test_ti_thread_flag(tsk->thread_info,flag);
+       return test_ti_thread_flag(task_thread_info(tsk), flag);
 }
 
 static inline void set_tsk_need_resched(struct task_struct *tsk)
@@ -1329,12 +1345,12 @@ extern void signal_wake_up(struct task_struct *t, int resume_stopped);
 
 static inline unsigned int task_cpu(const struct task_struct *p)
 {
-       return p->thread_info->cpu;
+       return task_thread_info(p)->cpu;
 }
 
 static inline void set_task_cpu(struct task_struct *p, unsigned int cpu)
 {
-       p->thread_info->cpu = cpu;
+       task_thread_info(p)->cpu = cpu;
 }
 
 #else
index 83010231db99289ad3f70935f720a723f401ae3a..0a8ea8b358162b00fcd4036f5a3b23ad6f668a7d 100644 (file)
@@ -1236,8 +1236,7 @@ extern unsigned int    datagram_poll(struct file *file, struct socket *sock,
 extern int            skb_copy_datagram_iovec(const struct sk_buff *from,
                                               int offset, struct iovec *to,
                                               int size);
-extern int            skb_copy_and_csum_datagram_iovec(const
-                                                       struct sk_buff *skb,
+extern int            skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                                        int hlen,
                                                        struct iovec *iov);
 extern void           skb_free_datagram(struct sock *sk, struct sk_buff *skb);
@@ -1305,6 +1304,30 @@ static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *
 
 extern void __net_timestamp(struct sk_buff *skb);
 
+extern unsigned int __skb_checksum_complete(struct sk_buff *skb);
+
+/**
+ *     skb_checksum_complete - Calculate checksum of an entire packet
+ *     @skb: packet to process
+ *
+ *     This function calculates the checksum over the entire packet plus
+ *     the value of skb->csum.  The latter can be used to supply the
+ *     checksum of a pseudo header as used by TCP/UDP.  It returns the
+ *     checksum.
+ *
+ *     For protocols that contain complete checksums such as ICMP/TCP/UDP,
+ *     this function can be used to verify that checksum on received
+ *     packets.  In that case the function should return zero if the
+ *     checksum is correct.  In particular, this function will return zero
+ *     if skb->ip_summed is CHECKSUM_UNNECESSARY which indicates that the
+ *     hardware has already verified the correctness of the checksum.
+ */
+static inline unsigned int skb_checksum_complete(struct sk_buff *skb)
+{
+       return skb->ip_summed != CHECKSUM_UNNECESSARY &&
+               __skb_checksum_complete(skb);
+}
+
 #ifdef CONFIG_NETFILTER
 static inline void nf_conntrack_put(struct nf_conntrack *nfct)
 {
index b63ce70140931e4f07079f50447b08de8bd63fcd..fa1ff3b165fe167739099c19625282eaa5ecd2e7 100644 (file)
@@ -2,11 +2,10 @@
 #define __LINUX_SMPLOCK_H
 
 #include <linux/config.h>
+#ifdef CONFIG_LOCK_KERNEL
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 
-#ifdef CONFIG_LOCK_KERNEL
-
 #define kernel_locked()                (current->lock_depth >= 0)
 
 extern int __lockfunc __reacquire_kernel_lock(void);
index 22cf5e1ac9875c8b02bade643b8f9dedf0e7ba3d..6bc03c911a83269d83c2692adff04a66c444fbe6 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/list.h>
 #include <linux/compiler.h>
 
 struct file;
@@ -390,6 +389,7 @@ enum
        NET_TCP_BIC_BETA=108,
        NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
        NET_TCP_CONG_CONTROL=110,
+       NET_TCP_ABC=111,
 };
 
 enum {
@@ -714,6 +714,7 @@ enum {
        NET_SCTP_PRSCTP_ENABLE           = 14,
        NET_SCTP_SNDBUF_POLICY           = 15,
        NET_SCTP_SACK_TIMEOUT            = 16,
+       NET_SCTP_RCVBUF_POLICY           = 17,
 };
 
 /* /proc/sys/net/bridge */
@@ -857,6 +858,7 @@ enum
 };
 
 #ifdef __KERNEL__
+#include <linux/list.h>
 
 extern void sysctl_init(void);
 
index ac4ca44c75caec326729575ba9293aab0ca457f1..0e1da6602e054c24ee3f27f8dfe8b5d288e00c69 100644 (file)
@@ -307,6 +307,21 @@ struct tcp_sock {
        struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
        struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
 
+       struct tcp_sack_block recv_sack_cache[4];
+
+       /* from STCP, retrans queue hinting */
+       struct sk_buff* lost_skb_hint;
+
+       struct sk_buff *scoreboard_skb_hint;
+       struct sk_buff *retransmit_skb_hint;
+       struct sk_buff *forward_skb_hint;
+       struct sk_buff *fastpath_skb_hint;
+
+       int     fastpath_cnt_hint;
+       int     lost_cnt_hint;
+       int     retransmit_cnt_hint;
+       int     forward_cnt_hint;
+
        __u16   advmss;         /* Advertised MSS                       */
        __u16   prior_ssthresh; /* ssthresh saved at recovery start     */
        __u32   lost_out;       /* Lost packets                 */
@@ -326,6 +341,7 @@ struct tcp_sock {
        __u32   snd_up;         /* Urgent pointer               */
 
        __u32   total_retrans;  /* Total retransmits for entire connection */
+       __u32   bytes_acked;    /* Appropriate Byte Counting - RFC3465 */
 
        unsigned int            keepalive_time;   /* time before keep alive takes place */
        unsigned int            keepalive_intvl;  /* time interval between keep alive probes */
index d252f45a0f9b6747ceb1d1c9d3d75cfecab29b28..1c4eb41dbd89df9182c3fcdbf9f418c5958cc5c6 100644 (file)
@@ -27,31 +27,6 @@ extern long do_no_restart_syscall(struct restart_block *parm);
  * - pass TIF_xxxx constants to these functions
  */
 
-static inline void set_thread_flag(int flag)
-{
-       set_bit(flag,&current_thread_info()->flags);
-}
-
-static inline void clear_thread_flag(int flag)
-{
-       clear_bit(flag,&current_thread_info()->flags);
-}
-
-static inline int test_and_set_thread_flag(int flag)
-{
-       return test_and_set_bit(flag,&current_thread_info()->flags);
-}
-
-static inline int test_and_clear_thread_flag(int flag)
-{
-       return test_and_clear_bit(flag,&current_thread_info()->flags);
-}
-
-static inline int test_thread_flag(int flag)
-{
-       return test_bit(flag,&current_thread_info()->flags);
-}
-
 static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
 {
        set_bit(flag,&ti->flags);
@@ -77,15 +52,19 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
        return test_bit(flag,&ti->flags);
 }
 
-static inline void set_need_resched(void)
-{
-       set_thread_flag(TIF_NEED_RESCHED);
-}
-
-static inline void clear_need_resched(void)
-{
-       clear_thread_flag(TIF_NEED_RESCHED);
-}
+#define set_thread_flag(flag) \
+       set_ti_thread_flag(current_thread_info(), flag)
+#define clear_thread_flag(flag) \
+       clear_ti_thread_flag(current_thread_info(), flag)
+#define test_and_set_thread_flag(flag) \
+       test_and_set_ti_thread_flag(current_thread_info(), flag)
+#define test_and_clear_thread_flag(flag) \
+       test_and_clear_ti_thread_flag(current_thread_info(), flag)
+#define test_thread_flag(flag) \
+       test_ti_thread_flag(current_thread_info(), flag)
+
+#define set_need_resched()     set_thread_flag(TIF_NEED_RESCHED)
+#define clear_need_resched()   clear_thread_flag(TIF_NEED_RESCHED)
 
 #endif
 
index 8e83f4e778bb11657f2363cf82eb491562615439..bfbe92d0767c62a61f09db17b5b59cb8e4a080a6 100644 (file)
@@ -101,7 +101,7 @@ extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
 static inline void
 set_normalized_timespec (struct timespec *ts, time_t sec, long nsec)
 {
-       while (nsec > NSEC_PER_SEC) {
+       while (nsec >= NSEC_PER_SEC) {
                nsec -= NSEC_PER_SEC;
                ++sec;
        }
index 748d04385256dc1063249bd282267b55834bb6e7..856d232c756235bcf66ce5d20d0609914d5d5cfd 100644 (file)
@@ -819,7 +819,7 @@ typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);
  */
 struct urb
 {
-       /* private, usb core and host controller only fields in the urb */
+       /* private: usb core and host controller only fields in the urb */
        struct kref kref;               /* reference count of the URB */
        spinlock_t lock;                /* lock for the URB */
        void *hcpriv;                   /* private data for host controller */
@@ -827,7 +827,7 @@ struct urb
        atomic_t use_count;             /* concurrent submissions counter */
        u8 reject;                      /* submissions will fail */
 
-       /* public, documented fields in the urb that can be used by drivers */
+       /* public: documented fields in the urb that can be used by drivers */
        struct list_head urb_list;      /* list head for use by the urb's
                                         * current owner */
        struct usb_device *dev;         /* (in) pointer to associated device */
@@ -1045,7 +1045,7 @@ struct usb_sg_request {
        size_t                  bytes;
 
        /* 
-        * members below are private to usbcore,
+        * members below are private: to usbcore,
         * and are not provided for driver access!
         */
        spinlock_t              lock;
index a114fff6568b18d303dd28d579fe591033c5f9c8..1cded681eb6d2a1041270441f99dd4473e7c6c96 100644 (file)
@@ -636,6 +636,7 @@ typedef __u64 v4l2_std_id;
 #define V4L2_STD_SECAM_K        ((v4l2_std_id)0x00100000)
 #define V4L2_STD_SECAM_K1       ((v4l2_std_id)0x00200000)
 #define V4L2_STD_SECAM_L        ((v4l2_std_id)0x00400000)
+#define V4L2_STD_SECAM_LC       ((v4l2_std_id)0x00800000)
 
 /* ATSC/HDTV */
 #define V4L2_STD_ATSC_8_VSB     ((v4l2_std_id)0x01000000)
index 0f1ba95ec8d654ad2102ff0b08ef934a4c59197f..ad3e9bb670c3eb93c58e5707cd0052f35c316b6a 100644 (file)
@@ -49,6 +49,7 @@ struct ir_input_state {
 
 extern IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE];
+extern IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE];
index 00fa57eb9fde928fc04d440ae39cdde2205266ee..730f21ed91db18aa28b705147da6e377c517ac14 100644 (file)
@@ -19,4 +19,6 @@ struct IR_i2c {
        char                   phys[32];
        int                    (*get_key)(struct IR_i2c*, u32*, u32*);
 };
+
+int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
 #endif
index 9184e534b7efce2a31253a09e4913a31394943d2..faa0f8e3091bf623f97939d69a61efbdc5e5d466 100644 (file)
 #define TUNER_PHILIPS_TD1316           67
 
 #define TUNER_PHILIPS_TUV1236D         68      /* ATI HDTV Wonder */
+#define TUNER_TNF_5335MF                69     /* Sabrent Bt848   */
 
 #define NOTUNER 0
 #define PAL     1      /* PAL_BG */
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
new file mode 100644 (file)
index 0000000..d3fd481
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+    v4l2 common internal API header
+
+    This header contains internal shared ioctl definitions for use by the
+    internal low-level v4l2 drivers.
+    Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal
+    define,
+
+    Copyright (C) 2005  Hans Verkuil <hverkuil@xs4all.nl>
+
+    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.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef V4L2_COMMON_H_
+#define V4L2_COMMON_H_
+
+/* VIDIOC_INT_AUDIO_CLOCK_FREQ */
+enum v4l2_audio_clock_freq {
+       V4L2_AUDCLK_32_KHZ  = 32000,
+       V4L2_AUDCLK_441_KHZ = 44100,
+       V4L2_AUDCLK_48_KHZ  = 48000,
+};
+
+/* VIDIOC_INT_G_REGISTER and VIDIOC_INT_S_REGISTER */
+struct v4l2_register {
+       u32 i2c_id;             /* I2C driver ID of the I2C chip. 0 for the I2C adapter. */
+       unsigned long reg;
+       u32 val;
+};
+
+/* VIDIOC_INT_DECODE_VBI_LINE */
+struct v4l2_decode_vbi_line {
+       u32 is_second_field;    /* Set to 0 for the first (odd) field,
+                                  set to 1 for the second (even) field. */
+       u8 *p;                  /* Pointer to the sliced VBI data from the decoder.
+                                  On exit points to the start of the payload. */
+       u32 line;               /* Line number of the sliced VBI data (1-23) */
+       u32 type;               /* VBI service type (V4L2_SLICED_*). 0 if no service found */
+};
+
+/* VIDIOC_INT_G_CHIP_IDENT: identifies the actual chip installed on the board */
+enum v4l2_chip_ident {
+       /* general idents: reserved range 0-49 */
+       V4L2_IDENT_UNKNOWN = 0,
+
+       /* module saa7115: reserved range 100-149 */
+       V4L2_IDENT_SAA7114 = 104,
+       V4L2_IDENT_SAA7115 = 105,
+
+       /* module saa7127: reserved range 150-199 */
+       V4L2_IDENT_SAA7127 = 157,
+       V4L2_IDENT_SAA7129 = 159,
+
+       /* module cx25840: reserved range 200-249 */
+       V4L2_IDENT_CX25840 = 240,
+       V4L2_IDENT_CX25841 = 241,
+       V4L2_IDENT_CX25842 = 242,
+       V4L2_IDENT_CX25843 = 243,
+};
+
+/* only implemented if CONFIG_VIDEO_ADV_DEBUG is defined */
+#define        VIDIOC_INT_S_REGISTER           _IOR ('d', 100, struct v4l2_register)
+#define        VIDIOC_INT_G_REGISTER           _IOWR('d', 101, struct v4l2_register)
+
+/* Reset the I2C chip */
+#define VIDIOC_INT_RESET               _IO  ('d', 102)
+
+/* Set the frequency of the audio clock output.
+   Used to slave an audio processor to the video decoder, ensuring that audio
+   and video remain synchronized. */
+#define VIDIOC_INT_AUDIO_CLOCK_FREQ    _IOR ('d', 103, enum v4l2_audio_clock_freq)
+
+/* Video decoders that support sliced VBI need to implement this ioctl.
+   Field p of the v4l2_sliced_vbi_line struct is set to the start of the VBI
+   data that was generated by the decoder. The driver then parses the sliced
+   VBI data and sets the other fields in the struct accordingly. The pointer p
+   is updated to point to the start of the payload which can be copied
+   verbatim into the data field of the v4l2_sliced_vbi_data struct. If no
+   valid VBI data was found, then the type field is set to 0 on return. */
+#define VIDIOC_INT_DECODE_VBI_LINE     _IOWR('d', 104, struct v4l2_decode_vbi_line)
+
+/* Used to generate VBI signals on a video signal. v4l2_sliced_vbi_data is
+   filled with the data packets that should be output. Note that if you set
+   the line field to 0, then that VBI signal is disabled. */
+#define VIDIOC_INT_S_VBI_DATA          _IOW ('d', 105, struct v4l2_sliced_vbi_data)
+
+/* Used to obtain the sliced VBI packet from a readback register. Not all
+   video decoders support this. If no data is available because the readback
+   register contains invalid or erroneous data -EIO is returned. Note that
+   you must fill in the 'id' member and the 'field' member (to determine
+   whether CC data from the first or second field should be obtained). */
+#define VIDIOC_INT_G_VBI_DATA          _IOWR('d', 106, struct v4l2_sliced_vbi_data *)
+
+/* Returns the chip identifier or V4L2_IDENT_UNKNOWN if no identification can
+   be made. */
+#define VIDIOC_INT_G_CHIP_IDENT                _IOR ('d', 107, enum v4l2_chip_ident *)
+
+#endif /* V4L2_COMMON_H_ */
index b93fd8c1d8847f6488667f60512ee3a9a70bb077..cde2f4f4f501775d968a343d75ec8a2b0859c7e5 100644 (file)
@@ -1042,7 +1042,7 @@ static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr)
        case IEEE80211_4ADDR_LEN:
                return ((struct ieee80211_hdr_4addr *)hdr)->payload;
        }
-
+       return NULL;
 }
 
 static inline int ieee80211_is_ofdm_rate(u8 rate)
index c7a959428b4ffa54f221b7d1f4473519631a6975..8f6306581fa765500d095d5693fd783201c2bdc4 100644 (file)
@@ -357,7 +357,7 @@ static inline void llc_pdu_init_as_test_rsp(struct sk_buff *skb,
 
 /* LLC Type 1 XID command/response information fields format */
 struct llc_xid_info {
-       u8 fmt_id;      /* always 0x18 for LLC */
+       u8 fmt_id;      /* always 0x81 for LLC */
        u8 type;        /* different if NULL/non-NULL LSAP */
        u8 rw;          /* sender receive window */
 };
index dc107ffad483f0c1863f77a5a415050435c1dd8d..34a1a09e5aeff93927fb058be18e79e6afbf32df 100644 (file)
@@ -120,6 +120,7 @@ typedef union {
        int error;
        sctp_state_t state;
        sctp_event_timeout_t to;
+       unsigned long zero;
        void *ptr;
        struct sctp_chunk *chunk;
        struct sctp_association *asoc;
@@ -148,17 +149,17 @@ static inline sctp_arg_t SCTP_NULL(void)
 }
 static inline sctp_arg_t SCTP_NOFORCE(void)
 {
-       sctp_arg_t retval; retval.i32 = 0; return retval;
+       sctp_arg_t retval = {.zero = 0UL}; retval.i32 = 0; return retval;
 }
 static inline sctp_arg_t SCTP_FORCE(void)
 {
-       sctp_arg_t retval; retval.i32 = 1; return retval;
+       sctp_arg_t retval = {.zero = 0UL}; retval.i32 = 1; return retval;
 }
 
 #define SCTP_ARG_CONSTRUCTOR(name, type, elt) \
 static inline sctp_arg_t       \
 SCTP_## name (type arg)                \
-{ sctp_arg_t retval; retval.elt = arg; return retval; }
+{ sctp_arg_t retval = {.zero = 0UL}; retval.elt = arg; return retval; }
 
 SCTP_ARG_CONSTRUCTOR(I32,      __s32, i32)
 SCTP_ARG_CONSTRUCTOR(U32,      __u32, u32)
index 9c385b6417c71b4ae7a48f2b113e2a9d1a6b0244..8e7794ee27ffb8d05f1a0ed0560825ed6f8a975a 100644 (file)
@@ -161,6 +161,13 @@ extern struct sctp_globals {
         */
        int sndbuf_policy;
 
+       /*
+        * Policy for preforming sctp/socket accounting
+        * 0   - do socket level accounting, all assocs share sk_rcvbuf
+        * 1   - do sctp accounting, each asoc may use sk_rcvbuf bytes
+        */
+       int rcvbuf_policy;
+
        /* Delayed SACK timeout  200ms default*/
        int sack_timeout;
 
@@ -218,6 +225,7 @@ extern struct sctp_globals {
 #define sctp_cookie_preserve_enable    (sctp_globals.cookie_preserve_enable)
 #define sctp_max_retrans_association   (sctp_globals.max_retrans_association)
 #define sctp_sndbuf_policy             (sctp_globals.sndbuf_policy)
+#define sctp_rcvbuf_policy             (sctp_globals.rcvbuf_policy)
 #define sctp_max_retrans_path          (sctp_globals.max_retrans_path)
 #define sctp_max_retrans_init          (sctp_globals.max_retrans_init)
 #define sctp_sack_timeout              (sctp_globals.sack_timeout)
@@ -1222,11 +1230,11 @@ struct sctp_endpoint {
        int last_key;
        int key_changed_at;
 
-       /* Default timeouts.  */
-       int timeouts[SCTP_NUM_TIMEOUT_TYPES];
-
        /* sendbuf acct. policy.        */
        __u32 sndbuf_policy;
+
+       /* rcvbuf acct. policy. */
+       __u32 rcvbuf_policy;
 };
 
 /* Recover the outter endpoint structure. */
@@ -1553,6 +1561,11 @@ struct sctp_association {
         */
        int sndbuf_used;
 
+       /* This is the amount of memory that this association has allocated
+        * in the receive path at any given time.
+        */
+       atomic_t rmem_alloc;
+
        /* This is the wait queue head for send requests waiting on
         * the association sndbuf space.
         */
index ff13c4cc287add76e658418aaae91970c1c87f66..982b4ecd187b9393b9470a3da7462bdd878a0e52 100644 (file)
@@ -1247,6 +1247,12 @@ static inline struct page *sk_stream_alloc_page(struct sock *sk)
                     (skb != (struct sk_buff *)&(sk)->sk_write_queue);  \
                     skb = skb->next)
 
+/*from STCP for fast SACK Process*/
+#define sk_stream_for_retrans_queue_from(skb, sk)                      \
+               for (; (skb != (sk)->sk_send_head) &&                   \
+                    (skb != (struct sk_buff *)&(sk)->sk_write_queue);  \
+                    skb = skb->next)
+
 /*
  *     Default write policy as shown to user space via poll/select/SIGIO
  */
index c24339c4e31063677eebe5471825994b7295c21b..d78025f9fbea218bc6a09201534d619ca8893bae 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/cache.h>
 #include <linux/percpu.h>
+#include <linux/skbuff.h>
 
 #include <net/inet_connection_sock.h>
 #include <net/inet_timewait_sock.h>
@@ -88,10 +89,10 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
                                 */
 
 #define TCP_SYN_RETRIES         5      /* number of times to retry active opening a
-                                * connection: ~180sec is RFC minumum   */
+                                * connection: ~180sec is RFC minimum   */
 
 #define TCP_SYNACK_RETRIES 5   /* number of times to retry passive opening a
-                                * connection: ~180sec is RFC minumum   */
+                                * connection: ~180sec is RFC minimum   */
 
 
 #define TCP_ORPHAN_RETRIES 7   /* number of times to retry on an orphaned
@@ -179,7 +180,7 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
 /* Flags in tp->nonagle */
 #define TCP_NAGLE_OFF          1       /* Nagle's algo is disabled */
 #define TCP_NAGLE_CORK         2       /* Socket is corked         */
-#define TCP_NAGLE_PUSH         4       /* Cork is overriden for already queued data */
+#define TCP_NAGLE_PUSH         4       /* Cork is overridden for already queued data */
 
 extern struct inet_timewait_death_row tcp_death_row;
 
@@ -217,6 +218,7 @@ extern int sysctl_tcp_low_latency;
 extern int sysctl_tcp_nometrics_save;
 extern int sysctl_tcp_moderate_rcvbuf;
 extern int sysctl_tcp_tso_win_divisor;
+extern int sysctl_tcp_abc;
 
 extern atomic_t tcp_memory_allocated;
 extern atomic_t tcp_sockets_allocated;
@@ -550,13 +552,13 @@ extern u32        __tcp_select_window(struct sock *sk);
 
 /* TCP timestamps are only 32-bits, this causes a slight
  * complication on 64-bit systems since we store a snapshot
- * of jiffies in the buffer control blocks below.  We decidely
- * only use of the low 32-bits of jiffies and hide the ugly
+ * of jiffies in the buffer control blocks below.  We decided
+ * to use only the low 32-bits of jiffies and hide the ugly
  * casts with the following macro.
  */
 #define tcp_time_stamp         ((__u32)(jiffies))
 
-/* This is what the send packet queueing engine uses to pass
+/* This is what the send packet queuing engine uses to pass
  * TCP per-packet control information to the transmission
  * code.  We also store the host-order sequence numbers in
  * here too.  This is 36 bytes on 32-bit architectures,
@@ -596,7 +598,7 @@ struct tcp_skb_cb {
 #define TCPCB_EVER_RETRANS     0x80    /* Ever retransmitted frame     */
 #define TCPCB_RETRANS          (TCPCB_SACKED_RETRANS|TCPCB_EVER_RETRANS)
 
-#define TCPCB_URG              0x20    /* Urgent pointer advenced here */
+#define TCPCB_URG              0x20    /* Urgent pointer advanced here */
 
 #define TCPCB_AT_TAIL          (TCPCB_URG)
 
@@ -764,6 +766,33 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)
                            (tp->snd_cwnd >> 2)));
 }
 
+/*
+ * Linear increase during slow start
+ */
+static inline void tcp_slow_start(struct tcp_sock *tp)
+{
+       if (sysctl_tcp_abc) {
+               /* RFC3465: Slow Start
+                * TCP sender SHOULD increase cwnd by the number of
+                * previously unacknowledged bytes ACKed by each incoming
+                * acknowledgment, provided the increase is not more than L
+                */
+               if (tp->bytes_acked < tp->mss_cache)
+                       return;
+
+               /* We MAY increase by 2 if discovered delayed ack */
+               if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) {
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+               }
+       }
+       tp->bytes_acked = 0;
+
+       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+               tp->snd_cwnd++;
+}
+
+
 static inline void tcp_sync_left_out(struct tcp_sock *tp)
 {
        if (tp->rx_opt.sack_ok &&
@@ -793,6 +822,7 @@ static inline void tcp_enter_cwr(struct sock *sk)
        struct tcp_sock *tp = tcp_sk(sk);
 
        tp->prior_ssthresh = 0;
+       tp->bytes_acked = 0;
        if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
                __tcp_enter_cwr(sk);
                tcp_set_ca_state(sk, TCP_CA_CWR);
@@ -809,6 +839,27 @@ static __inline__ __u32 tcp_max_burst(const struct tcp_sock *tp)
        return 3;
 }
 
+/* RFC2861 Check whether we are limited by application or congestion window
+ * This is the inverse of cwnd check in tcp_tso_should_defer
+ */
+static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight)
+{
+       const struct tcp_sock *tp = tcp_sk(sk);
+       u32 left;
+
+       if (in_flight >= tp->snd_cwnd)
+               return 1;
+
+       if (!(sk->sk_route_caps & NETIF_F_TSO))
+               return 0;
+
+       left = tp->snd_cwnd - in_flight;
+       if (sysctl_tcp_tso_win_divisor)
+               return left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd;
+       else
+               return left <= tcp_max_burst(tp);
+}
+
 static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, 
                                           const struct sk_buff *skb)
 {
@@ -852,7 +903,7 @@ static __inline__ u16 tcp_v4_check(struct tcphdr *th, int len,
 
 static __inline__ int __tcp_checksum_complete(struct sk_buff *skb)
 {
-       return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+       return __skb_checksum_complete(skb);
 }
 
 static __inline__ int tcp_checksum_complete(struct sk_buff *skb)
@@ -1156,6 +1207,15 @@ static inline void tcp_mib_init(void)
        TCP_ADD_STATS_USER(TCP_MIB_MAXCONN, -1);
 }
 
+/*from STCP */
+static inline void clear_all_retrans_hints(struct tcp_sock *tp){
+       tp->lost_skb_hint = NULL;
+       tp->scoreboard_skb_hint = NULL;
+       tp->retransmit_skb_hint = NULL;
+       tp->forward_skb_hint = NULL;
+       tp->fastpath_skb_hint = NULL;
+}
+
 /* /proc */
 enum tcp_seq_states {
        TCP_SEQ_STATE_LISTENING,
index ecd53d7872d2edfe44a6a9ead2d73150ef482de7..6cbb1982ed0320d306e136f50d6b380bbd9cbcbb 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/workqueue.h>
 
 struct block_device;
+struct completion;
 struct module;
 struct scsi_cmnd;
 struct scsi_device;
@@ -467,10 +468,8 @@ struct Scsi_Host {
 
        struct list_head        eh_cmd_q;
        struct task_struct    * ehandler;  /* Error recovery thread. */
-       struct semaphore      * eh_action; /* Wait for specific actions on the
-                                          host. */
-       unsigned int            eh_active:1; /* Indicates the eh thread is awake and active if
-                                          this is true. */
+       struct completion     * eh_action; /* Wait for specific actions on the
+                                             host. */
        wait_queue_head_t       host_wait;
        struct scsi_host_template *hostt;
        struct scsi_transport_template *transportt;
index 2539debb7993cf91c687ebd9f6656e5a790eee07..98d69fdb851c3844b2d914f9fd08b610f0315f7b 100644 (file)
@@ -47,9 +47,6 @@ struct scsi_request {
 
 extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t);
 extern void scsi_release_request(struct scsi_request *);
-extern void scsi_wait_req(struct scsi_request *, const void *cmnd,
-                         void *buffer, unsigned bufflen,
-                         int timeout, int retries);
 extern void scsi_do_req(struct scsi_request *, const void *cmnd,
                        void *buffer, unsigned bufflen,
                        void (*done) (struct scsi_cmnd *),
index 5a737ed9dac79d8cf2fe184e6a79574680afa01b..7430640f9816dcf7e82c9aad6b445f6678e9be1f 100644 (file)
@@ -1809,11 +1809,12 @@ int cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask)
        if (gfp_mask & __GFP_HARDWALL)  /* If hardwall request, stop here */
                return 0;
 
+       if (current->flags & PF_EXITING) /* Let dying task have memory */
+               return 1;
+
        /* Not hardwall and node outside mems_allowed: scan up cpusets */
        down(&callback_sem);
 
-       if (current->flags & PF_EXITING) /* Let dying task have memory */
-               return 1;
        task_lock(current);
        cs = nearest_exclusive_ancestor(current->cpuset);
        task_unlock(current);
index 452a1d1161782130204c934542aa2cb7f5f44b25..ee515683b92db35decaaeea608d9be919bb73f33 100644 (file)
@@ -859,7 +859,7 @@ fastcall NORET_TYPE void do_exit(long code)
        if (group_dead && tsk->signal->leader)
                disassociate_ctty(1);
 
-       module_put(tsk->thread_info->exec_domain->module);
+       module_put(task_thread_info(tsk)->exec_domain->module);
        if (tsk->binfmt)
                module_put(tsk->binfmt->module);
 
index 158710d22566006a36e6fbfb2583641eea24369e..e0d0b77343f880b60d8551338c26e05420c47291 100644 (file)
@@ -171,10 +171,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
                return NULL;
        }
 
-       *ti = *orig->thread_info;
        *tsk = *orig;
        tsk->thread_info = ti;
-       ti->task = tsk;
+       setup_thread_stack(tsk, orig);
 
        /* One for us, one for whoever does the "release_task()" (usually parent) */
        atomic_set(&tsk->usage,2);
@@ -324,7 +323,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm)
        spin_lock_init(&mm->page_table_lock);
        rwlock_init(&mm->ioctx_list_lock);
        mm->ioctx_list = NULL;
-       mm->default_kioctx = (struct kioctx)INIT_KIOCTX(mm->default_kioctx, *mm);
        mm->free_area_cache = TASK_UNMAPPED_BASE;
        mm->cached_hole_size = ~0UL;
 
@@ -919,7 +917,7 @@ static task_t *copy_process(unsigned long clone_flags,
        if (nr_threads >= max_threads)
                goto bad_fork_cleanup_count;
 
-       if (!try_module_get(p->thread_info->exec_domain->module))
+       if (!try_module_get(task_thread_info(p)->exec_domain->module))
                goto bad_fork_cleanup_count;
 
        if (p->binfmt && !try_module_get(p->binfmt->module))
@@ -1180,7 +1178,7 @@ bad_fork_cleanup:
        if (p->binfmt)
                module_put(p->binfmt->module);
 bad_fork_cleanup_put_domain:
-       module_put(p->thread_info->exec_domain->module);
+       module_put(task_thread_info(p)->exec_domain->module);
 bad_fork_cleanup_count:
        put_group_info(p->group_info);
        atomic_dec(&p->user->processes);
index ea55c7a1cd75a3dbaa50040b3d55255c12a5786f..5870efb3e2007e70ae577c76f4d71e71245914f2 100644 (file)
@@ -270,7 +270,7 @@ static void tstojiffie(struct timespec *tp, int res, u64 *jiff)
        long sec = tp->tv_sec;
        long nsec = tp->tv_nsec + res - 1;
 
-       if (nsec > NSEC_PER_SEC) {
+       if (nsec >= NSEC_PER_SEC) {
                sec++;
                nsec -= NSEC_PER_SEC;
        }
@@ -1209,13 +1209,9 @@ static int do_posix_clock_monotonic_get(clockid_t clock, struct timespec *tp)
 
        do_posix_clock_monotonic_gettime_parts(tp, &wall_to_mono);
 
-       tp->tv_sec += wall_to_mono.tv_sec;
-       tp->tv_nsec += wall_to_mono.tv_nsec;
+       set_normalized_timespec(tp, tp->tv_sec + wall_to_mono.tv_sec,
+                               tp->tv_nsec + wall_to_mono.tv_nsec);
 
-       if ((tp->tv_nsec - NSEC_PER_SEC) > 0) {
-               tp->tv_nsec -= NSEC_PER_SEC;
-               tp->tv_sec++;
-       }
        return 0;
 }
 
index 46a5e5acff97aaa86b4d3429e33fe07ca03d7bf4..5ec248cb7f4aff47261b9425c606e473e3548c74 100644 (file)
@@ -19,6 +19,15 @@ config PM
          will issue the hlt instruction if nothing is to be done, thereby
          sending the processor to sleep and saving power.
 
+config PM_LEGACY
+       bool "Legacy Power Management API"
+       depends on PM
+       default y
+       ---help---
+          Support for pm_register() and friends.
+
+          If unsure, say Y.
+
 config PM_DEBUG
        bool "Power Management Debug Support"
        depends on PM
index c71eb4579c079040265dced9de7e97a82d7c27f3..04be7d0d96a7d6ecaad42f031685b66715e0e3ff 100644 (file)
@@ -3,7 +3,8 @@ ifeq ($(CONFIG_PM_DEBUG),y)
 EXTRA_CFLAGS   +=      -DDEBUG
 endif
 
-obj-y                          := main.o process.o console.o pm.o
+obj-y                          := main.o process.o console.o
+obj-$(CONFIG_PM_LEGACY)                += pm.o
 obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o disk.o snapshot.o
 
 obj-$(CONFIG_SUSPEND_SMP)      += smp.o
index 159149321b3c2adb4dcf20372ada8edb2a098c7a..33c508e857dd1a68607c553e30ddc7c3be3cd3ae 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/mm.h>
 #include <linux/slab.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/interrupt.h>
 
 int pm_active;
index e9be027bc9300d03322a7ecf5681bdb2dec69f4b..ac8a08f3620786f266374d321312629c73e6ac01 100644 (file)
@@ -491,7 +491,10 @@ __attribute__((weak)) unsigned long long printk_clock(void)
        return sched_clock();
 }
 
-/*
+/**
+ * printk - print a kernel message
+ * @fmt: format string
+ *
  * This is printk.  It can be called from any context.  We want it to work.
  *
  * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
@@ -503,6 +506,9 @@ __attribute__((weak)) unsigned long long printk_clock(void)
  * One effect of this deferred printing is that code which calls printk() and
  * then changes console_loglevel may break. This is because console_loglevel
  * is inspected when the actual printing occurs.
+ *
+ * See also:
+ * printf(3)
  */
 
 asmlinkage int printk(const char *fmt, ...)
@@ -655,6 +661,9 @@ static void call_console_drivers(unsigned long start, unsigned long end)
 
 /**
  * add_preferred_console - add a device to the list of preferred consoles.
+ * @name: device name
+ * @idx: device index
+ * @options: options for this console
  *
  * The last preferred console added will be used for kernel messages
  * and stdin/out/err for init.  Normally this is used by console_setup
@@ -764,7 +773,8 @@ void release_console_sem(void)
 }
 EXPORT_SYMBOL(release_console_sem);
 
-/** console_conditional_schedule - yield the CPU if required
+/**
+ * console_conditional_schedule - yield the CPU if required
  *
  * If the console code is currently allowed to sleep, and
  * if this CPU should yield the CPU to another task, do
@@ -976,6 +986,8 @@ EXPORT_SYMBOL(unregister_console);
 
 /**
  * tty_write_message - write a message to a certain tty, not just the console.
+ * @tty: the destination tty_struct
+ * @msg: the message to write
  *
  * This is used for messages that need to be redirected to a specific tty.
  * We don't put it into the syslog queue right now maybe in the future if
index b88d4186cd7ac2733c3adf231d5b4daa4e14b0a9..17ee7e5a34516f7485250b7a7ef94546907f9b39 100644 (file)
@@ -470,7 +470,7 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
 
        if (request == PTRACE_ATTACH) {
                ret = ptrace_attach(child);
-               goto out;
+               goto out_put_task_struct;
        }
 
        ret = ptrace_check_attach(child, request == PTRACE_KILL);
index 9b58f1eff3ca8990d29f4e4f9b9ad52a621babd4..88c28d476550d004fe3232ab284d54473f5885a9 100644 (file)
@@ -80,6 +80,7 @@ struct rcu_torture {
        struct rcu_head rtort_rcu;
        int rtort_pipe_count;
        struct list_head rtort_free;
+       int rtort_mbtest;
 };
 
 static int fullstop = 0;       /* stop generating callbacks at test end. */
@@ -96,6 +97,8 @@ static atomic_t rcu_torture_wcount[RCU_TORTURE_PIPE_LEN + 1];
 atomic_t n_rcu_torture_alloc;
 atomic_t n_rcu_torture_alloc_fail;
 atomic_t n_rcu_torture_free;
+atomic_t n_rcu_torture_mberror;
+atomic_t n_rcu_torture_error;
 
 /*
  * Allocate an element from the rcu_tortures pool.
@@ -145,9 +148,10 @@ rcu_torture_cb(struct rcu_head *p)
        if (i > RCU_TORTURE_PIPE_LEN)
                i = RCU_TORTURE_PIPE_LEN;
        atomic_inc(&rcu_torture_wcount[i]);
-       if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN)
+       if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) {
+               rp->rtort_mbtest = 0;
                rcu_torture_free(rp);
-       else
+       else
                call_rcu(p, rcu_torture_cb);
 }
 
@@ -195,6 +199,8 @@ rcu_torture_writer(void *arg)
        static DEFINE_RCU_RANDOM(rand);
 
        VERBOSE_PRINTK_STRING("rcu_torture_writer task started");
+       set_user_nice(current, 19);
+
        do {
                schedule_timeout_uninterruptible(1);
                if (rcu_batches_completed() == oldbatch)
@@ -204,6 +210,7 @@ rcu_torture_writer(void *arg)
                rp->rtort_pipe_count = 0;
                udelay(rcu_random(&rand) & 0x3ff);
                old_rp = rcu_torture_current;
+               rp->rtort_mbtest = 1;
                rcu_assign_pointer(rcu_torture_current, rp);
                smp_wmb();
                if (old_rp != NULL) {
@@ -238,6 +245,8 @@ rcu_torture_reader(void *arg)
        int pipe_count;
 
        VERBOSE_PRINTK_STRING("rcu_torture_reader task started");
+       set_user_nice(current, 19);
+
        do {
                rcu_read_lock();
                completed = rcu_batches_completed();
@@ -248,6 +257,8 @@ rcu_torture_reader(void *arg)
                        schedule_timeout_interruptible(HZ);
                        continue;
                }
+               if (p->rtort_mbtest == 0)
+                       atomic_inc(&n_rcu_torture_mberror);
                udelay(rcu_random(&rand) & 0x7f);
                preempt_disable();
                pipe_count = p->rtort_pipe_count;
@@ -296,16 +307,22 @@ rcu_torture_printk(char *page)
        }
        cnt += sprintf(&page[cnt], "rcutorture: ");
        cnt += sprintf(&page[cnt],
-                      "rtc: %p ver: %ld tfle: %d rta: %d rtaf: %d rtf: %d",
+                      "rtc: %p ver: %ld tfle: %d rta: %d rtaf: %d rtf: %d "
+                      "rtmbe: %d",
                       rcu_torture_current,
                       rcu_torture_current_version,
                       list_empty(&rcu_torture_freelist),
                       atomic_read(&n_rcu_torture_alloc),
                       atomic_read(&n_rcu_torture_alloc_fail),
-                      atomic_read(&n_rcu_torture_free));
+                      atomic_read(&n_rcu_torture_free),
+                      atomic_read(&n_rcu_torture_mberror));
+       if (atomic_read(&n_rcu_torture_mberror) != 0)
+               cnt += sprintf(&page[cnt], " !!!");
        cnt += sprintf(&page[cnt], "\nrcutorture: ");
-       if (i > 1)
+       if (i > 1) {
                cnt += sprintf(&page[cnt], "!!! ");
+               atomic_inc(&n_rcu_torture_error);
+       }
        cnt += sprintf(&page[cnt], "Reader Pipe: ");
        for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++)
                cnt += sprintf(&page[cnt], " %ld", pipesummary[i]);
@@ -396,7 +413,9 @@ rcu_torture_cleanup(void)
        for (i = 0; i < RCU_TORTURE_PIPE_LEN; i++)
                synchronize_rcu();
        rcu_torture_stats_print();  /* -After- the stats thread is stopped! */
-       PRINTK_STRING("--- End of test");
+       printk(KERN_ALERT TORTURE_FLAG
+              "--- End of test: %s\n",
+              atomic_read(&n_rcu_torture_error) == 0 ? "SUCCESS" : "FAILURE");
 }
 
 static int
@@ -421,6 +440,7 @@ rcu_torture_init(void)
 
        INIT_LIST_HEAD(&rcu_torture_freelist);
        for (i = 0; i < sizeof(rcu_tortures) / sizeof(rcu_tortures[0]); i++) {
+               rcu_tortures[i].rtort_mbtest = 0;
                list_add_tail(&rcu_tortures[i].rtort_free,
                              &rcu_torture_freelist);
        }
@@ -432,6 +452,8 @@ rcu_torture_init(void)
        atomic_set(&n_rcu_torture_alloc, 0);
        atomic_set(&n_rcu_torture_alloc_fail, 0);
        atomic_set(&n_rcu_torture_free, 0);
+       atomic_set(&n_rcu_torture_mberror, 0);
+       atomic_set(&n_rcu_torture_error, 0);
        for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++)
                atomic_set(&rcu_torture_wcount[i], 0);
        for_each_cpu(cpu) {
index b6506671b2be08c8da0a5582800d3ec0fffc7280..6f46c94cc29ea4f46d79eb50b36da77208024df3 100644 (file)
@@ -1437,7 +1437,7 @@ void fastcall sched_fork(task_t *p, int clone_flags)
 #endif
 #ifdef CONFIG_PREEMPT
        /* Want to start with kernel preemption disabled. */
-       p->thread_info->preempt_count = 1;
+       task_thread_info(p)->preempt_count = 1;
 #endif
        /*
         * Share the timeslice between parent and child, thus the
@@ -4327,10 +4327,10 @@ static void show_task(task_t *p)
 #endif
 #ifdef CONFIG_DEBUG_STACK_USAGE
        {
-               unsigned long *n = (unsigned long *) (p->thread_info+1);
+               unsigned long *n = end_of_stack(p);
                while (!*n)
                        n++;
-               free = (unsigned long) n - (unsigned long)(p->thread_info+1);
+               free = (unsigned long)n - (unsigned long)end_of_stack(p);
        }
 #endif
        printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
@@ -4410,9 +4410,9 @@ void __devinit init_idle(task_t *idle, int cpu)
 
        /* Set the preempt count _outside_ the spinlocks! */
 #if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL)
-       idle->thread_info->preempt_count = (idle->lock_depth >= 0);
+       task_thread_info(idle)->preempt_count = (idle->lock_depth >= 0);
 #else
-       idle->thread_info->preempt_count = 0;
+       task_thread_info(idle)->preempt_count = 0;
 #endif
 }
 
index 80789a59b4dbc6553a21b6f8075f803ad76fc5be..d7611f189ef7ac33ef7610e7a92a3584f5c7028b 100644 (file)
@@ -513,16 +513,7 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
 {
        int sig = 0;
 
-       /* SIGKILL must have priority, otherwise it is quite easy
-        * to create an unkillable process, sending sig < SIGKILL
-        * to self */
-       if (unlikely(sigismember(&pending->signal, SIGKILL))) {
-               if (!sigismember(mask, SIGKILL))
-                       sig = SIGKILL;
-       }
-
-       if (likely(!sig))
-               sig = next_signal(pending, mask);
+       sig = next_signal(pending, mask);
        if (sig) {
                if (current->notifier) {
                        if (sigismember(current->notifier_mask, sig)) {
index 84a9d18aa8da0ecb9309c6b58a2b8b694a1493e2..b3d4dc858e3540a521ee69c32a9eab1798a67a44 100644 (file)
@@ -119,13 +119,12 @@ static int stop_machine(void)
                return ret;
        }
 
-       /* Don't schedule us away at this point, please. */
-       local_irq_disable();
-
        /* Now they are all started, make them hold the CPUs, ready. */
+       preempt_disable();
        stopmachine_set_state(STOPMACHINE_PREPARE);
 
        /* Make them disable irqs. */
+       local_irq_disable();
        stopmachine_set_state(STOPMACHINE_DISABLE_IRQ);
 
        return 0;
@@ -135,6 +134,7 @@ static void restart_machine(void)
 {
        stopmachine_set_state(STOPMACHINE_EXIT);
        local_irq_enable();
+       preempt_enable_no_resched();
 }
 
 struct stop_machine_data
index 5d6e4c2000dc674bd0456f6fa92dd2c5f1b0acfe..33a28bfde158a5c6e403fa11992cd2e897fe6868 100644 (file)
@@ -134,7 +134,7 @@ static int sync_page(void *word)
        struct address_space *mapping;
        struct page *page;
 
-       page = container_of((page_flags_t *)word, struct page, flags);
+       page = container_of((unsigned long *)word, struct page, flags);
 
        /*
         * page_mapping() is being called without PG_locked held.
index 0f60baf6f69b36c0b0a5ddd65021be62c7150690..2998cfc12f5bc2c2a60d5ad6a724e953e7765e1b 100644 (file)
@@ -549,10 +549,10 @@ int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
        return 0;
 }
 
-static void zap_pte_range(struct mmu_gather *tlb,
+static unsigned long zap_pte_range(struct mmu_gather *tlb,
                                struct vm_area_struct *vma, pmd_t *pmd,
                                unsigned long addr, unsigned long end,
-                               struct zap_details *details)
+                               long *zap_work, struct zap_details *details)
 {
        struct mm_struct *mm = tlb->mm;
        pte_t *pte;
@@ -563,10 +563,15 @@ static void zap_pte_range(struct mmu_gather *tlb,
        pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
        do {
                pte_t ptent = *pte;
-               if (pte_none(ptent))
+               if (pte_none(ptent)) {
+                       (*zap_work)--;
                        continue;
+               }
                if (pte_present(ptent)) {
                        struct page *page = NULL;
+
+                       (*zap_work) -= PAGE_SIZE;
+
                        if (!(vma->vm_flags & VM_RESERVED)) {
                                unsigned long pfn = pte_pfn(ptent);
                                if (unlikely(!pfn_valid(pfn)))
@@ -624,16 +629,18 @@ static void zap_pte_range(struct mmu_gather *tlb,
                if (!pte_file(ptent))
                        free_swap_and_cache(pte_to_swp_entry(ptent));
                pte_clear_full(mm, addr, pte, tlb->fullmm);
-       } while (pte++, addr += PAGE_SIZE, addr != end);
+       } while (pte++, addr += PAGE_SIZE, (addr != end && *zap_work > 0));
 
        add_mm_rss(mm, file_rss, anon_rss);
        pte_unmap_unlock(pte - 1, ptl);
+
+       return addr;
 }
 
-static inline void zap_pmd_range(struct mmu_gather *tlb,
+static inline unsigned long zap_pmd_range(struct mmu_gather *tlb,
                                struct vm_area_struct *vma, pud_t *pud,
                                unsigned long addr, unsigned long end,
-                               struct zap_details *details)
+                               long *zap_work, struct zap_details *details)
 {
        pmd_t *pmd;
        unsigned long next;
@@ -641,16 +648,21 @@ static inline void zap_pmd_range(struct mmu_gather *tlb,
        pmd = pmd_offset(pud, addr);
        do {
                next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(pmd))
+               if (pmd_none_or_clear_bad(pmd)) {
+                       (*zap_work)--;
                        continue;
-               zap_pte_range(tlb, vma, pmd, addr, next, details);
-       } while (pmd++, addr = next, addr != end);
+               }
+               next = zap_pte_range(tlb, vma, pmd, addr, next,
+                                               zap_work, details);
+       } while (pmd++, addr = next, (addr != end && *zap_work > 0));
+
+       return addr;
 }
 
-static inline void zap_pud_range(struct mmu_gather *tlb,
+static inline unsigned long zap_pud_range(struct mmu_gather *tlb,
                                struct vm_area_struct *vma, pgd_t *pgd,
                                unsigned long addr, unsigned long end,
-                               struct zap_details *details)
+                               long *zap_work, struct zap_details *details)
 {
        pud_t *pud;
        unsigned long next;
@@ -658,15 +670,21 @@ static inline void zap_pud_range(struct mmu_gather *tlb,
        pud = pud_offset(pgd, addr);
        do {
                next = pud_addr_end(addr, end);
-               if (pud_none_or_clear_bad(pud))
+               if (pud_none_or_clear_bad(pud)) {
+                       (*zap_work)--;
                        continue;
-               zap_pmd_range(tlb, vma, pud, addr, next, details);
-       } while (pud++, addr = next, addr != end);
+               }
+               next = zap_pmd_range(tlb, vma, pud, addr, next,
+                                               zap_work, details);
+       } while (pud++, addr = next, (addr != end && *zap_work > 0));
+
+       return addr;
 }
 
-static void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+static unsigned long unmap_page_range(struct mmu_gather *tlb,
+                               struct vm_area_struct *vma,
                                unsigned long addr, unsigned long end,
-                               struct zap_details *details)
+                               long *zap_work, struct zap_details *details)
 {
        pgd_t *pgd;
        unsigned long next;
@@ -679,11 +697,16 @@ static void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
        pgd = pgd_offset(vma->vm_mm, addr);
        do {
                next = pgd_addr_end(addr, end);
-               if (pgd_none_or_clear_bad(pgd))
+               if (pgd_none_or_clear_bad(pgd)) {
+                       (*zap_work)--;
                        continue;
-               zap_pud_range(tlb, vma, pgd, addr, next, details);
-       } while (pgd++, addr = next, addr != end);
+               }
+               next = zap_pud_range(tlb, vma, pgd, addr, next,
+                                               zap_work, details);
+       } while (pgd++, addr = next, (addr != end && *zap_work > 0));
        tlb_end_vma(tlb, vma);
+
+       return addr;
 }
 
 #ifdef CONFIG_PREEMPT
@@ -724,7 +747,7 @@ unsigned long unmap_vmas(struct mmu_gather **tlbp,
                unsigned long end_addr, unsigned long *nr_accounted,
                struct zap_details *details)
 {
-       unsigned long zap_bytes = ZAP_BLOCK_SIZE;
+       long zap_work = ZAP_BLOCK_SIZE;
        unsigned long tlb_start = 0;    /* For tlb_finish_mmu */
        int tlb_start_valid = 0;
        unsigned long start = start_addr;
@@ -745,27 +768,25 @@ unsigned long unmap_vmas(struct mmu_gather **tlbp,
                        *nr_accounted += (end - start) >> PAGE_SHIFT;
 
                while (start != end) {
-                       unsigned long block;
-
                        if (!tlb_start_valid) {
                                tlb_start = start;
                                tlb_start_valid = 1;
                        }
 
-                       if (is_vm_hugetlb_page(vma)) {
-                               block = end - start;
+                       if (unlikely(is_vm_hugetlb_page(vma))) {
                                unmap_hugepage_range(vma, start, end);
-                       } else {
-                               block = min(zap_bytes, end - start);
-                               unmap_page_range(*tlbp, vma, start,
-                                               start + block, details);
+                               zap_work -= (end - start) /
+                                               (HPAGE_SIZE / PAGE_SIZE);
+                               start = end;
+                       } else
+                               start = unmap_page_range(*tlbp, vma,
+                                               start, end, &zap_work, details);
+
+                       if (zap_work > 0) {
+                               BUG_ON(start != end);
+                               break;
                        }
 
-                       start += block;
-                       zap_bytes -= block;
-                       if ((long)zap_bytes > 0)
-                               continue;
-
                        tlb_finish_mmu(*tlbp, tlb_start, start);
 
                        if (need_resched() ||
@@ -779,7 +800,7 @@ unsigned long unmap_vmas(struct mmu_gather **tlbp,
 
                        *tlbp = tlb_gather_mmu(vma->vm_mm, fullmm);
                        tlb_start_valid = 0;
-                       zap_bytes = ZAP_BLOCK_SIZE;
+                       zap_work = ZAP_BLOCK_SIZE;
                }
        }
 out:
index 6c997b159600b89b6d6cb4b5a4059e8adf3b0e92..4f8def03428ce967d91f7a1fa738733d8a386758 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1501,7 +1501,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un
  * PA-RISC uses this for its stack; IA64 for its Register Backing Store.
  * vma is the last one with address > vma->vm_end.  Have to extend vma.
  */
-#ifdef CONFIG_STACK_GROWSUP
+#ifndef CONFIG_IA64
 static inline
 #endif
 int expand_upwards(struct vm_area_struct *vma, unsigned long address)
index 74138c9a22b982a9a74fb4076e41826a0d56c3b5..0166ea15c9ee8d61f08ddc6e100de841e59205c7 100644 (file)
@@ -750,6 +750,7 @@ int clear_page_dirty_for_io(struct page *page)
        }
        return TestClearPageDirty(page);
 }
+EXPORT_SYMBOL(clear_page_dirty_for_io);
 
 int test_clear_page_writeback(struct page *page)
 {
index 987225bdd661c33cffa0674e3fae7245a6b85a1f..bd4de592dc238fd3939c16b276cc7e10f7d1e21d 100644 (file)
@@ -60,8 +60,11 @@ long nr_swap_pages;
  *     NORMAL allocation will leave 784M/256 of ram reserved in the ZONE_DMA
  *     HIGHMEM allocation will leave 224M/32 of ram reserved in ZONE_NORMAL
  *     HIGHMEM allocation will (224M+784M)/256 of ram reserved in ZONE_DMA
+ *
+ * TBD: should special case ZONE_DMA32 machines here - in those we normally
+ * don't need any ZONE_NORMAL reservation
  */
-int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = { 256, 32 };
+int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = { 256, 256, 32 };
 
 EXPORT_SYMBOL(totalram_pages);
 
@@ -72,7 +75,7 @@ EXPORT_SYMBOL(totalram_pages);
 struct zone *zone_table[1 << ZONETABLE_SHIFT] __read_mostly;
 EXPORT_SYMBOL(zone_table);
 
-static char *zone_names[MAX_NR_ZONES] = { "DMA", "Normal", "HighMem" };
+static char *zone_names[MAX_NR_ZONES] = { "DMA", "DMA32", "Normal", "HighMem" };
 int min_free_kbytes = 1024;
 
 unsigned long __initdata nr_kernel_pages;
@@ -124,7 +127,7 @@ static void bad_page(const char *function, struct page *page)
        printk(KERN_EMERG "Bad page state at %s (in process '%s', page %p)\n",
                function, current->comm, page);
        printk(KERN_EMERG "flags:0x%0*lx mapping:%p mapcount:%d count:%d\n",
-               (int)(2*sizeof(page_flags_t)), (unsigned long)page->flags,
+               (int)(2*sizeof(unsigned long)), (unsigned long)page->flags,
                page->mapping, page_mapcount(page), page_count(page));
        printk(KERN_EMERG "Backtrace:\n");
        dump_stack();
@@ -732,9 +735,7 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
                }
                local_irq_restore(flags);
                put_cpu();
-       }
-
-       if (page == NULL) {
+       } else {
                spin_lock_irqsave(&zone->lock, flags);
                page = __rmqueue(zone, order);
                spin_unlock_irqrestore(&zone->lock, flags);
@@ -754,20 +755,25 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
        return page;
 }
 
+#define ALLOC_NO_WATERMARKS    0x01 /* don't check watermarks at all */
+#define ALLOC_HARDER           0x02 /* try to alloc harder */
+#define ALLOC_HIGH             0x04 /* __GFP_HIGH set */
+#define ALLOC_CPUSET           0x08 /* check for correct cpuset */
+
 /*
  * Return 1 if free pages are above 'mark'. This takes into account the order
  * of the allocation.
  */
 int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
-                     int classzone_idx, int can_try_harder, gfp_t gfp_high)
+                     int classzone_idx, int alloc_flags)
 {
        /* free_pages my go negative - that's OK */
        long min = mark, free_pages = z->free_pages - (1 << order) + 1;
        int o;
 
-       if (gfp_high)
+       if (alloc_flags & ALLOC_HIGH)
                min -= min / 2;
-       if (can_try_harder)
+       if (alloc_flags & ALLOC_HARDER)
                min -= min / 4;
 
        if (free_pages <= min + z->lowmem_reserve[classzone_idx])
@@ -785,14 +791,40 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
        return 1;
 }
 
-static inline int
-should_reclaim_zone(struct zone *z, gfp_t gfp_mask)
+/*
+ * get_page_from_freeliest goes through the zonelist trying to allocate
+ * a page.
+ */
+static struct page *
+get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
+               struct zonelist *zonelist, int alloc_flags)
 {
-       if (!z->reclaim_pages)
-               return 0;
-       if (gfp_mask & __GFP_NORECLAIM)
-               return 0;
-       return 1;
+       struct zone **z = zonelist->zones;
+       struct page *page = NULL;
+       int classzone_idx = zone_idx(*z);
+
+       /*
+        * Go through the zonelist once, looking for a zone with enough free.
+        * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
+        */
+       do {
+               if ((alloc_flags & ALLOC_CPUSET) &&
+                               !cpuset_zone_allowed(*z, gfp_mask))
+                       continue;
+
+               if (!(alloc_flags & ALLOC_NO_WATERMARKS)) {
+                       if (!zone_watermark_ok(*z, order, (*z)->pages_low,
+                                   classzone_idx, alloc_flags))
+                               continue;
+               }
+
+               page = buffered_rmqueue(*z, order, gfp_mask);
+               if (page) {
+                       zone_statistics(zonelist, *z);
+                       break;
+               }
+       } while (*(++z) != NULL);
+       return page;
 }
 
 /*
@@ -803,105 +835,76 @@ __alloc_pages(gfp_t gfp_mask, unsigned int order,
                struct zonelist *zonelist)
 {
        const gfp_t wait = gfp_mask & __GFP_WAIT;
-       struct zone **zones, *z;
+       struct zone **z;
        struct page *page;
        struct reclaim_state reclaim_state;
        struct task_struct *p = current;
-       int i;
-       int classzone_idx;
        int do_retry;
-       int can_try_harder;
+       int alloc_flags;
        int did_some_progress;
 
        might_sleep_if(wait);
 
-       /*
-        * The caller may dip into page reserves a bit more if the caller
-        * cannot run direct reclaim, or is the caller has realtime scheduling
-        * policy
-        */
-       can_try_harder = (unlikely(rt_task(p)) && !in_interrupt()) || !wait;
-
-       zones = zonelist->zones;  /* the list of zones suitable for gfp_mask */
+restart:
+       z = zonelist->zones;  /* the list of zones suitable for gfp_mask */
 
-       if (unlikely(zones[0] == NULL)) {
+       if (unlikely(*z == NULL)) {
                /* Should this ever happen?? */
                return NULL;
        }
 
-       classzone_idx = zone_idx(zones[0]);
+       page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
+                               zonelist, ALLOC_CPUSET);
+       if (page)
+               goto got_pg;
+
+       do {
+               wakeup_kswapd(*z, order);
+       } while (*(++z));
 
-restart:
        /*
-        * Go through the zonelist once, looking for a zone with enough free.
-        * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
+        * OK, we're below the kswapd watermark and have kicked background
+        * reclaim. Now things get more complex, so set up alloc_flags according
+        * to how we want to proceed.
+        *
+        * The caller may dip into page reserves a bit more if the caller
+        * cannot run direct reclaim, or if the caller has realtime scheduling
+        * policy.
         */
-       for (i = 0; (z = zones[i]) != NULL; i++) {
-               int do_reclaim = should_reclaim_zone(z, gfp_mask);
-
-               if (!cpuset_zone_allowed(z, __GFP_HARDWALL))
-                       continue;
-
-               /*
-                * If the zone is to attempt early page reclaim then this loop
-                * will try to reclaim pages and check the watermark a second
-                * time before giving up and falling back to the next zone.
-                */
-zone_reclaim_retry:
-               if (!zone_watermark_ok(z, order, z->pages_low,
-                                      classzone_idx, 0, 0)) {
-                       if (!do_reclaim)
-                               continue;
-                       else {
-                               zone_reclaim(z, gfp_mask, order);
-                               /* Only try reclaim once */
-                               do_reclaim = 0;
-                               goto zone_reclaim_retry;
-                       }
-               }
-
-               page = buffered_rmqueue(z, order, gfp_mask);
-               if (page)
-                       goto got_pg;
-       }
-
-       for (i = 0; (z = zones[i]) != NULL; i++)
-               wakeup_kswapd(z, order);
+       alloc_flags = 0;
+       if ((unlikely(rt_task(p)) && !in_interrupt()) || !wait)
+               alloc_flags |= ALLOC_HARDER;
+       if (gfp_mask & __GFP_HIGH)
+               alloc_flags |= ALLOC_HIGH;
+       if (wait)
+               alloc_flags |= ALLOC_CPUSET;
 
        /*
         * Go through the zonelist again. Let __GFP_HIGH and allocations
-        * coming from realtime tasks to go deeper into reserves
+        * coming from realtime tasks go deeper into reserves.
         *
         * This is the last chance, in general, before the goto nopage.
         * Ignore cpuset if GFP_ATOMIC (!wait) rather than fail alloc.
         * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
         */
-       for (i = 0; (z = zones[i]) != NULL; i++) {
-               if (!zone_watermark_ok(z, order, z->pages_min,
-                                      classzone_idx, can_try_harder,
-                                      gfp_mask & __GFP_HIGH))
-                       continue;
-
-               if (wait && !cpuset_zone_allowed(z, gfp_mask))
-                       continue;
-
-               page = buffered_rmqueue(z, order, gfp_mask);
-               if (page)
-                       goto got_pg;
-       }
+       page = get_page_from_freelist(gfp_mask, order, zonelist, alloc_flags);
+       if (page)
+               goto got_pg;
 
        /* This allocation should allow future memory freeing. */
 
        if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
                        && !in_interrupt()) {
                if (!(gfp_mask & __GFP_NOMEMALLOC)) {
+nofail_alloc:
                        /* go through the zonelist yet again, ignoring mins */
-                       for (i = 0; (z = zones[i]) != NULL; i++) {
-                               if (!cpuset_zone_allowed(z, gfp_mask))
-                                       continue;
-                               page = buffered_rmqueue(z, order, gfp_mask);
-                               if (page)
-                                       goto got_pg;
+                       page = get_page_from_freelist(gfp_mask, order,
+                               zonelist, ALLOC_NO_WATERMARKS|ALLOC_CPUSET);
+                       if (page)
+                               goto got_pg;
+                       if (gfp_mask & __GFP_NOFAIL) {
+                               blk_congestion_wait(WRITE, HZ/50);
+                               goto nofail_alloc;
                        }
                }
                goto nopage;
@@ -919,7 +922,7 @@ rebalance:
        reclaim_state.reclaimed_slab = 0;
        p->reclaim_state = &reclaim_state;
 
-       did_some_progress = try_to_free_pages(zones, gfp_mask);
+       did_some_progress = try_to_free_pages(zonelist->zones, gfp_mask);
 
        p->reclaim_state = NULL;
        p->flags &= ~PF_MEMALLOC;
@@ -927,19 +930,10 @@ rebalance:
        cond_resched();
 
        if (likely(did_some_progress)) {
-               for (i = 0; (z = zones[i]) != NULL; i++) {
-                       if (!zone_watermark_ok(z, order, z->pages_min,
-                                              classzone_idx, can_try_harder,
-                                              gfp_mask & __GFP_HIGH))
-                               continue;
-
-                       if (!cpuset_zone_allowed(z, gfp_mask))
-                               continue;
-
-                       page = buffered_rmqueue(z, order, gfp_mask);
-                       if (page)
-                               goto got_pg;
-               }
+               page = get_page_from_freelist(gfp_mask, order,
+                                               zonelist, alloc_flags);
+               if (page)
+                       goto got_pg;
        } else if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY)) {
                /*
                 * Go through the zonelist yet one more time, keep
@@ -947,18 +941,10 @@ rebalance:
                 * a parallel oom killing, we must fail if we're still
                 * under heavy pressure.
                 */
-               for (i = 0; (z = zones[i]) != NULL; i++) {
-                       if (!zone_watermark_ok(z, order, z->pages_high,
-                                              classzone_idx, 0, 0))
-                               continue;
-
-                       if (!cpuset_zone_allowed(z, __GFP_HARDWALL))
-                               continue;
-
-                       page = buffered_rmqueue(z, order, gfp_mask);
-                       if (page)
-                               goto got_pg;
-               }
+               page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
+                                               zonelist, ALLOC_CPUSET);
+               if (page)
+                       goto got_pg;
 
                out_of_memory(gfp_mask, order);
                goto restart;
@@ -991,9 +977,7 @@ nopage:
                dump_stack();
                show_mem();
        }
-       return NULL;
 got_pg:
-       zone_statistics(zonelist, z);
        return page;
 }
 
@@ -1441,6 +1425,10 @@ static int __init build_zonelists_node(pg_data_t *pgdat, struct zonelist *zoneli
                zone = pgdat->node_zones + ZONE_NORMAL;
                if (zone->present_pages)
                        zonelist->zones[j++] = zone;
+       case ZONE_DMA32:
+               zone = pgdat->node_zones + ZONE_DMA32;
+               if (zone->present_pages)
+                       zonelist->zones[j++] = zone;
        case ZONE_DMA:
                zone = pgdat->node_zones + ZONE_DMA;
                if (zone->present_pages)
@@ -1455,6 +1443,8 @@ static inline int highest_zone(int zone_bits)
        int res = ZONE_NORMAL;
        if (zone_bits & (__force int)__GFP_HIGHMEM)
                res = ZONE_HIGHMEM;
+       if (zone_bits & (__force int)__GFP_DMA32)
+               res = ZONE_DMA32;
        if (zone_bits & (__force int)__GFP_DMA)
                res = ZONE_DMA;
        return res;
@@ -1866,11 +1856,10 @@ static int __devinit pageset_cpuup_callback(struct notifier_block *nfb,
                        if (process_zones(cpu))
                                ret = NOTIFY_BAD;
                        break;
-#ifdef CONFIG_HOTPLUG_CPU
+               case CPU_UP_CANCELED:
                case CPU_DEAD:
                        free_zone_pagesets(cpu);
                        break;
-#endif
                default:
                        break;
        }
@@ -1975,7 +1964,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat,
                if (zholes_size)
                        realsize -= zholes_size[j];
 
-               if (j == ZONE_DMA || j == ZONE_NORMAL)
+               if (j < ZONE_HIGHMEM)
                        nr_kernel_pages += realsize;
                nr_all_pages += realsize;
 
@@ -2417,13 +2406,18 @@ void setup_per_zone_pages_min(void)
        }
 
        for_each_zone(zone) {
+               unsigned long tmp;
                spin_lock_irqsave(&zone->lru_lock, flags);
+               tmp = (pages_min * zone->present_pages) / lowmem_pages;
                if (is_highmem(zone)) {
                        /*
-                        * Often, highmem doesn't need to reserve any pages.
-                        * But the pages_min/low/high values are also used for
-                        * batching up page reclaim activity so we need a
-                        * decent value here.
+                        * __GFP_HIGH and PF_MEMALLOC allocations usually don't
+                        * need highmem pages, so cap pages_min to a small
+                        * value here.
+                        *
+                        * The (pages_high-pages_low) and (pages_low-pages_min)
+                        * deltas controls asynch page reclaim, and so should
+                        * not be capped for highmem.
                         */
                        int min_pages;
 
@@ -2434,19 +2428,15 @@ void setup_per_zone_pages_min(void)
                                min_pages = 128;
                        zone->pages_min = min_pages;
                } else {
-                       /* if it's a lowmem zone, reserve a number of pages
+                       /*
+                        * If it's a lowmem zone, reserve a number of pages
                         * proportionate to the zone's size.
                         */
-                       zone->pages_min = (pages_min * zone->present_pages) /
-                                          lowmem_pages;
+                       zone->pages_min = tmp;
                }
 
-               /*
-                * When interpreting these watermarks, just keep in mind that:
-                * zone->pages_min == (zone->pages_min * 4) / 4;
-                */
-               zone->pages_low   = (zone->pages_min * 5) / 4;
-               zone->pages_high  = (zone->pages_min * 6) / 4;
+               zone->pages_low   = zone->pages_min + tmp / 4;
+               zone->pages_high  = zone->pages_min + tmp / 2;
                spin_unlock_irqrestore(&zone->lru_lock, flags);
        }
 }
index e291f5e1afbb3acd9d53ad3646527e2f06c3169f..e5ec26e0c4603c9ee19a7ea5878426ea2420cddd 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -434,7 +434,7 @@ struct kmem_cache {
 /* Optimization question: fewer reaps means less 
  * probability for unnessary cpucache drain/refill cycles.
  *
- * OTHO the cpuarrays can contain lots of objects,
+ * OTOH the cpuarrays can contain lots of objects,
  * which could lock up otherwise freeable slabs.
  */
 #define REAPTIMEOUT_CPUC       (2*HZ)
@@ -565,14 +565,29 @@ static void **dbg_userword(kmem_cache_t *cachep, void *objp)
 #define        BREAK_GFP_ORDER_LO      0
 static int slab_break_gfp_order = BREAK_GFP_ORDER_LO;
 
-/* Macros for storing/retrieving the cachep and or slab from the
+/* Functions for storing/retrieving the cachep and or slab from the
  * global 'mem_map'. These are used to find the slab an obj belongs to.
  * With kfree(), these are used to find the cache which an obj belongs to.
  */
-#define        SET_PAGE_CACHE(pg,x)  ((pg)->lru.next = (struct list_head *)(x))
-#define        GET_PAGE_CACHE(pg)    ((kmem_cache_t *)(pg)->lru.next)
-#define        SET_PAGE_SLAB(pg,x)   ((pg)->lru.prev = (struct list_head *)(x))
-#define        GET_PAGE_SLAB(pg)     ((struct slab *)(pg)->lru.prev)
+static inline void page_set_cache(struct page *page, struct kmem_cache *cache)
+{
+       page->lru.next = (struct list_head *)cache;
+}
+
+static inline struct kmem_cache *page_get_cache(struct page *page)
+{
+       return (struct kmem_cache *)page->lru.next;
+}
+
+static inline void page_set_slab(struct page *page, struct slab *slab)
+{
+       page->lru.prev = (struct list_head *)slab;
+}
+
+static inline struct slab *page_get_slab(struct page *page)
+{
+       return (struct slab *)page->lru.prev;
+}
 
 /* These are the default caches for kmalloc. Custom caches can have other sizes. */
 struct cache_sizes malloc_sizes[] = {
@@ -1190,11 +1205,7 @@ static void *kmem_getpages(kmem_cache_t *cachep, gfp_t flags, int nodeid)
        int i;
 
        flags |= cachep->gfpflags;
-       if (likely(nodeid == -1)) {
-               page = alloc_pages(flags, cachep->gfporder);
-       } else {
-               page = alloc_pages_node(nodeid, flags, cachep->gfporder);
-       }
+       page = alloc_pages_node(nodeid, flags, cachep->gfporder);
        if (!page)
                return NULL;
        addr = page_address(page);
@@ -1368,7 +1379,7 @@ static void check_poison_obj(kmem_cache_t *cachep, void *objp)
                /* Print some data about the neighboring objects, if they
                 * exist:
                 */
-               struct slab *slabp = GET_PAGE_SLAB(virt_to_page(objp));
+               struct slab *slabp = page_get_slab(virt_to_page(objp));
                int objnr;
 
                objnr = (objp-slabp->s_mem)/cachep->objsize;
@@ -2138,8 +2149,8 @@ static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp)
        i = 1 << cachep->gfporder;
        page = virt_to_page(objp);
        do {
-               SET_PAGE_CACHE(page, cachep);
-               SET_PAGE_SLAB(page, slabp);
+               page_set_cache(page, cachep);
+               page_set_slab(page, slabp);
                page++;
        } while (--i);
 }
@@ -2269,14 +2280,14 @@ static void *cache_free_debugcheck(kmem_cache_t *cachep, void *objp,
        kfree_debugcheck(objp);
        page = virt_to_page(objp);
 
-       if (GET_PAGE_CACHE(page) != cachep) {
+       if (page_get_cache(page) != cachep) {
                printk(KERN_ERR "mismatch in kmem_cache_free: expected cache %p, got %p\n",
-                               GET_PAGE_CACHE(page),cachep);
+                               page_get_cache(page),cachep);
                printk(KERN_ERR "%p is %s.\n", cachep, cachep->name);
-               printk(KERN_ERR "%p is %s.\n", GET_PAGE_CACHE(page), GET_PAGE_CACHE(page)->name);
+               printk(KERN_ERR "%p is %s.\n", page_get_cache(page), page_get_cache(page)->name);
                WARN_ON(1);
        }
-       slabp = GET_PAGE_SLAB(page);
+       slabp = page_get_slab(page);
 
        if (cachep->flags & SLAB_RED_ZONE) {
                if (*dbg_redzone1(cachep, objp) != RED_ACTIVE || *dbg_redzone2(cachep, objp) != RED_ACTIVE) {
@@ -2628,7 +2639,7 @@ static void free_block(kmem_cache_t *cachep, void **objpp, int nr_objects, int n
                struct slab *slabp;
                unsigned int objnr;
 
-               slabp = GET_PAGE_SLAB(virt_to_page(objp));
+               slabp = page_get_slab(virt_to_page(objp));
                l3 = cachep->nodelists[node];
                list_del(&slabp->list);
                objnr = (objp - slabp->s_mem) / cachep->objsize;
@@ -2744,7 +2755,7 @@ static inline void __cache_free(kmem_cache_t *cachep, void *objp)
 #ifdef CONFIG_NUMA
        {
                struct slab *slabp;
-               slabp = GET_PAGE_SLAB(virt_to_page(objp));
+               slabp = page_get_slab(virt_to_page(objp));
                if (unlikely(slabp->nodeid != numa_node_id())) {
                        struct array_cache *alien = NULL;
                        int nodeid = slabp->nodeid;
@@ -2830,7 +2841,7 @@ int fastcall kmem_ptr_validate(kmem_cache_t *cachep, void *ptr)
        page = virt_to_page(ptr);
        if (unlikely(!PageSlab(page)))
                goto out;
-       if (unlikely(GET_PAGE_CACHE(page) != cachep))
+       if (unlikely(page_get_cache(page) != cachep))
                goto out;
        return 1;
 out:
@@ -3026,7 +3037,7 @@ void kfree(const void *objp)
                return;
        local_irq_save(flags);
        kfree_debugcheck(objp);
-       c = GET_PAGE_CACHE(virt_to_page(objp));
+       c = page_get_cache(virt_to_page(objp));
        __cache_free(c, (void*)objp);
        local_irq_restore(flags);
 }
@@ -3596,7 +3607,7 @@ unsigned int ksize(const void *objp)
        if (unlikely(objp == NULL))
                return 0;
 
-       return obj_reallen(GET_PAGE_CACHE(virt_to_page(objp)));
+       return obj_reallen(page_get_cache(virt_to_page(objp)));
 }
 
 
index 135bf8ca96ee60ac78783caac94fa30f2bfabfc8..28130541270f5ad35b3e18ac878b349c61c6e01f 100644 (file)
@@ -1074,7 +1074,7 @@ loop_again:
                                        continue;
 
                                if (!zone_watermark_ok(zone, order,
-                                               zone->pages_high, 0, 0, 0)) {
+                                               zone->pages_high, 0, 0)) {
                                        end_zone = i;
                                        goto scan;
                                }
@@ -1111,7 +1111,7 @@ scan:
 
                        if (nr_pages == 0) {    /* Not software suspend */
                                if (!zone_watermark_ok(zone, order,
-                                               zone->pages_high, end_zone, 0, 0))
+                                               zone->pages_high, end_zone, 0))
                                        all_zones_ok = 0;
                        }
                        zone->temp_priority = priority;
@@ -1259,7 +1259,7 @@ void wakeup_kswapd(struct zone *zone, int order)
                return;
 
        pgdat = zone->zone_pgdat;
-       if (zone_watermark_ok(zone, order, zone->pages_low, 0, 0, 0))
+       if (zone_watermark_ok(zone, order, zone->pages_low, 0, 0))
                return;
        if (pgdat->kswapd_max_order < order)
                pgdat->kswapd_max_order = order;
index 4aa2f46d2a561f5ccc514a6f19312487cabba807..f5141b9d4f38ff94e7a696438bbaa2e9de9f3214 100644 (file)
@@ -15,8 +15,8 @@ obj-$(CONFIG_NET)             += $(tmp-y)
 # LLC has to be linked before the files in net/802/
 obj-$(CONFIG_LLC)              += llc/
 obj-$(CONFIG_NET)              += ethernet/ 802/ sched/ netlink/
-obj-$(CONFIG_INET)             += ipv4/
 obj-$(CONFIG_NETFILTER)                += netfilter/
+obj-$(CONFIG_INET)             += ipv4/
 obj-$(CONFIG_XFRM)             += xfrm/
 obj-$(CONFIG_UNIX)             += unix/
 ifneq ($(CONFIG_IPV6),)
index d219435d086c8d9a4d619b26b2d131dd74f8686d..1bcfef51ac581562988c54fe9cee885572f819d6 100644 (file)
@@ -350,6 +350,20 @@ fault:
        return -EFAULT;
 }
 
+unsigned int __skb_checksum_complete(struct sk_buff *skb)
+{
+       unsigned int sum;
+
+       sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+       if (likely(!sum)) {
+               if (unlikely(skb->ip_summed == CHECKSUM_HW))
+                       netdev_rx_csum_fault(skb->dev);
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+       }
+       return sum;
+}
+EXPORT_SYMBOL(__skb_checksum_complete);
+
 /**
  *     skb_copy_and_csum_datagram_iovec - Copy and checkum skb to user iovec.
  *     @skb: skbuff
@@ -363,7 +377,7 @@ fault:
  *              -EFAULT - fault during copy. Beware, in this case iovec
  *                        can be modified!
  */
-int skb_copy_and_csum_datagram_iovec(const struct sk_buff *skb,
+int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                     int hlen, struct iovec *iov)
 {
        unsigned int csum;
@@ -376,8 +390,7 @@ int skb_copy_and_csum_datagram_iovec(const struct sk_buff *skb,
                iov++;
 
        if (iov->iov_len < chunk) {
-               if ((unsigned short)csum_fold(skb_checksum(skb, 0, chunk + hlen,
-                                                          skb->csum)))
+               if (__skb_checksum_complete(skb))
                        goto csum_error;
                if (skb_copy_datagram_iovec(skb, hlen, iov, chunk))
                        goto fault;
@@ -388,6 +401,8 @@ int skb_copy_and_csum_datagram_iovec(const struct sk_buff *skb,
                        goto fault;
                if ((unsigned short)csum_fold(csum))
                        goto csum_error;
+               if (unlikely(skb->ip_summed == CHECKSUM_HW))
+                       netdev_rx_csum_fault(skb->dev);
                iov->iov_len -= chunk;
                iov->iov_base += chunk;
        }
index 8d154159527779ca9798328db8a0f65cde3c6c18..0b48e294aafec9e7f8c0f7d43212164652afabf6 100644 (file)
@@ -1108,6 +1108,18 @@ out:
        return ret;
 }
 
+/* Take action when hardware reception checksum errors are detected. */
+#ifdef CONFIG_BUG
+void netdev_rx_csum_fault(struct net_device *dev)
+{
+       if (net_ratelimit()) {
+               printk(KERN_ERR "%s: hw csum failure.\n", dev->name);
+               dump_stack();
+       }
+}
+EXPORT_SYMBOL(netdev_rx_csum_fault);
+#endif
+
 #ifdef CONFIG_HIGHMEM
 /* Actually, we should eliminate this check as soon as we know, that:
  * 1. IOMMU is present and allows to map all the memory.
index 802fe11efad0b2ad53942f28ce591435380e8008..49424a42a2c0385b2924510a11ff89dfdfcfcf2f 100644 (file)
@@ -101,16 +101,20 @@ void netpoll_queue(struct sk_buff *skb)
 static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
                             unsigned short ulen, u32 saddr, u32 daddr)
 {
-       if (uh->check == 0)
+       unsigned int psum;
+
+       if (uh->check == 0 || skb->ip_summed == CHECKSUM_UNNECESSARY)
                return 0;
 
-       if (skb->ip_summed == CHECKSUM_HW)
-               return csum_tcpudp_magic(
-                       saddr, daddr, ulen, IPPROTO_UDP, skb->csum);
+       psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
+
+       if (skb->ip_summed == CHECKSUM_HW &&
+           !(u16)csum_fold(csum_add(psum, skb->csum)))
+               return 0;
 
-       skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
+       skb->csum = psum;
 
-       return csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+       return __skb_checksum_complete(skb);
 }
 
 /*
@@ -489,7 +493,7 @@ int __netpoll_rx(struct sk_buff *skb)
 
        if (ulen != len)
                goto out;
-       if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr) < 0)
+       if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr))
                goto out;
        if (np->local_ip && np->local_ip != ntohl(iph->daddr))
                goto out;
index 3f25cadccddd4f048cdbf36d2fa5e92a8a176116..f89e55f814d9b8c1a23737d10db90fd5914502ec 100644 (file)
@@ -1664,17 +1664,15 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                goto out;
        }
 
-       rv = dn_check_state(sk, NULL, 0, &timeo, flags);
-       if (rv)
-               goto out;
-
        if (sk->sk_shutdown & RCV_SHUTDOWN) {
-               if (!(flags & MSG_NOSIGNAL))
-                       send_sig(SIGPIPE, current, 0);
-               rv = -EPIPE;
+               rv = 0;
                goto out;
        }
 
+       rv = dn_check_state(sk, NULL, 0, &timeo, flags);
+       if (rv)
+               goto out;
+
        if (flags & ~(MSG_PEEK|MSG_OOB|MSG_WAITALL|MSG_DONTWAIT|MSG_NOSIGNAL)) {
                rv = -EOPNOTSUPP;
                goto out;
@@ -1928,6 +1926,8 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        if (sk->sk_shutdown & SEND_SHUTDOWN) {
                err = -EPIPE;
+               if (!(flags & MSG_NOSIGNAL))
+                       send_sig(SIGPIPE, current, 0);
                goto out_err;
        }
 
index 175e093ec5645209ab809dd52ccce0667a020e82..e3eceecd0496eeb752964ee276bdc2e0c79e4de3 100644 (file)
@@ -934,11 +934,11 @@ int icmp_rcv(struct sk_buff *skb)
        case CHECKSUM_HW:
                if (!(u16)csum_fold(skb->csum))
                        break;
-               LIMIT_NETDEBUG(KERN_DEBUG "icmp v4 hw csum failure\n");
+               /* fall through */
        case CHECKSUM_NONE:
-               if ((u16)csum_fold(skb_checksum(skb, 0, skb->len, 0)))
+               skb->csum = 0;
+               if (__skb_checksum_complete(skb))
                        goto error;
-       default:;
        }
 
        if (!pskb_pull(skb, sizeof(struct icmphdr)))
index c6247fc84060a2d509edd0477efe2383408031f4..c04607b49212ec538499eee7340374427b25379b 100644 (file)
@@ -872,11 +872,18 @@ int igmp_rcv(struct sk_buff *skb)
                return 0;
        }
 
-       if (!pskb_may_pull(skb, sizeof(struct igmphdr)) || 
-           (u16)csum_fold(skb_checksum(skb, 0, len, 0))) {
-               in_dev_put(in_dev);
-               kfree_skb(skb);
-               return 0;
+       if (!pskb_may_pull(skb, sizeof(struct igmphdr)))
+               goto drop;
+
+       switch (skb->ip_summed) {
+       case CHECKSUM_HW:
+               if (!(u16)csum_fold(skb->csum))
+                       break;
+               /* fall through */
+       case CHECKSUM_NONE:
+               skb->csum = 0;
+               if (__skb_checksum_complete(skb))
+                       goto drop;
        }
 
        ih = skb->h.igmph;
@@ -906,6 +913,8 @@ int igmp_rcv(struct sk_buff *skb)
        default:
                NETDEBUG(KERN_DEBUG "New IGMP type=%d, why we do not know about it?\n", ih->type);
        }
+
+drop:
        in_dev_put(in_dev);
        kfree_skb(skb);
        return 0;
index e7d26d9943c2d5aea36b465304b8b98db12a7abd..8ce0ce2ee48e1d75308aaa3711b23989a4a07214 100644 (file)
@@ -71,7 +71,7 @@ struct ipfrag_skb_cb
 
 /* Describe an entry in the "incomplete datagrams" queue. */
 struct ipq {
-       struct ipq      *next;          /* linked list pointers                 */
+       struct hlist_node list;
        struct list_head lru_list;      /* lru list member                      */
        u32             user;
        u32             saddr;
@@ -89,7 +89,6 @@ struct ipq {
        spinlock_t      lock;
        atomic_t        refcnt;
        struct timer_list timer;        /* when will this queue expire?         */
-       struct ipq      **pprev;
        int             iif;
        struct timeval  stamp;
 };
@@ -99,7 +98,7 @@ struct ipq {
 #define IPQ_HASHSZ     64
 
 /* Per-bucket lock is easy to add now. */
-static struct ipq *ipq_hash[IPQ_HASHSZ];
+static struct hlist_head ipq_hash[IPQ_HASHSZ];
 static DEFINE_RWLOCK(ipfrag_lock);
 static u32 ipfrag_hash_rnd;
 static LIST_HEAD(ipq_lru_list);
@@ -107,9 +106,7 @@ int ip_frag_nqueues = 0;
 
 static __inline__ void __ipq_unlink(struct ipq *qp)
 {
-       if(qp->next)
-               qp->next->pprev = qp->pprev;
-       *qp->pprev = qp->next;
+       hlist_del(&qp->list);
        list_del(&qp->lru_list);
        ip_frag_nqueues--;
 }
@@ -139,27 +136,18 @@ static void ipfrag_secret_rebuild(unsigned long dummy)
        get_random_bytes(&ipfrag_hash_rnd, sizeof(u32));
        for (i = 0; i < IPQ_HASHSZ; i++) {
                struct ipq *q;
+               struct hlist_node *p, *n;
 
-               q = ipq_hash[i];
-               while (q) {
-                       struct ipq *next = q->next;
+               hlist_for_each_entry_safe(q, p, n, &ipq_hash[i], list) {
                        unsigned int hval = ipqhashfn(q->id, q->saddr,
                                                      q->daddr, q->protocol);
 
                        if (hval != i) {
-                               /* Unlink. */
-                               if (q->next)
-                                       q->next->pprev = q->pprev;
-                               *q->pprev = q->next;
+                               hlist_del(&q->list);
 
                                /* Relink to new hash chain. */
-                               if ((q->next = ipq_hash[hval]) != NULL)
-                                       q->next->pprev = &q->next;
-                               ipq_hash[hval] = q;
-                               q->pprev = &ipq_hash[hval];
+                               hlist_add_head(&q->list, &ipq_hash[hval]);
                        }
-
-                       q = next;
                }
        }
        write_unlock(&ipfrag_lock);
@@ -310,14 +298,16 @@ out:
 static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
 {
        struct ipq *qp;
-
+#ifdef CONFIG_SMP
+       struct hlist_node *n;
+#endif
        write_lock(&ipfrag_lock);
 #ifdef CONFIG_SMP
        /* With SMP race we have to recheck hash table, because
         * such entry could be created on other cpu, while we
         * promoted read lock to write lock.
         */
-       for(qp = ipq_hash[hash]; qp; qp = qp->next) {
+       hlist_for_each_entry(qp, n, &ipq_hash[hash], list) {
                if(qp->id == qp_in->id          &&
                   qp->saddr == qp_in->saddr    &&
                   qp->daddr == qp_in->daddr    &&
@@ -337,10 +327,7 @@ static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
                atomic_inc(&qp->refcnt);
 
        atomic_inc(&qp->refcnt);
-       if((qp->next = ipq_hash[hash]) != NULL)
-               qp->next->pprev = &qp->next;
-       ipq_hash[hash] = qp;
-       qp->pprev = &ipq_hash[hash];
+       hlist_add_head(&qp->list, &ipq_hash[hash]);
        INIT_LIST_HEAD(&qp->lru_list);
        list_add_tail(&qp->lru_list, &ipq_lru_list);
        ip_frag_nqueues++;
@@ -392,9 +379,10 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
        __u8 protocol = iph->protocol;
        unsigned int hash = ipqhashfn(id, saddr, daddr, protocol);
        struct ipq *qp;
+       struct hlist_node *n;
 
        read_lock(&ipfrag_lock);
-       for(qp = ipq_hash[hash]; qp; qp = qp->next) {
+       hlist_for_each_entry(qp, n, &ipq_hash[hash], list) {
                if(qp->id == id         &&
                   qp->saddr == saddr   &&
                   qp->daddr == daddr   &&
index 896ce3f8f53addd02db7e6beaaa205a7275da262..4e9c74b54b150b3cec895023b2489d104866c710 100644 (file)
@@ -577,15 +577,16 @@ static int ipgre_rcv(struct sk_buff *skb)
                        goto drop_nolock;
 
                if (flags&GRE_CSUM) {
-                       if (skb->ip_summed == CHECKSUM_HW) {
+                       switch (skb->ip_summed) {
+                       case CHECKSUM_HW:
                                csum = (u16)csum_fold(skb->csum);
-                               if (csum)
-                                       skb->ip_summed = CHECKSUM_NONE;
-                       }
-                       if (skb->ip_summed == CHECKSUM_NONE) {
-                               skb->csum = skb_checksum(skb, 0, skb->len, 0);
+                               if (!csum)
+                                       break;
+                               /* fall through */
+                       case CHECKSUM_NONE:
+                               skb->csum = 0;
+                               csum = __skb_checksum_complete(skb);
                                skb->ip_summed = CHECKSUM_HW;
-                               csum = (u16)csum_fold(skb->csum);
                        }
                        offset += 4;
                }
index d77d6b3f5f80163e8b3f97b3a6121257431ca914..59e12b02b22ce82d31ae0c5769bdbce783ca5e24 100644 (file)
@@ -29,9 +29,9 @@ static char *ftp_buffer;
 static DEFINE_SPINLOCK(ip_ftp_lock);
 
 #define MAX_PORTS 8
-static short ports[MAX_PORTS];
+static unsigned short ports[MAX_PORTS];
 static int ports_c;
-module_param_array(ports, short, &ports_c, 0400);
+module_param_array(ports, ushort, &ports_c, 0400);
 
 static int loose;
 module_param(loose, int, 0600);
index 15457415a4f32b45bd5f9883956cf308a86be5fd..2dea1db14406a9a39b622dee4618b4401f4f86e6 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/moduleparam.h>
 
 #define MAX_PORTS 8
-static short ports[MAX_PORTS];
+static unsigned short ports[MAX_PORTS];
 static int ports_c;
 static int max_dcc_channels = 8;
 static unsigned int dcc_timeout = 300;
@@ -52,7 +52,7 @@ EXPORT_SYMBOL_GPL(ip_nat_irc_hook);
 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
 MODULE_DESCRIPTION("IRC (DCC) connection tracking helper");
 MODULE_LICENSE("GPL");
-module_param_array(ports, short, &ports_c, 0400);
+module_param_array(ports, ushort, &ports_c, 0400);
 MODULE_PARM_DESC(ports, "port numbers of IRC servers");
 module_param(max_dcc_channels, int, 0400);
 MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC session");
index d2a4fec228626431ac5e086d46fb2a9afeed9932..de9f4464438d4b9475833b298d85205a04a44a11 100644 (file)
@@ -467,7 +467,7 @@ out:
 }
 #endif
 
-static const int cta_min_ip[CTA_IP_MAX] = {
+static const size_t cta_min_ip[CTA_IP_MAX] = {
        [CTA_IP_V4_SRC-1]       = sizeof(u_int32_t),
        [CTA_IP_V4_DST-1]       = sizeof(u_int32_t),
 };
@@ -497,7 +497,7 @@ ctnetlink_parse_tuple_ip(struct nfattr *attr, struct ip_conntrack_tuple *tuple)
        return 0;
 }
 
-static const int cta_min_proto[CTA_PROTO_MAX] = {
+static const size_t cta_min_proto[CTA_PROTO_MAX] = {
        [CTA_PROTO_NUM-1]       = sizeof(u_int16_t),
        [CTA_PROTO_SRC_PORT-1]  = sizeof(u_int16_t),
        [CTA_PROTO_DST_PORT-1]  = sizeof(u_int16_t),
@@ -576,7 +576,7 @@ ctnetlink_parse_tuple(struct nfattr *cda[], struct ip_conntrack_tuple *tuple,
 }
 
 #ifdef CONFIG_IP_NF_NAT_NEEDED
-static const int cta_min_protonat[CTA_PROTONAT_MAX] = {
+static const size_t cta_min_protonat[CTA_PROTONAT_MAX] = {
        [CTA_PROTONAT_PORT_MIN-1]       = sizeof(u_int16_t),
        [CTA_PROTONAT_PORT_MAX-1]       = sizeof(u_int16_t),
 };
@@ -614,6 +614,11 @@ static int ctnetlink_parse_nat_proto(struct nfattr *attr,
        return 0;
 }
 
+static const size_t cta_min_nat[CTA_NAT_MAX] = {
+       [CTA_NAT_MINIP-1]       = sizeof(u_int32_t),
+       [CTA_NAT_MAXIP-1]       = sizeof(u_int32_t),
+};
+
 static inline int
 ctnetlink_parse_nat(struct nfattr *cda[],
                    const struct ip_conntrack *ct, struct ip_nat_range *range)
@@ -627,6 +632,9 @@ ctnetlink_parse_nat(struct nfattr *cda[],
        
        nfattr_parse_nested(tb, CTA_NAT_MAX, cda[CTA_NAT-1]);
 
+       if (nfattr_bad_size(tb, CTA_NAT_MAX, cta_min_nat))
+               return -EINVAL;
+
        if (tb[CTA_NAT_MINIP-1])
                range->min_ip = *(u_int32_t *)NFA_DATA(tb[CTA_NAT_MINIP-1]);
 
@@ -667,6 +675,14 @@ ctnetlink_parse_help(struct nfattr *attr, char **helper_name)
        return 0;
 }
 
+static const size_t cta_min[CTA_MAX] = {
+       [CTA_STATUS-1]          = sizeof(u_int32_t),
+       [CTA_TIMEOUT-1]         = sizeof(u_int32_t),
+       [CTA_MARK-1]            = sizeof(u_int32_t),
+       [CTA_USE-1]             = sizeof(u_int32_t),
+       [CTA_ID-1]              = sizeof(u_int32_t)
+};
+
 static int
 ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb, 
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
@@ -678,6 +694,9 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
 
        DEBUGP("entered %s\n", __FUNCTION__);
 
+       if (nfattr_bad_size(cda, CTA_MAX, cta_min))
+               return -EINVAL;
+
        if (cda[CTA_TUPLE_ORIG-1])
                err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG);
        else if (cda[CTA_TUPLE_REPLY-1])
@@ -760,6 +779,9 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                return 0;
        }
 
+       if (nfattr_bad_size(cda, CTA_MAX, cta_min))
+               return -EINVAL;
+
        if (cda[CTA_TUPLE_ORIG-1])
                err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG);
        else if (cda[CTA_TUPLE_REPLY-1])
@@ -1047,6 +1069,9 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
 
        DEBUGP("entered %s\n", __FUNCTION__);
 
+       if (nfattr_bad_size(cda, CTA_MAX, cta_min))
+               return -EINVAL;
+
        if (cda[CTA_TUPLE_ORIG-1]) {
                err = ctnetlink_parse_tuple(cda, &otuple, CTA_TUPLE_ORIG);
                if (err < 0)
@@ -1252,6 +1277,11 @@ out:
        return skb->len;
 }
 
+static const size_t cta_min_exp[CTA_EXPECT_MAX] = {
+       [CTA_EXPECT_TIMEOUT-1]          = sizeof(u_int32_t),
+       [CTA_EXPECT_ID-1]               = sizeof(u_int32_t)
+};
+
 static int
 ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, 
                     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
@@ -1263,6 +1293,9 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
 
        DEBUGP("entered %s\n", __FUNCTION__);
 
+       if (nfattr_bad_size(cda, CTA_EXPECT_MAX, cta_min_exp))
+               return -EINVAL;
+
        if (nlh->nlmsg_flags & NLM_F_DUMP) {
                struct nfgenmsg *msg = NLMSG_DATA(nlh);
                u32 rlen;
@@ -1333,6 +1366,9 @@ ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
        struct ip_conntrack_helper *h;
        int err;
 
+       if (nfattr_bad_size(cda, CTA_EXPECT_MAX, cta_min_exp))
+               return -EINVAL;
+
        if (cda[CTA_EXPECT_TUPLE-1]) {
                /* delete a single expect by tuple */
                err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE);
@@ -1462,6 +1498,9 @@ ctnetlink_new_expect(struct sock *ctnl, struct sk_buff *skb,
 
        DEBUGP("entered %s\n", __FUNCTION__);   
 
+       if (nfattr_bad_size(cda, CTA_EXPECT_MAX, cta_min_exp))
+               return -EINVAL;
+
        if (!cda[CTA_EXPECT_TUPLE-1]
            || !cda[CTA_EXPECT_MASK-1]
            || !cda[CTA_EXPECT_MASTER-1])
@@ -1504,29 +1543,22 @@ static struct notifier_block ctnl_notifier_exp = {
 
 static struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = {
        [IPCTNL_MSG_CT_NEW]             = { .call = ctnetlink_new_conntrack,
-                                           .attr_count = CTA_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_MAX, },
        [IPCTNL_MSG_CT_GET]             = { .call = ctnetlink_get_conntrack,
-                                           .attr_count = CTA_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_MAX, },
        [IPCTNL_MSG_CT_DELETE]          = { .call = ctnetlink_del_conntrack,
-                                           .attr_count = CTA_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_MAX, },
        [IPCTNL_MSG_CT_GET_CTRZERO]     = { .call = ctnetlink_get_conntrack,
-                                           .attr_count = CTA_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_MAX, },
 };
 
 static struct nfnl_callback ctnl_exp_cb[IPCTNL_MSG_EXP_MAX] = {
        [IPCTNL_MSG_EXP_GET]            = { .call = ctnetlink_get_expect,
-                                           .attr_count = CTA_EXPECT_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_EXPECT_MAX, },
        [IPCTNL_MSG_EXP_NEW]            = { .call = ctnetlink_new_expect,
-                                           .attr_count = CTA_EXPECT_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_EXPECT_MAX, },
        [IPCTNL_MSG_EXP_DELETE]         = { .call = ctnetlink_del_expect,
-                                           .attr_count = CTA_EXPECT_MAX,
-                                           .cap_required = CAP_NET_ADMIN },
+                                           .attr_count = CTA_EXPECT_MAX, },
 };
 
 static struct nfnetlink_subsystem ctnl_subsys = {
index 5198f3a1e2cd542b200d3d9e85f8243ef84b9a1a..e4d6b268e8c4ec8abaaa68735839249a5668a590 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/in.h>
 #include <linux/icmp.h>
 #include <linux/seq_file.h>
+#include <linux/skbuff.h>
 #include <net/ip.h>
 #include <net/checksum.h>
 #include <linux/netfilter.h>
@@ -230,19 +231,15 @@ icmp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
        case CHECKSUM_HW:
                if (!(u16)csum_fold(skb->csum)) 
                        break;
-               if (LOG_INVALID(IPPROTO_ICMP))
-                       nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
-                                     "ip_ct_icmp: bad HW ICMP checksum ");
-               return -NF_ACCEPT;
+               /* fall through */
        case CHECKSUM_NONE:
-               if ((u16)csum_fold(skb_checksum(skb, 0, skb->len, 0))) {
+               skb->csum = 0;
+               if (__skb_checksum_complete(skb)) {
                        if (LOG_INVALID(IPPROTO_ICMP))
                                nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
                                              "ip_ct_icmp: bad ICMP checksum ");
                        return -NF_ACCEPT;
                }
-       default:
-               break;
        }
 
 checksum_skipped:
index 468c6003b4c78c7715bdffd7cedffefc66bc0989..ee3b7d6c4d2efbb5c76012b0ed1e6a7fda26ef92 100644 (file)
@@ -357,6 +357,10 @@ nfattr_failure:
        return -1;
 }
 
+static const size_t cta_min_tcp[CTA_PROTOINFO_TCP_MAX] = {
+       [CTA_PROTOINFO_TCP_STATE-1]     = sizeof(u_int8_t),
+};
+
 static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
 {
        struct nfattr *attr = cda[CTA_PROTOINFO_TCP-1];
@@ -369,6 +373,9 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
 
         nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr);
 
+       if (nfattr_bad_size(tb, CTA_PROTOINFO_TCP_MAX, cta_min_tcp))
+               return -EINVAL;
+
        if (!tb[CTA_PROTOINFO_TCP_STATE-1])
                return -EINVAL;
 
@@ -814,6 +821,7 @@ static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] =
 {
        [TH_SYN]                        = 1,
        [TH_SYN|TH_ACK]                 = 1,
+       [TH_SYN|TH_PUSH]                = 1,
        [TH_SYN|TH_ACK|TH_PUSH]         = 1,
        [TH_RST]                        = 1,
        [TH_RST|TH_ACK]                 = 1,
index a78736b8525d1d865fb0c2ae9a2e28dd3d7d2cad..d3c5a371f993e390a5f6c521b649050be8d950b9 100644 (file)
@@ -26,9 +26,9 @@ MODULE_DESCRIPTION("tftp connection tracking helper");
 MODULE_LICENSE("GPL");
 
 #define MAX_PORTS 8
-static short ports[MAX_PORTS];
+static unsigned short ports[MAX_PORTS];
 static int ports_c;
-module_param_array(ports, short, &ports_c, 0400);
+module_param_array(ports, ushort, &ports_c, 0400);
 MODULE_PARM_DESC(ports, "port numbers of tftp servers");
 
 #if 0
index 652685623519d74cca40682afbc7ade2785a8eab..01444a02b48b9b40b93b209b746260cbcfedb48b 100644 (file)
@@ -645,6 +645,14 @@ ctl_table ipv4_table[] = {
                .proc_handler   = &proc_tcp_congestion_control,
                .strategy       = &sysctl_tcp_congestion_control,
        },
+       {
+               .ctl_name       = NET_TCP_ABC,
+               .procname       = "tcp_abc",
+               .data           = &sysctl_tcp_abc,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+       },
 
        { .ctl_name = 0 }
 };
index 72b7c22e1ea5aa23306e69b26857d78224e841b0..9ac7a4f46bd84ef912f8bea32ce051a09f2bb611 100644 (file)
@@ -1640,7 +1640,7 @@ int tcp_disconnect(struct sock *sk, int flags)
        } else if (tcp_need_reset(old_state) ||
                   (tp->snd_nxt != tp->write_seq &&
                    (1 << old_state) & (TCPF_CLOSING | TCPF_LAST_ACK))) {
-               /* The last check adjusts for discrepance of Linux wrt. RFC
+               /* The last check adjusts for discrepancy of Linux wrt. RFC
                 * states
                 */
                tcp_send_active_reset(sk, gfp_any());
@@ -1669,6 +1669,7 @@ int tcp_disconnect(struct sock *sk, int flags)
        tp->packets_out = 0;
        tp->snd_ssthresh = 0x7fffffff;
        tp->snd_cwnd_cnt = 0;
+       tp->bytes_acked = 0;
        tcp_set_ca_state(sk, TCP_CA_Open);
        tcp_clear_retrans(tp);
        inet_csk_delack_init(sk);
index ae35e06090476a88bc9b6b6a4ba963d1aff9af9b..1d0cd86621b1fd31030f5aefafdce48bb3514ffa 100644 (file)
@@ -217,17 +217,15 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack,
 
        bictcp_low_utilization(sk, data_acked);
 
-       if (in_flight < tp->snd_cwnd)
+       if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-       if (tp->snd_cwnd <= tp->snd_ssthresh) {
-               /* In "safe" area, increase. */
-               if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                       tp->snd_cwnd++;
-       } else {
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+       else {
                bictcp_update(ca, tp->snd_cwnd);
 
-                /* In dangerous area, increase slowly.
+               /* In dangerous area, increase slowly.
                 * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd
                 */
                if (tp->snd_cwnd_cnt >= ca->cnt) {
index bbf2d6624e894b927a169d92ae2be882c851b91a..c7cc62c8dc12cfe8fc2f99810a9070a6a09e4304 100644 (file)
@@ -186,24 +186,32 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight,
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
-       if (in_flight < tp->snd_cwnd)
+       if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-        if (tp->snd_cwnd <= tp->snd_ssthresh) {
-                /* In "safe" area, increase. */
-               if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                       tp->snd_cwnd++;
-       } else {
-                /* In dangerous area, increase slowly.
-                * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd
-                */
-               if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
-                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                               tp->snd_cwnd++;
-                       tp->snd_cwnd_cnt = 0;
-               } else
-                       tp->snd_cwnd_cnt++;
-       }
+       /* In "safe" area, increase. */
+        if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+
+       /* In dangerous area, increase slowly. */
+       else if (sysctl_tcp_abc) {
+               /* RFC3465: Apppriate Byte Count
+                * increase once for each full cwnd acked
+                */
+               if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) {
+                       tp->bytes_acked -= tp->snd_cwnd*tp->mss_cache;
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+               }
+       } else {
+               /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */
+               if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+                       tp->snd_cwnd_cnt = 0;
+               } else
+                       tp->snd_cwnd_cnt++;
+       }
 }
 EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid);
 
index 6acc04bde08099c598e633a21518ed51e5b75bd2..63cf7e54084791c54d5def202ef124ae70eee770 100644 (file)
@@ -111,18 +111,17 @@ static void hstcp_init(struct sock *sk)
 }
 
 static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt,
-                            u32 in_flight, int good)
+                            u32 in_flight, int data_acked)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        struct hstcp *ca = inet_csk_ca(sk);
 
-       if (in_flight < tp->snd_cwnd)
+       if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-       if (tp->snd_cwnd <= tp->snd_ssthresh) {
-               if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                       tp->snd_cwnd++;
-       } else {
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+       else {
                /* Update AIMD parameters */
                if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
                        while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
index e47b37984e951e087cc2185b97336a5e3dadc21f..3284cfb993e6bd9c70963ba0f389b582f4183ab9 100644 (file)
@@ -207,14 +207,13 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
        struct tcp_sock *tp = tcp_sk(sk);
        struct htcp *ca = inet_csk_ca(sk);
 
-       if (in_flight < tp->snd_cwnd)
+       if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-        if (tp->snd_cwnd <= tp->snd_ssthresh) {
-                /* In "safe" area, increase. */
-               if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                       tp->snd_cwnd++;
-       } else {
+        if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+       else {
+
                measure_rtt(sk);
 
                /* keep track of number of round-trip times since last backoff event */
@@ -224,7 +223,7 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
                        htcp_alpha_update(ca);
                }
 
-                /* In dangerous area, increase slowly.
+               /* In dangerous area, increase slowly.
                 * In theory this is tp->snd_cwnd += alpha / tp->snd_cwnd
                 */
                if ((tp->snd_cwnd_cnt++ * ca->alpha)>>7 >= tp->snd_cwnd) {
index 77add63623df2a1034a21bfdb6fbaddf82385a71..40dbb38775101c02b4c285b887f13d1ff0aecebb 100644 (file)
@@ -100,12 +100,12 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
                ca->minrtt = tp->srtt;
        }
 
+       if (!tcp_is_cwnd_limited(sk, in_flight))
+               return;
+
        if (!ca->hybla_en)
                return tcp_reno_cong_avoid(sk, ack, rtt, in_flight, flag);
 
-       if (in_flight < tp->snd_cwnd)
-               return;
-
        if (ca->rho == 0)
                hybla_recalc_param(sk);
 
index 3e98b57578dc681b2386a2a007689d1b74979b48..bf2e23086bcead8b15e02d2a63f1194a40c72093 100644 (file)
@@ -42,7 +42,7 @@
  *             Andi Kleen      :       Moved open_request checking here
  *                                     and process RSTs for open_requests.
  *             Andi Kleen      :       Better prune_queue, and other fixes.
- *             Andrey Savochkin:       Fix RTT measurements in the presnce of
+ *             Andrey Savochkin:       Fix RTT measurements in the presence of
  *                                     timestamps.
  *             Andrey Savochkin:       Check sequence numbers correctly when
  *                                     removing SACKs due to in sequence incoming
@@ -89,6 +89,7 @@ int sysctl_tcp_frto;
 int sysctl_tcp_nometrics_save;
 
 int sysctl_tcp_moderate_rcvbuf = 1;
+int sysctl_tcp_abc = 1;
 
 #define FLAG_DATA              0x01 /* Incoming frame contained data.          */
 #define FLAG_WIN_UPDATE                0x02 /* Incoming ACK was a window update.       */
@@ -223,7 +224,7 @@ static void tcp_fixup_sndbuf(struct sock *sk)
  *   of receiver window. Check #2.
  *
  * The scheme does not work when sender sends good segments opening
- * window and then starts to feed us spagetti. But it should work
+ * window and then starts to feed us spaghetti. But it should work
  * in common situations. Otherwise, we have to rely on queue collapsing.
  */
 
@@ -233,7 +234,7 @@ static int __tcp_grow_window(const struct sock *sk, struct tcp_sock *tp,
 {
        /* Optimize this! */
        int truesize = tcp_win_from_space(skb->truesize)/2;
-       int window = tcp_full_space(sk)/2;
+       int window = tcp_win_from_space(sysctl_tcp_rmem[2])/2;
 
        while (tp->rcv_ssthresh <= window) {
                if (truesize <= skb->len)
@@ -277,7 +278,7 @@ static void tcp_fixup_rcvbuf(struct sock *sk)
        int rcvmem = tp->advmss + MAX_TCP_HEADER + 16 + sizeof(struct sk_buff);
 
        /* Try to select rcvbuf so that 4 mss-sized segments
-        * will fit to window and correspoding skbs will fit to our rcvbuf.
+        * will fit to window and corresponding skbs will fit to our rcvbuf.
         * (was 3; 4 is minimum to allow fast retransmit to work.)
         */
        while (tcp_win_from_space(rcvmem) < tp->advmss)
@@ -286,7 +287,7 @@ static void tcp_fixup_rcvbuf(struct sock *sk)
                sk->sk_rcvbuf = min(4 * rcvmem, sysctl_tcp_rmem[2]);
 }
 
-/* 4. Try to fixup all. It is made iimediately after connection enters
+/* 4. Try to fixup all. It is made immediately after connection enters
  *    established state.
  */
 static void tcp_init_buffer_space(struct sock *sk)
@@ -326,37 +327,18 @@ static void tcp_init_buffer_space(struct sock *sk)
 static void tcp_clamp_window(struct sock *sk, struct tcp_sock *tp)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
-       struct sk_buff *skb;
-       unsigned int app_win = tp->rcv_nxt - tp->copied_seq;
-       int ofo_win = 0;
 
        icsk->icsk_ack.quick = 0;
 
-       skb_queue_walk(&tp->out_of_order_queue, skb) {
-               ofo_win += skb->len;
-       }
-
-       /* If overcommit is due to out of order segments,
-        * do not clamp window. Try to expand rcvbuf instead.
-        */
-       if (ofo_win) {
-               if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] &&
-                   !(sk->sk_userlocks & SOCK_RCVBUF_LOCK) &&
-                   !tcp_memory_pressure &&
-                   atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0])
-                       sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc),
-                                           sysctl_tcp_rmem[2]);
+       if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] &&
+           !(sk->sk_userlocks & SOCK_RCVBUF_LOCK) &&
+           !tcp_memory_pressure &&
+           atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) {
+               sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc),
+                                   sysctl_tcp_rmem[2]);
        }
-       if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf) {
-               app_win += ofo_win;
-               if (atomic_read(&sk->sk_rmem_alloc) >= 2 * sk->sk_rcvbuf)
-                       app_win >>= 1;
-               if (app_win > icsk->icsk_ack.rcv_mss)
-                       app_win -= icsk->icsk_ack.rcv_mss;
-               app_win = max(app_win, 2U*tp->advmss);
-
+       if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
                tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss);
-       }
 }
 
 /* Receiver "autotuning" code.
@@ -385,8 +367,8 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
                 * are stalled on filesystem I/O.
                 *
                 * Also, since we are only going for a minimum in the
-                * non-timestamp case, we do not smoothe things out
-                * else with timestamps disabled convergance takes too
+                * non-timestamp case, we do not smooth things out
+                * else with timestamps disabled convergence takes too
                 * long.
                 */
                if (!win_dep) {
@@ -395,7 +377,7 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
                } else if (m < new_sample)
                        new_sample = m << 3;
        } else {
-               /* No previous mesaure. */
+               /* No previous measure. */
                new_sample = m << 3;
        }
 
@@ -524,7 +506,7 @@ static void tcp_event_data_recv(struct sock *sk, struct tcp_sock *tp, struct sk_
                        if (icsk->icsk_ack.ato > icsk->icsk_rto)
                                icsk->icsk_ack.ato = icsk->icsk_rto;
                } else if (m > icsk->icsk_rto) {
-                       /* Too long gap. Apparently sender falled to
+                       /* Too long gap. Apparently sender failed to
                         * restart window, so that we send ACKs quickly.
                         */
                        tcp_incr_quickack(sk);
@@ -548,10 +530,9 @@ static void tcp_event_data_recv(struct sock *sk, struct tcp_sock *tp, struct sk_
  * To save cycles in the RFC 1323 implementation it was better to break
  * it up into three procedures. -- erics
  */
-static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt, u32 *usrtt)
+static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       const struct inet_connection_sock *icsk = inet_csk(sk);
        long m = mrtt; /* RTT */
 
        /*      The following amusing code comes from Jacobson's
@@ -565,7 +546,7 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt, u32 *usrtt)
         *
         * Funny. This algorithm seems to be very broken.
         * These formulae increase RTO, when it should be decreased, increase
-        * too slowly, when it should be incresed fastly, decrease too fastly
+        * too slowly, when it should be increased quickly, decrease too quickly
         * etc. I guess in BSD RTO takes ONE value, so that it is absolutely
         * does not matter how to _calculate_ it. Seems, it was trap
         * that VJ failed to avoid. 8)
@@ -610,9 +591,6 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt, u32 *usrtt)
                tp->mdev_max = tp->rttvar = max(tp->mdev, TCP_RTO_MIN);
                tp->rtt_seq = tp->snd_nxt;
        }
-
-       if (icsk->icsk_ca_ops->rtt_sample)
-               icsk->icsk_ca_ops->rtt_sample(sk, *usrtt);
 }
 
 /* Calculate rto without backoff.  This is the second half of Van Jacobson's
@@ -629,14 +607,14 @@ static inline void tcp_set_rto(struct sock *sk)
         *    at least by solaris and freebsd. "Erratic ACKs" has _nothing_
         *    to do with delayed acks, because at cwnd>2 true delack timeout
         *    is invisible. Actually, Linux-2.4 also generates erratic
-        *    ACKs in some curcumstances.
+        *    ACKs in some circumstances.
         */
        inet_csk(sk)->icsk_rto = (tp->srtt >> 3) + tp->rttvar;
 
        /* 2. Fixups made earlier cannot be right.
         *    If we do not estimate RTO correctly without them,
         *    all the algo is pure shit and should be replaced
-        *    with correct one. It is exaclty, which we pretend to do.
+        *    with correct one. It is exactly, which we pretend to do.
         */
 }
 
@@ -794,7 +772,7 @@ static void tcp_init_metrics(struct sock *sk)
         * to make it more realistic.
         *
         * A bit of theory. RTT is time passed after "normal" sized packet
-        * is sent until it is ACKed. In normal curcumstances sending small
+        * is sent until it is ACKed. In normal circumstances sending small
         * packets force peer to delay ACKs and calculation is correct too.
         * The algorithm is adaptive and, provided we follow specs, it
         * NEVER underestimate RTT. BUT! If peer tries to make some clever
@@ -919,18 +897,32 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
        int prior_fackets;
        u32 lost_retrans = 0;
        int flag = 0;
+       int dup_sack = 0;
        int i;
 
        if (!tp->sacked_out)
                tp->fackets_out = 0;
        prior_fackets = tp->fackets_out;
 
-       for (i=0; i<num_sacks; i++, sp++) {
-               struct sk_buff *skb;
-               __u32 start_seq = ntohl(sp->start_seq);
-               __u32 end_seq = ntohl(sp->end_seq);
-               int fack_count = 0;
-               int dup_sack = 0;
+       /* SACK fastpath:
+        * if the only SACK change is the increase of the end_seq of
+        * the first block then only apply that SACK block
+        * and use retrans queue hinting otherwise slowpath */
+       flag = 1;
+       for (i = 0; i< num_sacks; i++) {
+               __u32 start_seq = ntohl(sp[i].start_seq);
+               __u32 end_seq =  ntohl(sp[i].end_seq);
+
+               if (i == 0){
+                       if (tp->recv_sack_cache[i].start_seq != start_seq)
+                               flag = 0;
+               } else {
+                       if ((tp->recv_sack_cache[i].start_seq != start_seq) ||
+                           (tp->recv_sack_cache[i].end_seq != end_seq))
+                               flag = 0;
+               }
+               tp->recv_sack_cache[i].start_seq = start_seq;
+               tp->recv_sack_cache[i].end_seq = end_seq;
 
                /* Check for D-SACK. */
                if (i == 0) {
@@ -962,15 +954,58 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                        if (before(ack, prior_snd_una - tp->max_window))
                                return 0;
                }
+       }
+
+       if (flag)
+               num_sacks = 1;
+       else {
+               int j;
+               tp->fastpath_skb_hint = NULL;
+
+               /* order SACK blocks to allow in order walk of the retrans queue */
+               for (i = num_sacks-1; i > 0; i--) {
+                       for (j = 0; j < i; j++){
+                               if (after(ntohl(sp[j].start_seq),
+                                         ntohl(sp[j+1].start_seq))){
+                                       sp[j].start_seq = htonl(tp->recv_sack_cache[j+1].start_seq);
+                                       sp[j].end_seq = htonl(tp->recv_sack_cache[j+1].end_seq);
+                                       sp[j+1].start_seq = htonl(tp->recv_sack_cache[j].start_seq);
+                                       sp[j+1].end_seq = htonl(tp->recv_sack_cache[j].end_seq);
+                               }
+
+                       }
+               }
+       }
+
+       /* clear flag as used for different purpose in following code */
+       flag = 0;
+
+       for (i=0; i<num_sacks; i++, sp++) {
+               struct sk_buff *skb;
+               __u32 start_seq = ntohl(sp->start_seq);
+               __u32 end_seq = ntohl(sp->end_seq);
+               int fack_count;
+
+               /* Use SACK fastpath hint if valid */
+               if (tp->fastpath_skb_hint) {
+                       skb = tp->fastpath_skb_hint;
+                       fack_count = tp->fastpath_cnt_hint;
+               } else {
+                       skb = sk->sk_write_queue.next;
+                       fack_count = 0;
+               }
 
                /* Event "B" in the comment above. */
                if (after(end_seq, tp->high_seq))
                        flag |= FLAG_DATA_LOST;
 
-               sk_stream_for_retrans_queue(skb, sk) {
+               sk_stream_for_retrans_queue_from(skb, sk) {
                        int in_sack, pcount;
                        u8 sacked;
 
+                       tp->fastpath_skb_hint = skb;
+                       tp->fastpath_cnt_hint = fack_count;
+
                        /* The retransmission queue is always in order, so
                         * we can short-circuit the walk early.
                         */
@@ -1045,6 +1080,9 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                                                TCP_SKB_CB(skb)->sacked &= ~(TCPCB_LOST|TCPCB_SACKED_RETRANS);
                                                tp->lost_out -= tcp_skb_pcount(skb);
                                                tp->retrans_out -= tcp_skb_pcount(skb);
+
+                                               /* clear lost hint */
+                                               tp->retransmit_skb_hint = NULL;
                                        }
                                } else {
                                        /* New sack for not retransmitted frame,
@@ -1057,6 +1095,9 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                                        if (sacked & TCPCB_LOST) {
                                                TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST;
                                                tp->lost_out -= tcp_skb_pcount(skb);
+
+                                               /* clear lost hint */
+                                               tp->retransmit_skb_hint = NULL;
                                        }
                                }
 
@@ -1080,6 +1121,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                            (TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS)) {
                                TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS;
                                tp->retrans_out -= tcp_skb_pcount(skb);
+                               tp->retransmit_skb_hint = NULL;
                        }
                }
        }
@@ -1107,6 +1149,9 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                                TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS;
                                tp->retrans_out -= tcp_skb_pcount(skb);
 
+                               /* clear lost hint */
+                               tp->retransmit_skb_hint = NULL;
+
                                if (!(TCP_SKB_CB(skb)->sacked&(TCPCB_LOST|TCPCB_SACKED_ACKED))) {
                                        tp->lost_out += tcp_skb_pcount(skb);
                                        TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
@@ -1214,6 +1259,8 @@ static void tcp_enter_frto_loss(struct sock *sk)
        tcp_set_ca_state(sk, TCP_CA_Loss);
        tp->high_seq = tp->frto_highmark;
        TCP_ECN_queue_cwr(tp);
+
+       clear_all_retrans_hints(tp);
 }
 
 void tcp_clear_retrans(struct tcp_sock *tp)
@@ -1251,6 +1298,7 @@ void tcp_enter_loss(struct sock *sk, int how)
        tp->snd_cwnd_cnt   = 0;
        tp->snd_cwnd_stamp = tcp_time_stamp;
 
+       tp->bytes_acked = 0;
        tcp_clear_retrans(tp);
 
        /* Push undo marker, if it was plain RTO and nothing
@@ -1279,6 +1327,8 @@ void tcp_enter_loss(struct sock *sk, int how)
        tcp_set_ca_state(sk, TCP_CA_Loss);
        tp->high_seq = tp->snd_nxt;
        TCP_ECN_queue_cwr(tp);
+
+       clear_all_retrans_hints(tp);
 }
 
 static int tcp_check_sack_reneging(struct sock *sk)
@@ -1503,17 +1553,37 @@ static void tcp_mark_head_lost(struct sock *sk, struct tcp_sock *tp,
                               int packets, u32 high_seq)
 {
        struct sk_buff *skb;
-       int cnt = packets;
+       int cnt;
 
-       BUG_TRAP(cnt <= tp->packets_out);
+       BUG_TRAP(packets <= tp->packets_out);
+       if (tp->lost_skb_hint) {
+               skb = tp->lost_skb_hint;
+               cnt = tp->lost_cnt_hint;
+       } else {
+               skb = sk->sk_write_queue.next;
+               cnt = 0;
+       }
 
-       sk_stream_for_retrans_queue(skb, sk) {
-               cnt -= tcp_skb_pcount(skb);
-               if (cnt < 0 || after(TCP_SKB_CB(skb)->end_seq, high_seq))
+       sk_stream_for_retrans_queue_from(skb, sk) {
+               /* TODO: do this better */
+               /* this is not the most efficient way to do this... */
+               tp->lost_skb_hint = skb;
+               tp->lost_cnt_hint = cnt;
+               cnt += tcp_skb_pcount(skb);
+               if (cnt > packets || after(TCP_SKB_CB(skb)->end_seq, high_seq))
                        break;
                if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
                        TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
                        tp->lost_out += tcp_skb_pcount(skb);
+
+                       /* clear xmit_retransmit_queue hints
+                        *  if this is beyond hint */
+                       if(tp->retransmit_skb_hint != NULL &&
+                          before(TCP_SKB_CB(skb)->seq,
+                                 TCP_SKB_CB(tp->retransmit_skb_hint)->seq)) {
+
+                               tp->retransmit_skb_hint = NULL;
+                       }
                }
        }
        tcp_sync_left_out(tp);
@@ -1540,13 +1610,28 @@ static void tcp_update_scoreboard(struct sock *sk, struct tcp_sock *tp)
        if (tcp_head_timedout(sk, tp)) {
                struct sk_buff *skb;
 
-               sk_stream_for_retrans_queue(skb, sk) {
-                       if (tcp_skb_timedout(sk, skb) &&
-                           !(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
+               skb = tp->scoreboard_skb_hint ? tp->scoreboard_skb_hint
+                       : sk->sk_write_queue.next;
+
+               sk_stream_for_retrans_queue_from(skb, sk) {
+                       if (!tcp_skb_timedout(sk, skb))
+                               break;
+
+                       if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
                                TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
                                tp->lost_out += tcp_skb_pcount(skb);
+
+                               /* clear xmit_retrans hint */
+                               if (tp->retransmit_skb_hint &&
+                                   before(TCP_SKB_CB(skb)->seq,
+                                          TCP_SKB_CB(tp->retransmit_skb_hint)->seq))
+
+                                       tp->retransmit_skb_hint = NULL;
                        }
                }
+
+               tp->scoreboard_skb_hint = skb;
+
                tcp_sync_left_out(tp);
        }
 }
@@ -1626,6 +1711,10 @@ static void tcp_undo_cwr(struct sock *sk, const int undo)
        }
        tcp_moderate_cwnd(tp);
        tp->snd_cwnd_stamp = tcp_time_stamp;
+
+       /* There is something screwy going on with the retrans hints after
+          an undo */
+       clear_all_retrans_hints(tp);
 }
 
 static inline int tcp_may_undo(struct tcp_sock *tp)
@@ -1709,6 +1798,9 @@ static int tcp_try_undo_loss(struct sock *sk, struct tcp_sock *tp)
                sk_stream_for_retrans_queue(skb, sk) {
                        TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST;
                }
+
+               clear_all_retrans_hints(tp);
+
                DBGUNDO(sk, tp, "partial loss");
                tp->lost_out = 0;
                tp->left_out = tp->sacked_out;
@@ -1908,6 +2000,7 @@ tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una,
                        TCP_ECN_queue_cwr(tp);
                }
 
+               tp->bytes_acked = 0;
                tp->snd_cwnd_cnt = 0;
                tcp_set_ca_state(sk, TCP_CA_Recovery);
        }
@@ -1919,9 +2012,9 @@ tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una,
 }
 
 /* Read draft-ietf-tcplw-high-performance before mucking
- * with this code. (Superceeds RFC1323)
+ * with this code. (Supersedes RFC1323)
  */
-static void tcp_ack_saw_tstamp(struct sock *sk, u32 *usrtt, int flag)
+static void tcp_ack_saw_tstamp(struct sock *sk, int flag)
 {
        /* RTTM Rule: A TSecr value received in a segment is used to
         * update the averaged RTT measurement only if the segment
@@ -1932,7 +2025,7 @@ static void tcp_ack_saw_tstamp(struct sock *sk, u32 *usrtt, int flag)
         * 1998/04/10 Andrey V. Savochkin <saw@msu.ru>
         *
         * Changed: reset backoff as soon as we see the first valid sample.
-        * If we do not, we get strongly overstimated rto. With timestamps
+        * If we do not, we get strongly overestimated rto. With timestamps
         * samples are accepted even from very old segments: f.e., when rtt=1
         * increases to 8, we retransmit 5 times and after 8 seconds delayed
         * answer arrives rto becomes 120 seconds! If at least one of segments
@@ -1940,13 +2033,13 @@ static void tcp_ack_saw_tstamp(struct sock *sk, u32 *usrtt, int flag)
         */
        struct tcp_sock *tp = tcp_sk(sk);
        const __u32 seq_rtt = tcp_time_stamp - tp->rx_opt.rcv_tsecr;
-       tcp_rtt_estimator(sk, seq_rtt, usrtt);
+       tcp_rtt_estimator(sk, seq_rtt);
        tcp_set_rto(sk);
        inet_csk(sk)->icsk_backoff = 0;
        tcp_bound_rto(sk);
 }
 
-static void tcp_ack_no_tstamp(struct sock *sk, u32 seq_rtt, u32 *usrtt, int flag)
+static void tcp_ack_no_tstamp(struct sock *sk, u32 seq_rtt, int flag)
 {
        /* We don't have a timestamp. Can only use
         * packets that are not retransmitted to determine
@@ -1960,21 +2053,21 @@ static void tcp_ack_no_tstamp(struct sock *sk, u32 seq_rtt, u32 *usrtt, int flag
        if (flag & FLAG_RETRANS_DATA_ACKED)
                return;
 
-       tcp_rtt_estimator(sk, seq_rtt, usrtt);
+       tcp_rtt_estimator(sk, seq_rtt);
        tcp_set_rto(sk);
        inet_csk(sk)->icsk_backoff = 0;
        tcp_bound_rto(sk);
 }
 
 static inline void tcp_ack_update_rtt(struct sock *sk, const int flag,
-                                     const s32 seq_rtt, u32 *usrtt)
+                                     const s32 seq_rtt)
 {
        const struct tcp_sock *tp = tcp_sk(sk);
        /* Note that peer MAY send zero echo. In this case it is ignored. (rfc1323) */
        if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
-               tcp_ack_saw_tstamp(sk, usrtt, flag);
+               tcp_ack_saw_tstamp(sk, flag);
        else if (seq_rtt >= 0)
-               tcp_ack_no_tstamp(sk, seq_rtt, usrtt, flag);
+               tcp_ack_no_tstamp(sk, seq_rtt, flag);
 }
 
 static inline void tcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
@@ -2054,20 +2147,27 @@ static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb,
        return acked;
 }
 
+static inline u32 tcp_usrtt(const struct sk_buff *skb)
+{
+       struct timeval tv, now;
+
+       do_gettimeofday(&now);
+       skb_get_timestamp(skb, &tv);
+       return (now.tv_sec - tv.tv_sec) * 1000000 + (now.tv_usec - tv.tv_usec);
+}
 
 /* Remove acknowledged frames from the retransmission queue. */
-static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p, s32 *seq_usrtt)
+static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       const struct inet_connection_sock *icsk = inet_csk(sk);
        struct sk_buff *skb;
        __u32 now = tcp_time_stamp;
        int acked = 0;
        __s32 seq_rtt = -1;
-       struct timeval usnow;
        u32 pkts_acked = 0;
-
-       if (seq_usrtt)
-               do_gettimeofday(&usnow);
+       void (*rtt_sample)(struct sock *sk, u32 usrtt)
+               = icsk->icsk_ca_ops->rtt_sample;
 
        while ((skb = skb_peek(&sk->sk_write_queue)) &&
               skb != sk->sk_send_head) {
@@ -2107,16 +2207,11 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p, s32 *seq_usrtt
                                        tp->retrans_out -= tcp_skb_pcount(skb);
                                acked |= FLAG_RETRANS_DATA_ACKED;
                                seq_rtt = -1;
-                       } else if (seq_rtt < 0)
+                       } else if (seq_rtt < 0) {
                                seq_rtt = now - scb->when;
-                       if (seq_usrtt) {
-                               struct timeval tv;
-                       
-                               skb_get_timestamp(skb, &tv);
-                               *seq_usrtt = (usnow.tv_sec - tv.tv_sec) * 1000000
-                                       + (usnow.tv_usec - tv.tv_usec);
+                               if (rtt_sample)
+                                       (*rtt_sample)(sk, tcp_usrtt(skb));
                        }
-
                        if (sacked & TCPCB_SACKED_ACKED)
                                tp->sacked_out -= tcp_skb_pcount(skb);
                        if (sacked & TCPCB_LOST)
@@ -2126,17 +2221,20 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p, s32 *seq_usrtt
                                    !before(scb->end_seq, tp->snd_up))
                                        tp->urg_mode = 0;
                        }
-               } else if (seq_rtt < 0)
+               } else if (seq_rtt < 0) {
                        seq_rtt = now - scb->when;
+                       if (rtt_sample)
+                               (*rtt_sample)(sk, tcp_usrtt(skb));
+               }
                tcp_dec_pcount_approx(&tp->fackets_out, skb);
                tcp_packets_out_dec(tp, skb);
                __skb_unlink(skb, &sk->sk_write_queue);
                sk_stream_free_skb(sk, skb);
+               clear_all_retrans_hints(tp);
        }
 
        if (acked&FLAG_ACKED) {
-               const struct inet_connection_sock *icsk = inet_csk(sk);
-               tcp_ack_update_rtt(sk, acked, seq_rtt, seq_usrtt);
+               tcp_ack_update_rtt(sk, acked, seq_rtt);
                tcp_ack_packets_out(sk, tp);
 
                if (icsk->icsk_ca_ops->pkts_acked)
@@ -2284,7 +2382,7 @@ static void tcp_process_frto(struct sock *sk, u32 prior_snd_una)
        }
 
        /* F-RTO affects on two new ACKs following RTO.
-        * At latest on third ACK the TCP behavor is back to normal.
+        * At latest on third ACK the TCP behavior is back to normal.
         */
        tp->frto_counter = (tp->frto_counter + 1) % 3;
 }
@@ -2299,7 +2397,6 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
        u32 ack = TCP_SKB_CB(skb)->ack_seq;
        u32 prior_in_flight;
        s32 seq_rtt;
-       s32 seq_usrtt = 0;
        int prior_packets;
 
        /* If the ack is newer than sent or older than previous acks
@@ -2311,6 +2408,9 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
        if (before(ack, prior_snd_una))
                goto old_ack;
 
+       if (sysctl_tcp_abc && icsk->icsk_ca_state < TCP_CA_CWR)
+               tp->bytes_acked += ack - prior_snd_una;
+
        if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) {
                /* Window is constant, pure forward advance.
                 * No more checks are required.
@@ -2352,14 +2452,13 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
        prior_in_flight = tcp_packets_in_flight(tp);
 
        /* See if we can take anything off of the retransmit queue. */
-       flag |= tcp_clean_rtx_queue(sk, &seq_rtt,
-                                   icsk->icsk_ca_ops->rtt_sample ? &seq_usrtt : NULL);
+       flag |= tcp_clean_rtx_queue(sk, &seq_rtt);
 
        if (tp->frto_counter)
                tcp_process_frto(sk, prior_snd_una);
 
        if (tcp_ack_is_dubious(sk, flag)) {
-               /* Advanve CWND, if state allows this. */
+               /* Advance CWND, if state allows this. */
                if ((flag & FLAG_DATA_ACKED) && tcp_may_raise_cwnd(sk, flag))
                        tcp_cong_avoid(sk, ack,  seq_rtt, prior_in_flight, 0);
                tcp_fastretrans_alert(sk, prior_snd_una, prior_packets, flag);
@@ -3148,7 +3247,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list,
 {
        struct sk_buff *skb;
 
-       /* First, check that queue is collapsable and find
+       /* First, check that queue is collapsible and find
         * the point where collapsing can be useful. */
        for (skb = head; skb != tail; ) {
                /* No new bits? It is possible on ofo queue. */
@@ -3456,7 +3555,7 @@ static __inline__ void tcp_ack_snd_check(struct sock *sk)
 
 /*
  *     This routine is only called when we have urgent data
- *     signalled. Its the 'slow' part of tcp_urg. It could be
+ *     signaled. Its the 'slow' part of tcp_urg. It could be
  *     moved inline now as tcp_urg is only called from one
  *     place. We handle URGent data wrong. We have to - as
  *     BSD still doesn't use the correction from RFC961.
@@ -3501,7 +3600,7 @@ static void tcp_check_urg(struct sock * sk, struct tcphdr * th)
         * urgent. To do this requires some care. We cannot just ignore
         * tp->copied_seq since we would read the last urgent byte again
         * as data, nor can we alter copied_seq until this data arrives
-        * or we break the sematics of SIOCATMARK (and thus sockatmark())
+        * or we break the semantics of SIOCATMARK (and thus sockatmark())
         *
         * NOTE. Double Dutch. Rendering to plain English: author of comment
         * above did something sort of  send("A", MSG_OOB); send("B", MSG_OOB);
@@ -3646,7 +3745,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
        tp->rx_opt.saw_tstamp = 0;
 
        /*      pred_flags is 0xS?10 << 16 + snd_wnd
-        *      if header_predition is to be made
+        *      if header_prediction is to be made
         *      'S' will always be tp->tcp_header_len >> 2
         *      '?' will be 0 for the fast path, otherwise pred_flags is 0 to
         *  turn it off (when there are holes in the receive 
@@ -4242,7 +4341,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                                 */
                                if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr &&
                                    !tp->srtt)
-                                       tcp_ack_saw_tstamp(sk, NULL, 0);
+                                       tcp_ack_saw_tstamp(sk, 0);
 
                                if (tp->rx_opt.tstamp_ok)
                                        tp->advmss -= TCPOLEN_TSTAMP_ALIGNED;
@@ -4372,6 +4471,7 @@ discard:
 
 EXPORT_SYMBOL(sysctl_tcp_ecn);
 EXPORT_SYMBOL(sysctl_tcp_reordering);
+EXPORT_SYMBOL(sysctl_tcp_abc);
 EXPORT_SYMBOL(tcp_parse_options);
 EXPORT_SYMBOL(tcp_rcv_established);
 EXPORT_SYMBOL(tcp_rcv_state_process);
index 634dabb558fd6f5942e709c99846f83985db8b41..4d5021e1929b991861c0fc788be99c8b568fcb79 100644 (file)
@@ -39,7 +39,7 @@
  *                                     request_sock handling and moved
  *                                     most of it into the af independent code.
  *                                     Added tail drop and some other bugfixes.
- *                                     Added new listen sematics.
+ *                                     Added new listen semantics.
  *             Mike McLagan    :       Routing by source
  *     Juan Jose Ciarlante:            ip_dynaddr bits
  *             Andi Kleen:             various fixes.
@@ -1110,24 +1110,18 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
 static int tcp_v4_checksum_init(struct sk_buff *skb)
 {
        if (skb->ip_summed == CHECKSUM_HW) {
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
                if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr,
-                                 skb->nh.iph->daddr, skb->csum))
+                                 skb->nh.iph->daddr, skb->csum)) {
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
                        return 0;
-
-               LIMIT_NETDEBUG(KERN_DEBUG "hw tcp v4 csum failed\n");
-               skb->ip_summed = CHECKSUM_NONE;
+               }
        }
+
+       skb->csum = csum_tcpudp_nofold(skb->nh.iph->saddr, skb->nh.iph->daddr,
+                                      skb->len, IPPROTO_TCP, 0);
+
        if (skb->len <= 76) {
-               if (tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr,
-                                skb->nh.iph->daddr,
-                                skb_checksum(skb, 0, skb->len, 0)))
-                       return -1;
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-       } else {
-               skb->csum = ~tcp_v4_check(skb->h.th, skb->len,
-                                         skb->nh.iph->saddr,
-                                         skb->nh.iph->daddr, 0);
+               return __skb_checksum_complete(skb);
        }
        return 0;
 }
@@ -1216,10 +1210,10 @@ int tcp_v4_rcv(struct sk_buff *skb)
 
        /* An explanation is required here, I think.
         * Packet length and doff are validated by header prediction,
-        * provided case of th->doff==0 is elimineted.
+        * provided case of th->doff==0 is eliminated.
         * So, we defer the checks. */
        if ((skb->ip_summed != CHECKSUM_UNNECESSARY &&
-            tcp_v4_checksum_init(skb) < 0))
+            tcp_v4_checksum_init(skb)))
                goto bad_packet;
 
        th = skb->h.th;
index b1a63b2c6b4aef5a55a78fe7db14c9214d4a417d..1b66a2ac4321cb3dfe42326a03baa0897b016f37 100644 (file)
@@ -158,7 +158,7 @@ kill_with_rst:
                /* I am shamed, but failed to make it more elegant.
                 * Yes, it is direct reference to IP, which is impossible
                 * to generalize to IPv6. Taking into account that IPv6
-                * do not undertsnad recycling in any case, it not
+                * do not understand recycling in any case, it not
                 * a big problem in practice. --ANK */
                if (tw->tw_family == AF_INET &&
                    tcp_death_row.sysctl_tw_recycle && tcptw->tw_ts_recent_stamp &&
@@ -194,7 +194,7 @@ kill_with_rst:
                /* In window segment, it may be only reset or bare ack. */
 
                if (th->rst) {
-                       /* This is TIME_WAIT assasination, in two flavors.
+                       /* This is TIME_WAIT assassination, in two flavors.
                         * Oh well... nobody has a sufficient solution to this
                         * protocol bug yet.
                         */
@@ -380,6 +380,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
                 */
                newtp->snd_cwnd = 2;
                newtp->snd_cwnd_cnt = 0;
+               newtp->bytes_acked = 0;
 
                newtp->frto_counter = 0;
                newtp->frto_highmark = 0;
@@ -550,7 +551,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
 
        /* RFC793 page 36: "If the connection is in any non-synchronized state ...
         *                  and the incoming segment acknowledges something not yet
-        *                  sent (the segment carries an unaccaptable ACK) ...
+        *                  sent (the segment carries an unacceptable ACK) ...
         *                  a reset is sent."
         *
         * Invalid ACK: reset will be sent by listening socket
index b907456a79f46373bb81aac30ff9123910901952..029c70dfb585f74e74383faf40c1816b4e6d410d 100644 (file)
@@ -436,6 +436,8 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
        u16 flags;
 
        BUG_ON(len > skb->len);
+
+       clear_all_retrans_hints(tp);
        nsize = skb_headlen(skb) - len;
        if (nsize < 0)
                nsize = 0;
@@ -599,7 +601,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
    for TCP options, but includes only bare TCP header.
 
    tp->rx_opt.mss_clamp is mss negotiated at connection setup.
-   It is minumum of user_mss and mss received with SYN.
+   It is minimum of user_mss and mss received with SYN.
    It also does not include TCP options.
 
    tp->pmtu_cookie is last pmtu, seen by this function.
@@ -1171,7 +1173,7 @@ u32 __tcp_select_window(struct sock *sk)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
-       /* MSS for the peer's data.  Previous verions used mss_clamp
+       /* MSS for the peer's data.  Previous versions used mss_clamp
         * here.  I don't know if the value based on our guesses
         * of peer's MSS is better for the performance.  It's more correct
         * but may be worse for the performance because of rcv_mss
@@ -1260,7 +1262,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
                BUG_ON(tcp_skb_pcount(skb) != 1 ||
                       tcp_skb_pcount(next_skb) != 1);
 
-               /* Ok.  We will be able to collapse the packet. */
+               /* changing transmit queue under us so clear hints */
+               clear_all_retrans_hints(tp);
+
+               /* Ok.  We will be able to collapse the packet. */
                __skb_unlink(next_skb, &sk->sk_write_queue);
 
                memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size);
@@ -1330,6 +1335,8 @@ void tcp_simple_retransmit(struct sock *sk)
                }
        }
 
+       clear_all_retrans_hints(tp);
+
        if (!lost)
                return;
 
@@ -1361,7 +1368,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
        int err;
 
        /* Do not sent more than we queued. 1/4 is reserved for possible
-        * copying overhead: frgagmentation, tunneling, mangling etc.
+        * copying overhead: fragmentation, tunneling, mangling etc.
         */
        if (atomic_read(&sk->sk_wmem_alloc) >
            min(sk->sk_wmem_queued + (sk->sk_wmem_queued >> 2), sk->sk_sndbuf))
@@ -1468,13 +1475,25 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
        const struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
        struct sk_buff *skb;
-       int packet_cnt = tp->lost_out;
+       int packet_cnt;
+
+       if (tp->retransmit_skb_hint) {
+               skb = tp->retransmit_skb_hint;
+               packet_cnt = tp->retransmit_cnt_hint;
+       }else{
+               skb = sk->sk_write_queue.next;
+               packet_cnt = 0;
+       }
 
        /* First pass: retransmit lost packets. */
-       if (packet_cnt) {
-               sk_stream_for_retrans_queue(skb, sk) {
+       if (tp->lost_out) {
+               sk_stream_for_retrans_queue_from(skb, sk) {
                        __u8 sacked = TCP_SKB_CB(skb)->sacked;
 
+                       /* we could do better than to assign each time */
+                       tp->retransmit_skb_hint = skb;
+                       tp->retransmit_cnt_hint = packet_cnt;
+
                        /* Assume this retransmit will generate
                         * only one packet for congestion window
                         * calculation purposes.  This works because
@@ -1485,10 +1504,12 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
                        if (tcp_packets_in_flight(tp) >= tp->snd_cwnd)
                                return;
 
-                       if (sacked&TCPCB_LOST) {
+                       if (sacked & TCPCB_LOST) {
                                if (!(sacked&(TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS))) {
-                                       if (tcp_retransmit_skb(sk, skb))
+                                       if (tcp_retransmit_skb(sk, skb)) {
+                                               tp->retransmit_skb_hint = NULL;
                                                return;
+                                       }
                                        if (icsk->icsk_ca_state != TCP_CA_Loss)
                                                NET_INC_STATS_BH(LINUX_MIB_TCPFASTRETRANS);
                                        else
@@ -1501,8 +1522,8 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
                                                                          TCP_RTO_MAX);
                                }
 
-                               packet_cnt -= tcp_skb_pcount(skb);
-                               if (packet_cnt <= 0)
+                               packet_cnt += tcp_skb_pcount(skb);
+                               if (packet_cnt >= tp->lost_out)
                                        break;
                        }
                }
@@ -1528,9 +1549,18 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
        if (tcp_may_send_now(sk, tp))
                return;
 
-       packet_cnt = 0;
+       if (tp->forward_skb_hint) {
+               skb = tp->forward_skb_hint;
+               packet_cnt = tp->forward_cnt_hint;
+       } else{
+               skb = sk->sk_write_queue.next;
+               packet_cnt = 0;
+       }
+
+       sk_stream_for_retrans_queue_from(skb, sk) {
+               tp->forward_cnt_hint = packet_cnt;
+               tp->forward_skb_hint = skb;
 
-       sk_stream_for_retrans_queue(skb, sk) {
                /* Similar to the retransmit loop above we
                 * can pretend that the retransmitted SKB
                 * we send out here will be composed of one
@@ -1547,8 +1577,10 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
                        continue;
 
                /* Ok, retransmit it. */
-               if (tcp_retransmit_skb(sk, skb))
+               if (tcp_retransmit_skb(sk, skb)) {
+                       tp->forward_skb_hint = NULL;
                        break;
+               }
 
                if (skb == skb_peek(&sk->sk_write_queue))
                        inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
@@ -2058,3 +2090,4 @@ EXPORT_SYMBOL(tcp_connect);
 EXPORT_SYMBOL(tcp_make_synack);
 EXPORT_SYMBOL(tcp_simple_retransmit);
 EXPORT_SYMBOL(tcp_sync_mss);
+EXPORT_SYMBOL(sysctl_tcp_tso_win_divisor);
index 327770bf552230211f2db5d799183fa08dd7e440..26d7486ee5019a842157d9b4b8aeea55abb2f26c 100644 (file)
@@ -20,20 +20,20 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
                                    u32 in_flight, int flag)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       if (in_flight < tp->snd_cwnd)
+
+       if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-       if (tp->snd_cwnd <= tp->snd_ssthresh) {
-               tp->snd_cwnd++;
-       else {
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+       else {
                tp->snd_cwnd_cnt++;
                if (tp->snd_cwnd_cnt > min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT)){
-                       tp->snd_cwnd++;
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
                        tp->snd_cwnd_cnt = 0;
                }
        }
-       tp->snd_cwnd = min_t(u32, tp->snd_cwnd, tp->snd_cwnd_clamp);
-       tp->snd_cwnd_stamp = tcp_time_stamp;
 }
 
 static u32 tcp_scalable_ssthresh(struct sock *sk)
index 415ee47ac1c55f24c7d58a8327b089c6925c34a3..e1880959614a49d8855daecf1285e9fdaf48af05 100644 (file)
@@ -58,7 +58,7 @@ static void tcp_write_err(struct sock *sk)
  * to prevent DoS attacks. It is called when a retransmission timeout
  * or zero probe timeout occurs on orphaned socket.
  *
- * Criterium is still not confirmed experimentally and may change.
+ * Criteria is still not confirmed experimentally and may change.
  * We kill the socket, if:
  * 1. If number of orphaned sockets exceeds an administratively configured
  *    limit.
@@ -132,7 +132,7 @@ static int tcp_write_timeout(struct sock *sk)
                           hole detection. :-(
 
                           It is place to make it. It is not made. I do not want
-                          to make it. It is disguisting. It does not work in any
+                          to make it. It is disgusting. It does not work in any
                           case. Let me to cite the same draft, which requires for
                           us to implement this:
 
index 93c5f92070f9129bfd55667f9945fbaeb7cee194..b7d296a8ac6d2366e2470607d579ef1bac5cc3ab 100644 (file)
@@ -236,8 +236,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                        /* We don't have enough RTT samples to do the Vegas
                         * calculation, so we'll behave like Reno.
                         */
-                       if (tp->snd_cwnd > tp->snd_ssthresh)
-                               tp->snd_cwnd++;
+                       tcp_reno_cong_avoid(sk, ack, seq_rtt, in_flight, flag);
                } else {
                        u32 rtt, target_cwnd, diff;
 
@@ -275,7 +274,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                         */
                        diff = (old_wnd << V_PARAM_SHIFT) - target_cwnd;
 
-                       if (tp->snd_cwnd < tp->snd_ssthresh) {
+                       if (tp->snd_cwnd <= tp->snd_ssthresh) {
                                /* Slow start.  */
                                if (diff > gamma) {
                                        /* Going too fast. Time to slow down
@@ -295,6 +294,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                                                            V_PARAM_SHIFT)+1);
 
                                }
+                               tcp_slow_start(tp);
                        } else {
                                /* Congestion avoidance. */
                                u32 next_snd_cwnd;
@@ -327,37 +327,17 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                                else if (next_snd_cwnd < tp->snd_cwnd)
                                        tp->snd_cwnd--;
                        }
-               }
 
-               /* Wipe the slate clean for the next RTT. */
-               vegas->cntRTT = 0;
-               vegas->minRTT = 0x7fffffff;
+                       if (tp->snd_cwnd < 2)
+                               tp->snd_cwnd = 2;
+                       else if (tp->snd_cwnd > tp->snd_cwnd_clamp)
+                               tp->snd_cwnd = tp->snd_cwnd_clamp;
+               }
        }
 
-       /* The following code is executed for every ack we receive,
-        * except for conditions checked in should_advance_cwnd()
-        * before the call to tcp_cong_avoid(). Mainly this means that
-        * we only execute this code if the ack actually acked some
-        * data.
-        */
-
-       /* If we are in slow start, increase our cwnd in response to this ACK.
-        * (If we are not in slow start then we are in congestion avoidance,
-        * and adjust our congestion window only once per RTT. See the code
-        * above.)
-        */
-       if (tp->snd_cwnd <= tp->snd_ssthresh)
-               tp->snd_cwnd++;
-
-       /* to keep cwnd from growing without bound */
-       tp->snd_cwnd = min_t(u32, tp->snd_cwnd, tp->snd_cwnd_clamp);
-
-       /* Make sure that we are never so timid as to reduce our cwnd below
-        * 2 MSS.
-        *
-        * Going below 2 MSS would risk huge delayed ACKs from our receiver.
-        */
-       tp->snd_cwnd = max(tp->snd_cwnd, 2U);
+       /* Wipe the slate clean for the next RTT. */
+       vegas->cntRTT = 0;
+       vegas->minRTT = 0x7fffffff;
 }
 
 /* Extract info for Tcp socket info provided via netlink. */
index e0bd1013cb0d0053c3d4b0f5fe0bbd2befa9ad48..2422a5f7195d002b457f0ced6e43c3dcd5998bff 100644 (file)
@@ -761,7 +761,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 
 static __inline__ int __udp_checksum_complete(struct sk_buff *skb)
 {
-       return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+       return __skb_checksum_complete(skb);
 }
 
 static __inline__ int udp_checksum_complete(struct sk_buff *skb)
@@ -1100,11 +1100,8 @@ static int udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
        if (uh->check == 0) {
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        } else if (skb->ip_summed == CHECKSUM_HW) {
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
                if (!udp_check(uh, ulen, saddr, daddr, skb->csum))
-                       return 0;
-               LIMIT_NETDEBUG(KERN_DEBUG "udp v4 hw csum failure.\n");
-               skb->ip_summed = CHECKSUM_NONE;
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
        }
        if (skb->ip_summed != CHECKSUM_UNNECESSARY)
                skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
index ddcf7754eec2dd69d65c3ddabf91edad39277314..56a09a4ac4105d69d548d0311dfbd50f7bbd8454 100644 (file)
@@ -1045,9 +1045,10 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
                        }
 #endif
                        /* Rule 8: Use longest matching prefix */
-                       if (hiscore.rule < 8)
+                       if (hiscore.rule < 8) {
                                hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr);
-                       score.rule++;
+                               hiscore.rule++;
+                       }
                        score.matchlen = ipv6_addr_diff(&ifa->addr, daddr);
                        if (score.matchlen > hiscore.matchlen) {
                                score.rule = 8;
index 4f8795af2edb68d950d909952f583ff0e3be8005..c63b8ce0e1b5fe646fee384f9508f2f14f45154a 100644 (file)
@@ -699,12 +699,14 @@ static int __init inet6_init(void)
        /* Register the family here so that the init calls below will
         * be able to create sockets. (?? is this dangerous ??)
         */
-       (void) sock_register(&inet6_family_ops);
+       err = sock_register(&inet6_family_ops);
+       if (err)
+               goto out_unregister_raw_proto;
 
        /* Initialise ipv6 mibs */
        err = init_ipv6_mibs();
        if (err)
-               goto out_unregister_raw_proto;
+               goto out_unregister_sock;
        
        /*
         *      ipngwg API draft makes clear that the correct semantics
@@ -796,6 +798,8 @@ icmp_fail:
        ipv6_sysctl_unregister();
 #endif
        cleanup_ipv6_mibs();
+out_unregister_sock:
+       sock_unregister(PF_INET6);
 out_unregister_raw_proto:
        proto_unregister(&rawv6_prot);
 out_unregister_udp_proto:
index 23e540365a143fde637aa72bd8697113cab444d6..1bdf0fb8bf8a05ac8fa44193a434c3fcad5a1dc6 100644 (file)
@@ -585,17 +585,16 @@ static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
        daddr = &skb->nh.ipv6h->daddr;
 
        /* Perform checksum. */
-       if (skb->ip_summed == CHECKSUM_HW) {
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-               if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
-                                   skb->csum)) {
-                       LIMIT_NETDEBUG(KERN_DEBUG "ICMPv6 hw checksum failed\n");
-                       skb->ip_summed = CHECKSUM_NONE;
-               }
-       }
-       if (skb->ip_summed == CHECKSUM_NONE) {
-               if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
-                                   skb_checksum(skb, 0, skb->len, 0))) {
+       switch (skb->ip_summed) {
+       case CHECKSUM_HW:
+               if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
+                                    skb->csum))
+                       break;
+               /* fall through */
+       case CHECKSUM_NONE:
+               skb->csum = ~csum_ipv6_magic(saddr, daddr, skb->len,
+                                            IPPROTO_ICMPV6, 0);
+               if (__skb_checksum_complete(skb)) {
                        LIMIT_NETDEBUG(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n",
                                       NIP6(*saddr), NIP6(*daddr));
                        goto discard_it;
index 003fd99ff597d6f4332008c90f6bdcb2b9e80493..25757ade989f50d23bf2e7d948d1286918678070 100644 (file)
@@ -287,7 +287,7 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
        {
                struct ipv6_txoptions *opt;
                if (optlen == 0)
-                       optval = 0;
+                       optval = NULL;
 
                /* hop-by-hop / destination options are privileged option */
                retv = -EPERM;
index 971ba60bf6e9ccf7dedde5b7e5486db8ef1dca6f..060d61202412c500020205508e874e7e1a63582f 100644 (file)
@@ -5,10 +5,20 @@
 menu "IPv6: Netfilter Configuration (EXPERIMENTAL)"
        depends on INET && IPV6 && NETFILTER && EXPERIMENTAL
 
-#tristate 'Connection tracking (required for masq/NAT)' CONFIG_IP6_NF_CONNTRACK
-#if [ "$CONFIG_IP6_NF_CONNTRACK" != "n" ]; then
-#  dep_tristate '  FTP protocol support' CONFIG_IP6_NF_FTP $CONFIG_IP6_NF_CONNTRACK
-#fi
+config NF_CONNTRACK_IPV6
+       tristate "IPv6 support for new connection tracking (EXPERIMENTAL)"
+       depends on EXPERIMENTAL && NF_CONNTRACK
+       ---help---
+         Connection tracking keeps a record of what packets have passed
+         through your machine, in order to figure out how they are related
+         into connections.
+
+         This is IPv6 support on Layer 3 independent connection tracking.
+         Layer 3 independent connection tracking is experimental scheme
+         which generalize ip_conntrack to support other layer 3 protocols.
+
+         To compile it as a module, choose M here.  If unsure, say N.
+
 config IP6_NF_QUEUE
        tristate "IP6 Userspace queueing via NETLINK (OBSOLETE)"
        ---help---
@@ -114,7 +124,6 @@ config IP6_NF_MATCH_OWNER
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-#  dep_tristate '  MAC address match support' CONFIG_IP6_NF_MATCH_MAC $CONFIG_IP6_NF_IPTABLES
 config IP6_NF_MATCH_MARK
        tristate "netfilter MARK match support"
        depends on IP6_NF_IPTABLES
@@ -170,15 +179,6 @@ config IP6_NF_MATCH_PHYSDEV
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-#  dep_tristate '  Multiple port match support' CONFIG_IP6_NF_MATCH_MULTIPORT $CONFIG_IP6_NF_IPTABLES
-#  dep_tristate '  TOS match support' CONFIG_IP6_NF_MATCH_TOS $CONFIG_IP6_NF_IPTABLES
-#  if [ "$CONFIG_IP6_NF_CONNTRACK" != "n" ]; then
-#    dep_tristate '  Connection state match support' CONFIG_IP6_NF_MATCH_STATE $CONFIG_IP6_NF_CONNTRACK $CONFIG_IP6_NF_IPTABLES 
-#  fi
-#  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#    dep_tristate '  Unclean match support (EXPERIMENTAL)' CONFIG_IP6_NF_MATCH_UNCLEAN $CONFIG_IP6_NF_IPTABLES
-#    dep_tristate '  Owner match support (EXPERIMENTAL)' CONFIG_IP6_NF_MATCH_OWNER $CONFIG_IP6_NF_IPTABLES
-#  fi
 # The targets
 config IP6_NF_FILTER
        tristate "Packet filtering"
@@ -220,12 +220,6 @@ config IP6_NF_TARGET_NFQUEUE
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-#  if [ "$CONFIG_IP6_NF_FILTER" != "n" ]; then
-#    dep_tristate '    REJECT target support' CONFIG_IP6_NF_TARGET_REJECT $CONFIG_IP6_NF_FILTER
-#    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#      dep_tristate '    MIRROR target support (EXPERIMENTAL)' CONFIG_IP6_NF_TARGET_MIRROR $CONFIG_IP6_NF_FILTER
-#    fi
-#  fi
 config IP6_NF_MANGLE
        tristate "Packet mangling"
        depends on IP6_NF_IPTABLES
@@ -236,7 +230,6 @@ config IP6_NF_MANGLE
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-#    dep_tristate '    TOS target support' CONFIG_IP6_NF_TARGET_TOS $CONFIG_IP_NF_MANGLE
 config IP6_NF_TARGET_MARK
        tristate "MARK target support"
        depends on IP6_NF_MANGLE
@@ -266,7 +259,6 @@ config IP6_NF_TARGET_HL
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-#dep_tristate '  LOG target support' CONFIG_IP6_NF_TARGET_LOG $CONFIG_IP6_NF_IPTABLES
 config IP6_NF_RAW
        tristate  'raw table support (required for TRACE)'
        depends on IP6_NF_IPTABLES
@@ -278,19 +270,5 @@ config IP6_NF_RAW
          If you want to compile it as a module, say M here and read
          <file:Documentation/modules.txt>.  If unsure, say `N'.
 
-config NF_CONNTRACK_IPV6
-       tristate "IPv6 support for new connection tracking (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && NF_CONNTRACK
-       ---help---
-         Connection tracking keeps a record of what packets have passed
-         through your machine, in order to figure out how they are related
-         into connections.
-
-         This is IPv6 support on Layer 3 independent connection tracking.
-         Layer 3 independent connection tracking is experimental scheme
-         which generalize ip_conntrack to support other layer 3 protocols.
-
-         To compile it as a module, choose M here.  If unsure, say N.
-
 endmenu
 
index e2c90b3a807456d96ff12a7abec32a9141ae5e5f..753a3ae8502b7e7c3ca31da99c08d64c655b3828 100644 (file)
@@ -339,8 +339,8 @@ extern unsigned long nf_ct_icmpv6_timeout;
 
 /* From nf_conntrack_frag6.c */
 extern unsigned long nf_ct_frag6_timeout;
-extern unsigned long nf_ct_frag6_low_thresh;
-extern unsigned long nf_ct_frag6_high_thresh;
+extern unsigned int nf_ct_frag6_low_thresh;
+extern unsigned int nf_ct_frag6_high_thresh;
 
 static struct ctl_table_header *nf_ct_ipv6_sysctl_header;
 
@@ -367,7 +367,7 @@ static ctl_table nf_ct_sysctl_table[] = {
                .data           = &nf_ct_frag6_low_thresh,
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
-               .proc_handler   = &proc_dointvec_jiffies,
+               .proc_handler   = &proc_dointvec,
        },
        {
                .ctl_name       = NET_NF_CONNTRACK_FRAG6_HIGH_THRESH,
@@ -375,7 +375,7 @@ static ctl_table nf_ct_sysctl_table[] = {
                .data           = &nf_ct_frag6_high_thresh,
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
-               .proc_handler   = &proc_dointvec_jiffies,
+               .proc_handler   = &proc_dointvec,
        },
         { .ctl_name = 0 }
 };
index 7640b9bb7694963e997e2dc34d912c37ad9290a5..c2c52af9e5602c4be485c5f4212c170c4e1b79a6 100644 (file)
@@ -55,9 +55,9 @@
 #define NF_CT_FRAG6_LOW_THRESH 196608  /* == 192*1024 */
 #define NF_CT_FRAG6_TIMEOUT IPV6_FRAG_TIMEOUT
 
-int nf_ct_frag6_high_thresh = 256*1024;
-int nf_ct_frag6_low_thresh = 192*1024;
-int nf_ct_frag6_timeout = IPV6_FRAG_TIMEOUT;
+unsigned int nf_ct_frag6_high_thresh = 256*1024;
+unsigned int nf_ct_frag6_low_thresh = 192*1024;
+unsigned long nf_ct_frag6_timeout = IPV6_FRAG_TIMEOUT;
 
 struct nf_ct_frag6_skb_cb
 {
@@ -190,8 +190,10 @@ static void nf_ct_frag6_secret_rebuild(unsigned long dummy)
 atomic_t nf_ct_frag6_mem = ATOMIC_INIT(0);
 
 /* Memory Tracking Functions. */
-static inline void frag_kfree_skb(struct sk_buff *skb)
+static inline void frag_kfree_skb(struct sk_buff *skb, unsigned int *work)
 {
+       if (work)
+               *work -= skb->truesize;
        atomic_sub(skb->truesize, &nf_ct_frag6_mem);
        if (NFCT_FRAG6_CB(skb)->orig)
                kfree_skb(NFCT_FRAG6_CB(skb)->orig);
@@ -199,8 +201,11 @@ static inline void frag_kfree_skb(struct sk_buff *skb)
        kfree_skb(skb);
 }
 
-static inline void frag_free_queue(struct nf_ct_frag6_queue *fq)
+static inline void frag_free_queue(struct nf_ct_frag6_queue *fq,
+                                  unsigned int *work)
 {
+       if (work)
+               *work -= sizeof(struct nf_ct_frag6_queue);
        atomic_sub(sizeof(struct nf_ct_frag6_queue), &nf_ct_frag6_mem);
        kfree(fq);
 }
@@ -218,7 +223,8 @@ static inline struct nf_ct_frag6_queue *frag_alloc_queue(void)
 /* Destruction primitives. */
 
 /* Complete destruction of fq. */
-static void nf_ct_frag6_destroy(struct nf_ct_frag6_queue *fq)
+static void nf_ct_frag6_destroy(struct nf_ct_frag6_queue *fq,
+                               unsigned int *work)
 {
        struct sk_buff *fp;
 
@@ -230,17 +236,17 @@ static void nf_ct_frag6_destroy(struct nf_ct_frag6_queue *fq)
        while (fp) {
                struct sk_buff *xp = fp->next;
 
-               frag_kfree_skb(fp);
+               frag_kfree_skb(fp, work);
                fp = xp;
        }
 
-       frag_free_queue(fq);
+       frag_free_queue(fq, work);
 }
 
-static __inline__ void fq_put(struct nf_ct_frag6_queue *fq)
+static __inline__ void fq_put(struct nf_ct_frag6_queue *fq, unsigned int *work)
 {
        if (atomic_dec_and_test(&fq->refcnt))
-               nf_ct_frag6_destroy(fq);
+               nf_ct_frag6_destroy(fq, work);
 }
 
 /* Kill fq entry. It is not destroyed immediately,
@@ -262,16 +268,21 @@ static void nf_ct_frag6_evictor(void)
 {
        struct nf_ct_frag6_queue *fq;
        struct list_head *tmp;
+       unsigned int work;
 
-       for (;;) {
-               if (atomic_read(&nf_ct_frag6_mem) <= nf_ct_frag6_low_thresh)
-                       return;
+       work = atomic_read(&nf_ct_frag6_mem);
+       if (work <= nf_ct_frag6_low_thresh)
+               return;
+
+       work -= nf_ct_frag6_low_thresh;
+       while (work > 0) {
                read_lock(&nf_ct_frag6_lock);
                if (list_empty(&nf_ct_frag6_lru_list)) {
                        read_unlock(&nf_ct_frag6_lock);
                        return;
                }
                tmp = nf_ct_frag6_lru_list.next;
+               BUG_ON(tmp == NULL);
                fq = list_entry(tmp, struct nf_ct_frag6_queue, lru_list);
                atomic_inc(&fq->refcnt);
                read_unlock(&nf_ct_frag6_lock);
@@ -281,7 +292,7 @@ static void nf_ct_frag6_evictor(void)
                        fq_kill(fq);
                spin_unlock(&fq->lock);
 
-               fq_put(fq);
+               fq_put(fq, &work);
        }
 }
 
@@ -298,7 +309,7 @@ static void nf_ct_frag6_expire(unsigned long data)
 
 out:
        spin_unlock(&fq->lock);
-       fq_put(fq);
+       fq_put(fq, NULL);
 }
 
 /* Creation primitives. */
@@ -318,7 +329,7 @@ static struct nf_ct_frag6_queue *nf_ct_frag6_intern(unsigned int hash,
                        atomic_inc(&fq->refcnt);
                        write_unlock(&nf_ct_frag6_lock);
                        fq_in->last_in |= COMPLETE;
-                       fq_put(fq_in);
+                       fq_put(fq_in, NULL);
                        return fq;
                }
        }
@@ -535,7 +546,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
                                fq->fragments = next;
 
                        fq->meat -= free_it->len;
-                       frag_kfree_skb(free_it);
+                       frag_kfree_skb(free_it, NULL);
                }
        }
 
@@ -811,7 +822,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
        if (nf_ct_frag6_queue(fq, clone, fhdr, nhoff) < 0) {
                spin_unlock(&fq->lock);
                DEBUGP("Can't insert skb to queue\n");
-               fq_put(fq);
+               fq_put(fq, NULL);
                goto ret_orig;
        }
 
@@ -822,7 +833,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
        }
        spin_unlock(&fq->lock);
 
-       fq_put(fq);
+       fq_put(fq, NULL);
        return ret_skb;
 
 ret_orig:
@@ -881,5 +892,6 @@ int nf_ct_frag6_init(void)
 void nf_ct_frag6_cleanup(void)
 {
        del_timer(&nf_ct_frag6_secret_timer);
+       nf_ct_frag6_low_thresh = 0;
        nf_ct_frag6_evictor();
 }
index 651c79b41eeb1500241532dda6cedc700e71ebc3..8e9628f1c4c5b4bc4f1b858c339950072ad50c7c 100644 (file)
@@ -298,13 +298,10 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
 static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
 {
        if ((raw6_sk(sk)->checksum || sk->sk_filter) && 
-           skb->ip_summed != CHECKSUM_UNNECESSARY) {
-               if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
-                       /* FIXME: increment a raw6 drops counter here */
-                       kfree_skb(skb);
-                       return 0;
-               }
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
+           skb_checksum_complete(skb)) {
+               /* FIXME: increment a raw6 drops counter here */
+               kfree_skb(skb);
+               return 0;
        }
 
        /* Charge it to the socket. */
@@ -337,32 +334,25 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
        if (!rp->checksum)
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
-       if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
-               if (skb->ip_summed == CHECKSUM_HW) {
-                       skb_postpull_rcsum(skb, skb->nh.raw,
-                                          skb->h.raw - skb->nh.raw);
+       if (skb->ip_summed == CHECKSUM_HW) {
+               skb_postpull_rcsum(skb, skb->nh.raw,
+                                  skb->h.raw - skb->nh.raw);
+               if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,
+                                    &skb->nh.ipv6h->daddr,
+                                    skb->len, inet->num, skb->csum))
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
-                       if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-                                           &skb->nh.ipv6h->daddr,
-                                           skb->len, inet->num, skb->csum)) {
-                               LIMIT_NETDEBUG(KERN_DEBUG "raw v6 hw csum failure.\n");
-                               skb->ip_summed = CHECKSUM_NONE;
-                       }
-               }
-               if (skb->ip_summed == CHECKSUM_NONE)
-                       skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-                                                    &skb->nh.ipv6h->daddr,
-                                                    skb->len, inet->num, 0);
        }
+       if (skb->ip_summed != CHECKSUM_UNNECESSARY)
+               skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
+                                            &skb->nh.ipv6h->daddr,
+                                            skb->len, inet->num, 0);
 
        if (inet->hdrincl) {
-               if (skb->ip_summed != CHECKSUM_UNNECESSARY &&
-                   (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
+               if (skb_checksum_complete(skb)) {
                        /* FIXME: increment a raw6 drops counter here */
                        kfree_skb(skb);
                        return 0;
                }
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
        }
 
        rawv6_rcv_skb(sk, skb);
@@ -407,7 +397,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
        if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
                err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        } else if (msg->msg_flags&MSG_TRUNC) {
-               if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))
+               if (__skb_checksum_complete(skb))
                        goto csum_copy_err;
                err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        } else {
index e4fe9ee484ddab3d0f0fee7e0153e8de4f14c4be..5d316cb72ec920f10d448eb69f7f31cd9a54bbd1 100644 (file)
@@ -74,7 +74,7 @@ struct ip6frag_skb_cb
 
 struct frag_queue
 {
-       struct frag_queue       *next;
+       struct hlist_node       list;
        struct list_head lru_list;              /* lru list member      */
 
        __u32                   id;             /* fragment id          */
@@ -95,14 +95,13 @@ struct frag_queue
 #define FIRST_IN               2
 #define LAST_IN                        1
        __u16                   nhoffset;
-       struct frag_queue       **pprev;
 };
 
 /* Hash table. */
 
 #define IP6Q_HASHSZ    64
 
-static struct frag_queue *ip6_frag_hash[IP6Q_HASHSZ];
+static struct hlist_head ip6_frag_hash[IP6Q_HASHSZ];
 static DEFINE_RWLOCK(ip6_frag_lock);
 static u32 ip6_frag_hash_rnd;
 static LIST_HEAD(ip6_frag_lru_list);
@@ -110,9 +109,7 @@ int ip6_frag_nqueues = 0;
 
 static __inline__ void __fq_unlink(struct frag_queue *fq)
 {
-       if(fq->next)
-               fq->next->pprev = fq->pprev;
-       *fq->pprev = fq->next;
+       hlist_del(&fq->list);
        list_del(&fq->lru_list);
        ip6_frag_nqueues--;
 }
@@ -163,28 +160,21 @@ static void ip6_frag_secret_rebuild(unsigned long dummy)
        get_random_bytes(&ip6_frag_hash_rnd, sizeof(u32));
        for (i = 0; i < IP6Q_HASHSZ; i++) {
                struct frag_queue *q;
+               struct hlist_node *p, *n;
 
-               q = ip6_frag_hash[i];
-               while (q) {
-                       struct frag_queue *next = q->next;
+               hlist_for_each_entry_safe(q, p, n, &ip6_frag_hash[i], list) {
                        unsigned int hval = ip6qhashfn(q->id,
                                                       &q->saddr,
                                                       &q->daddr);
 
                        if (hval != i) {
-                               /* Unlink. */
-                               if (q->next)
-                                       q->next->pprev = q->pprev;
-                               *q->pprev = q->next;
+                               hlist_del(&q->list);
 
                                /* Relink to new hash chain. */
-                               if ((q->next = ip6_frag_hash[hval]) != NULL)
-                                       q->next->pprev = &q->next;
-                               ip6_frag_hash[hval] = q;
-                               q->pprev = &ip6_frag_hash[hval];
-                       }
+                               hlist_add_head(&q->list,
+                                              &ip6_frag_hash[hval]);
 
-                       q = next;
+                       }
                }
        }
        write_unlock(&ip6_frag_lock);
@@ -337,10 +327,13 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
                                          struct frag_queue *fq_in)
 {
        struct frag_queue *fq;
+#ifdef CONFIG_SMP
+       struct hlist_node *n;
+#endif
 
        write_lock(&ip6_frag_lock);
 #ifdef CONFIG_SMP
-       for (fq = ip6_frag_hash[hash]; fq; fq = fq->next) {
+       hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
                if (fq->id == fq_in->id && 
                    ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
                    ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
@@ -358,10 +351,7 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
                atomic_inc(&fq->refcnt);
 
        atomic_inc(&fq->refcnt);
-       if((fq->next = ip6_frag_hash[hash]) != NULL)
-               fq->next->pprev = &fq->next;
-       ip6_frag_hash[hash] = fq;
-       fq->pprev = &ip6_frag_hash[hash];
+       hlist_add_head(&fq->list, &ip6_frag_hash[hash]);
        INIT_LIST_HEAD(&fq->lru_list);
        list_add_tail(&fq->lru_list, &ip6_frag_lru_list);
        ip6_frag_nqueues++;
@@ -401,10 +391,11 @@ static __inline__ struct frag_queue *
 fq_find(u32 id, struct in6_addr *src, struct in6_addr *dst)
 {
        struct frag_queue *fq;
+       struct hlist_node *n;
        unsigned int hash = ip6qhashfn(id, src, dst);
 
        read_lock(&ip6_frag_lock);
-       for(fq = ip6_frag_hash[hash]; fq; fq = fq->next) {
+       hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
                if (fq->id == id && 
                    ipv6_addr_equal(src, &fq->saddr) &&
                    ipv6_addr_equal(dst, &fq->daddr)) {
index f7f42c3e96cb537f5cd885610d00972916e6e591..a7a537b5059537bb7d7fd5291323277333c22cb7 100644 (file)
@@ -1701,10 +1701,8 @@ static void fib6_dump_end(struct netlink_callback *cb)
                fib6_walker_unlink(w);
                kfree(w);
        }
-       if (cb->args[1]) {
-               cb->done = (void*)cb->args[1];
-               cb->args[1] = 0;
-       }
+       cb->done = (void*)cb->args[1];
+       cb->args[1] = 0;
 }
 
 static int fib6_dump_done(struct netlink_callback *cb)
index d746d3b27efb7c84407ff432756e32132f7f49fa..62c0e5bd931c7aa458083b00e2d81850f8c1b4e0 100644 (file)
@@ -1401,20 +1401,18 @@ out:
 static int tcp_v6_checksum_init(struct sk_buff *skb)
 {
        if (skb->ip_summed == CHECKSUM_HW) {
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
                if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
-                                 &skb->nh.ipv6h->daddr,skb->csum))
+                                 &skb->nh.ipv6h->daddr,skb->csum)) {
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
                        return 0;
-               LIMIT_NETDEBUG(KERN_DEBUG "hw tcp v6 csum failed\n");
+               }
        }
+
+       skb->csum = ~tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
+                                 &skb->nh.ipv6h->daddr, 0);
+
        if (skb->len <= 76) {
-               if (tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
-                                &skb->nh.ipv6h->daddr,skb_checksum(skb, 0, skb->len, 0)))
-                       return -1;
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-       } else {
-               skb->csum = ~tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
-                                         &skb->nh.ipv6h->daddr,0);
+               return __skb_checksum_complete(skb);
        }
        return 0;
 }
@@ -1575,7 +1573,7 @@ static int tcp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
                goto discard_it;
 
        if ((skb->ip_summed != CHECKSUM_UNNECESSARY &&
-            tcp_v6_checksum_init(skb) < 0))
+            tcp_v6_checksum_init(skb)))
                goto bad_packet;
 
        th = skb->h.th;
index bf9519341fd30ad28a0b9652d09bcd7628765dc4..e671153b47b250b9a7d10b2500dc15101c010fc7 100644 (file)
@@ -248,7 +248,7 @@ try_again:
                err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,
                                              copied);
        } else if (msg->msg_flags&MSG_TRUNC) {
-               if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))
+               if (__skb_checksum_complete(skb))
                        goto csum_copy_err;
                err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,
                                              copied);
@@ -363,13 +363,10 @@ static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
                return -1;
        }
 
-       if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
-               if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
-                       UDP6_INC_STATS_BH(UDP_MIB_INERRORS);
-                       kfree_skb(skb);
-                       return 0;
-               }
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
+       if (skb_checksum_complete(skb)) {
+               UDP6_INC_STATS_BH(UDP_MIB_INERRORS);
+               kfree_skb(skb);
+               return 0;
        }
 
        if (sock_queue_rcv_skb(sk,skb)<0) {
@@ -491,13 +488,10 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
                uh = skb->h.uh;
        }
 
-       if (skb->ip_summed==CHECKSUM_HW) {
+       if (skb->ip_summed == CHECKSUM_HW &&
+           !csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
-               if (csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum)) {
-                       LIMIT_NETDEBUG(KERN_DEBUG "udp v6 hw csum failure.\n");
-                       skb->ip_summed = CHECKSUM_NONE;
-               }
-       }
+
        if (skb->ip_summed != CHECKSUM_UNNECESSARY)
                skb->csum = ~csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, 0);
 
@@ -521,8 +515,7 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
                if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
                        goto discard;
 
-               if (skb->ip_summed != CHECKSUM_UNNECESSARY &&
-                   (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))
+               if (skb_checksum_complete(skb))
                        goto discard;
                UDP6_INC_STATS_BH(UDP_MIB_NOPORTS);
 
index 59d02cbbeb9effd53158859aa522a7c73b581f5c..c3f0b07834537e3935615e35b7af3078ec975b04 100644 (file)
@@ -116,7 +116,9 @@ static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
        struct llc_sock* llc = llc_sk(sk);
        int rc = 0;
 
-       if (unlikely(llc_data_accept_state(llc->state) || llc->p_flag)) {
+       if (unlikely(llc_data_accept_state(llc->state) || 
+                    llc->remote_busy_flag ||
+                    llc->p_flag)) {
                long timeout = sock_sndtimeo(sk, noblock);
 
                rc = llc_ui_wait_for_busy_core(sk, timeout);
@@ -542,6 +544,7 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
                if (sk_wait_event(sk, &timeout,
                                  (sk->sk_shutdown & RCV_SHUTDOWN) ||
                                  (!llc_data_accept_state(llc->state) &&
+                                  !llc->remote_busy_flag &&
                                   !llc->p_flag)))
                        break;
                rc = -ERESTARTSYS;
index b0bcfb1f12dd49b90a69ab7967c050f3652e3472..8169f24ed33e51649c9c8c80f27f3fa9dc88c3a7 100644 (file)
@@ -866,7 +866,8 @@ int llc_conn_ac_send_ack_if_needed(struct sock *sk, struct sk_buff *skb)
                llc->ack_must_be_send = 1;
                llc->ack_pf = pf_bit & 1;
        }
-       if (((llc->vR - llc->first_pdu_Ns + 129) % 128) >= llc->npta) {
+       if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)
+                       % LLC_2_SEQ_NBR_MODULO) >= llc->npta) {
                llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);
                llc->ack_must_be_send   = 0;
                llc->ack_pf             = 0;
@@ -994,8 +995,8 @@ static int llc_conn_ac_inc_npta_value(struct sock *sk, struct sk_buff *skb)
                llc->dec_step = 0;
                llc->dec_cntr = llc->inc_cntr = 2;
                ++llc->npta;
-               if (llc->npta > 127)
-                       llc->npta = 127 ;
+               if (llc->npta > (u8) ~LLC_2_SEQ_NBR_MODULO)
+                       llc->npta = (u8) ~LLC_2_SEQ_NBR_MODULO;
        } else
                --llc->inc_cntr;
        return 0;
@@ -1065,9 +1066,10 @@ int llc_conn_ac_dec_tx_win_size(struct sock *sk, struct sk_buff *skb)
        struct llc_sock *llc = llc_sk(sk);
        u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q);
 
-       llc->k -= unacked_pdu;
-       if (llc->k < 2)
-               llc->k = 2;
+       if (llc->k - unacked_pdu < 1)
+               llc->k = 1;
+       else
+               llc->k -= unacked_pdu;
        return 0;
 }
 
@@ -1084,8 +1086,8 @@ int llc_conn_ac_inc_tx_win_size(struct sock *sk, struct sk_buff *skb)
        struct llc_sock *llc = llc_sk(sk);
 
        llc->k += 1;
-       if (llc->k > 128)
-               llc->k = 128 ;
+       if (llc->k > (u8) ~LLC_2_SEQ_NBR_MODULO)
+               llc->k = (u8) ~LLC_2_SEQ_NBR_MODULO;
        return 0;
 }
 
@@ -1309,7 +1311,7 @@ int llc_conn_ac_set_vs_nr(struct sock *sk, struct sk_buff *skb)
 
 static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb)
 {
-       llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128;
+       llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % LLC_2_SEQ_NBR_MODULO;
        return 0;
 }
 
index 9a67c796b385d4c7bca1c113f3bc5b13041bab6e..1da678303d78c5436c4e8bd6e1d76b5d95e43f43 100644 (file)
@@ -387,7 +387,7 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
 static void nf_ct_unlink_expect(struct nf_conntrack_expect *exp)
 {
        ASSERT_WRITE_LOCK(&nf_conntrack_lock);
-       NF_CT_ASSERT(!timer_pending(&exp_timeout));
+       NF_CT_ASSERT(!timer_pending(&exp->timeout));
        list_del(&exp->list);
        NF_CT_STAT_INC(expect_delete);
        exp->master->expecting--;
@@ -1395,6 +1395,13 @@ void nf_conntrack_cleanup(void)
        kmem_cache_destroy(nf_conntrack_expect_cachep);
        free_conntrack_hash(nf_conntrack_hash, nf_conntrack_vmalloc,
                            nf_conntrack_htable_size);
+
+       /* free l3proto protocol tables */
+       for (i = 0; i < PF_MAX; i++)
+               if (nf_ct_protos[i]) {
+                       kfree(nf_ct_protos[i]);
+                       nf_ct_protos[i] = NULL;
+               }
 }
 
 static struct list_head *alloc_hashtable(int size, int *vmalloced)
index 83d90dd624f05638fd0aac1e99e6583c4eeb69e2..5a6fcf349bdfacfadf38e990db70f5422023226a 100644 (file)
@@ -779,6 +779,7 @@ static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] =
 {
        [TH_SYN]                        = 1,
        [TH_SYN|TH_ACK]                 = 1,
+       [TH_SYN|TH_PUSH]                = 1,
        [TH_SYN|TH_ACK|TH_PUSH]         = 1,
        [TH_RST]                        = 1,
        [TH_RST|TH_ACK]                 = 1,
@@ -969,6 +970,12 @@ static int tcp_packet(struct nf_conn *conntrack,
                                conntrack->timeout.function((unsigned long)
                                                            conntrack);
                        return -NF_REPEAT;
+               } else {
+                       write_unlock_bh(&tcp_lock);
+                       if (LOG_INVALID(IPPROTO_TCP))
+                               nf_log_packet(pf, 0, skb, NULL, NULL,
+                                             NULL, "nf_ct_tcp: invalid SYN");
+                       return -NF_ACCEPT;
                }
        case TCP_CONNTRACK_CLOSE:
                if (index == TCP_RST_SET
index 45224db4fe2f05e9aa945f0da59c4dd8eeb53b23..5af381f9fe3da9b30729b01d1f5a2ebbf4328696 100644 (file)
@@ -694,7 +694,7 @@ static int init_or_cleanup(int init)
  cleanup_proc_stat:
 #endif
 #ifdef CONFIG_PROC_FS
-       proc_net_remove("nf_conntrack_stat");
+       remove_proc_entry("nf_conntrack", proc_net_stat);
  cleanup_proc_exp:
        proc_net_remove("nf_conntrack_expect");
  cleanup_proc:
index 83f4c53030fca5175a1cffcd8ea98b27e6c18e47..a60c59b97631abbb51dda4268dc50fa000445fb4 100644 (file)
@@ -223,6 +223,12 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
                 NFNL_SUBSYS_ID(nlh->nlmsg_type),
                 NFNL_MSG_TYPE(nlh->nlmsg_type));
 
+       if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) {
+               DEBUGP("missing CAP_NET_ADMIN\n");
+               *errp = -EPERM;
+               return -1;
+       }
+
        /* Only requests are handled by kernel now. */
        if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) {
                DEBUGP("received non-request message\n");
@@ -240,15 +246,12 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
        ss = nfnetlink_get_subsys(type);
        if (!ss) {
 #ifdef CONFIG_KMOD
-               if (cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) {
-                       /* don't call nfnl_shunlock, since it would reenter
-                        * with further packet processing */
-                       up(&nfnl_sem);
-                       request_module("nfnetlink-subsys-%d",
-                                       NFNL_SUBSYS_ID(type));
-                       nfnl_shlock();
-                       ss = nfnetlink_get_subsys(type);
-               }
+               /* don't call nfnl_shunlock, since it would reenter
+                * with further packet processing */
+               up(&nfnl_sem);
+               request_module("nfnetlink-subsys-%d", NFNL_SUBSYS_ID(type));
+               nfnl_shlock();
+               ss = nfnetlink_get_subsys(type);
                if (!ss)
 #endif
                        goto err_inval;
@@ -260,13 +263,6 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
                goto err_inval;
        }
 
-       if (nc->cap_required && 
-           !cap_raised(NETLINK_CB(skb).eff_cap, nc->cap_required)) {
-               DEBUGP("permission denied for type %d\n", type);
-               *errp = -EPERM;
-               return -1;
-       }
-
        {
                u_int16_t attr_count = 
                        ss->cb[NFNL_MSG_TYPE(nlh->nlmsg_type)].attr_count;
index d194676f36558848ac00012c2e394c04873e8a9b..cba63729313d5690ccc724c505e8d967ac544618 100644 (file)
@@ -862,11 +862,9 @@ out_put:
 
 static struct nfnl_callback nfulnl_cb[NFULNL_MSG_MAX] = {
        [NFULNL_MSG_PACKET]     = { .call = nfulnl_recv_unsupp,
-                                   .attr_count = NFULA_MAX,
-                                   .cap_required = CAP_NET_ADMIN, },
+                                   .attr_count = NFULA_MAX, },
        [NFULNL_MSG_CONFIG]     = { .call = nfulnl_recv_config,
-                                   .attr_count = NFULA_CFG_MAX,
-                                   .cap_required = CAP_NET_ADMIN },
+                                   .attr_count = NFULA_CFG_MAX, },
 };
 
 static struct nfnetlink_subsystem nfulnl_subsys = {
index f065a6c949532cc187b4ec584c5f32c2f928770a..f28460b61e47cd66649044f961011955dff39800 100644 (file)
@@ -931,14 +931,11 @@ out_put:
 
 static struct nfnl_callback nfqnl_cb[NFQNL_MSG_MAX] = {
        [NFQNL_MSG_PACKET]      = { .call = nfqnl_recv_unsupp,
-                                   .attr_count = NFQA_MAX,
-                                   .cap_required = CAP_NET_ADMIN },
+                                   .attr_count = NFQA_MAX, },
        [NFQNL_MSG_VERDICT]     = { .call = nfqnl_recv_verdict,
-                                   .attr_count = NFQA_MAX,
-                                   .cap_required = CAP_NET_ADMIN },
+                                   .attr_count = NFQA_MAX, },
        [NFQNL_MSG_CONFIG]      = { .call = nfqnl_recv_config,
-                                   .attr_count = NFQA_CFG_MAX,
-                                   .cap_required = CAP_NET_ADMIN },
+                                   .attr_count = NFQA_CFG_MAX, },
 };
 
 static struct nfnetlink_subsystem nfqnl_subsys = {
index 122c086ee2dbfc00f3cff0a0813919fb303ff03f..dbe6105e83a54e1f9ce66b4466a2863e0d7f155f 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/in.h>
 #include <linux/in6.h>
 #include <linux/icmp.h>
+#include <linux/skbuff.h>
 #include <net/sock.h>
 #include <net/ip.h>
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
@@ -475,15 +476,11 @@ void rxrpc_trans_receive_packet(struct rxrpc_transport *trans)
 
                /* we'll probably need to checksum it (didn't call
                 * sock_recvmsg) */
-               if (pkt->ip_summed != CHECKSUM_UNNECESSARY) {
-                       if ((unsigned short)
-                           csum_fold(skb_checksum(pkt, 0, pkt->len,
-                                                  pkt->csum))) {
-                               kfree_skb(pkt);
-                               rxrpc_krxiod_queue_transport(trans);
-                               _leave(" CSUM failed");
-                               return;
-                       }
+               if (skb_checksum_complete(pkt)) {
+                       kfree_skb(pkt);
+                       rxrpc_krxiod_queue_transport(trans);
+                       _leave(" CSUM failed");
+                       return;
                }
 
                addr = pkt->nh.iph->saddr;
index 7f34e7fd767cd9e123186712779b0c0335f20ee6..55cd5327fbd79e4c75ff45152e0c0c20d5b1552d 100644 (file)
@@ -40,9 +40,10 @@ config NET_SCHED
          The available schedulers are listed in the following questions; you
          can say Y to as many as you like. If unsure, say N now.
 
+if NET_SCHED
+
 choice
        prompt "Packet scheduler clock source"
-       depends on NET_SCHED
        default NET_SCH_CLK_JIFFIES
        ---help---
          Packet schedulers need a monotonic clock that increments at a static
@@ -98,11 +99,9 @@ config NET_SCH_CLK_CPU
 endchoice
 
 comment "Queueing/Scheduling"
-       depends on NET_SCHED
 
 config NET_SCH_CBQ
        tristate "Class Based Queueing (CBQ)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Class-Based Queueing (CBQ) packet
          scheduling algorithm. This algorithm classifies the waiting packets
@@ -120,7 +119,6 @@ config NET_SCH_CBQ
 
 config NET_SCH_HTB
        tristate "Hierarchical Token Bucket (HTB)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Hierarchical Token Buckets (HTB)
          packet scheduling algorithm. See
@@ -135,7 +133,6 @@ config NET_SCH_HTB
 
 config NET_SCH_HFSC
        tristate "Hierarchical Fair Service Curve (HFSC)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Hierarchical Fair Service Curve
          (HFSC) packet scheduling algorithm.
@@ -145,7 +142,7 @@ config NET_SCH_HFSC
 
 config NET_SCH_ATM
        tristate "ATM Virtual Circuits (ATM)"
-       depends on NET_SCHED && ATM
+       depends on ATM
        ---help---
          Say Y here if you want to use the ATM pseudo-scheduler.  This
          provides a framework for invoking classifiers, which in turn
@@ -159,7 +156,6 @@ config NET_SCH_ATM
 
 config NET_SCH_PRIO
        tristate "Multi Band Priority Queueing (PRIO)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use an n-band priority queue packet
          scheduler.
@@ -169,7 +165,6 @@ config NET_SCH_PRIO
 
 config NET_SCH_RED
        tristate "Random Early Detection (RED)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Random Early Detection (RED)
          packet scheduling algorithm.
@@ -181,7 +176,6 @@ config NET_SCH_RED
 
 config NET_SCH_SFQ
        tristate "Stochastic Fairness Queueing (SFQ)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Stochastic Fairness Queueing (SFQ)
          packet scheduling algorithm .
@@ -193,7 +187,6 @@ config NET_SCH_SFQ
 
 config NET_SCH_TEQL
        tristate "True Link Equalizer (TEQL)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the True Link Equalizer (TLE) packet
          scheduling algorithm. This queueing discipline allows the combination
@@ -206,7 +199,6 @@ config NET_SCH_TEQL
 
 config NET_SCH_TBF
        tristate "Token Bucket Filter (TBF)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Token Bucket Filter (TBF) packet
          scheduling algorithm.
@@ -218,7 +210,6 @@ config NET_SCH_TBF
 
 config NET_SCH_GRED
        tristate "Generic Random Early Detection (GRED)"
-       depends on NET_SCHED
        ---help---
          Say Y here if you want to use the Generic Random Early Detection
          (GRED) packet scheduling algorithm for some of your network devices
@@ -230,7 +221,6 @@ config NET_SCH_GRED
 
 config NET_SCH_DSMARK
        tristate "Differentiated Services marker (DSMARK)"
-       depends on NET_SCHED
        ---help---
          Say Y if you want to schedule packets according to the
          Differentiated Services architecture proposed in RFC 2475.
@@ -242,7 +232,6 @@ config NET_SCH_DSMARK
 
 config NET_SCH_NETEM
        tristate "Network emulator (NETEM)"
-       depends on NET_SCHED
        ---help---
          Say Y if you want to emulate network delay, loss, and packet
          re-ordering. This is often useful to simulate networks when
@@ -255,7 +244,6 @@ config NET_SCH_NETEM
 
 config NET_SCH_INGRESS
        tristate "Ingress Qdisc"
-       depends on NET_SCHED 
        ---help---
          Say Y here if you want to use classifiers for incoming packets.
          If unsure, say Y.
@@ -264,14 +252,12 @@ config NET_SCH_INGRESS
          module will be called sch_ingress.
 
 comment "Classification"
-       depends on NET_SCHED
 
 config NET_CLS
        boolean
 
 config NET_CLS_BASIC
        tristate "Elementary classification (BASIC)"
-       depends NET_SCHED
        select NET_CLS
        ---help---
          Say Y here if you want to be able to classify packets using
@@ -282,7 +268,6 @@ config NET_CLS_BASIC
 
 config NET_CLS_TCINDEX
        tristate "Traffic-Control Index (TCINDEX)"
-       depends NET_SCHED
        select NET_CLS
        ---help---
          Say Y here if you want to be able to classify packets based on
@@ -294,7 +279,6 @@ config NET_CLS_TCINDEX
 
 config NET_CLS_ROUTE4
        tristate "Routing decision (ROUTE)"
-       depends NET_SCHED
        select NET_CLS_ROUTE
        select NET_CLS
        ---help---
@@ -306,11 +290,9 @@ config NET_CLS_ROUTE4
 
 config NET_CLS_ROUTE
        bool
-       default n
 
 config NET_CLS_FW
        tristate "Netfilter mark (FW)"
-       depends NET_SCHED
        select NET_CLS
        ---help---
          If you say Y here, you will be able to classify packets
@@ -321,7 +303,6 @@ config NET_CLS_FW
 
 config NET_CLS_U32
        tristate "Universal 32bit comparisons w/ hashing (U32)"
-       depends NET_SCHED
        select NET_CLS
        ---help---
          Say Y here to be able to classify packetes using a universal
@@ -345,7 +326,6 @@ config CLS_U32_MARK
 
 config NET_CLS_RSVP
        tristate "IPv4 Resource Reservation Protocol (RSVP)"
-       depends on NET_SCHED
        select NET_CLS
        select NET_ESTIMATOR
        ---help---
@@ -361,7 +341,6 @@ config NET_CLS_RSVP
 
 config NET_CLS_RSVP6
        tristate "IPv6 Resource Reservation Protocol (RSVP6)"
-       depends on NET_SCHED
        select NET_CLS
        select NET_ESTIMATOR
        ---help---
@@ -377,7 +356,6 @@ config NET_CLS_RSVP6
 
 config NET_EMATCH
        bool "Extended Matches"
-       depends NET_SCHED
        select NET_CLS
        ---help---
          Say Y here if you want to use extended matches on top of classifiers
@@ -456,7 +434,7 @@ config NET_EMATCH_TEXT
 
 config NET_CLS_ACT
        bool "Actions"
-       depends on EXPERIMENTAL && NET_SCHED
+       depends on EXPERIMENTAL
        select NET_ESTIMATOR
        ---help---
          Say Y here if you want to use traffic control actions. Actions
@@ -539,7 +517,7 @@ config NET_ACT_SIMP
 
 config NET_CLS_POLICE
        bool "Traffic Policing (obsolete)"
-       depends on NET_SCHED && NET_CLS_ACT!=y
+       depends on NET_CLS_ACT!=y
        select NET_ESTIMATOR
        ---help---
          Say Y here if you want to do traffic policing, i.e. strict
@@ -549,7 +527,7 @@ config NET_CLS_POLICE
 
 config NET_CLS_IND
        bool "Incoming device classification"
-       depends on NET_SCHED && (NET_CLS_U32 || NET_CLS_FW)
+       depends on NET_CLS_U32 || NET_CLS_FW
        ---help---
          Say Y here to extend the u32 and fw classifier to support
          classification based on the incoming device. This option is
@@ -557,11 +535,12 @@ config NET_CLS_IND
 
 config NET_ESTIMATOR
        bool "Rate estimator"
-       depends on NET_SCHED
        ---help---
          Say Y here to allow using rate estimators to estimate the current
          rate-of-flow for network devices, queues, etc. This module is
          automaticaly selected if needed but can be selected manually for
          statstical purposes.
 
+endif # NET_SCHED
+
 endmenu
index 8c8ddf7f9b61c7c9ca7a804f8cbf8101fc151aa9..dec68a60477310c700dfdec911cc2ebcd719218b 100644 (file)
@@ -128,9 +128,29 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
         */
        asoc->max_burst = sctp_max_burst;
 
-       /* Copy things from the endpoint.  */
+       /* initialize association timers */
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_NONE] = 0;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] = asoc->rto_initial;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = asoc->rto_initial;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = asoc->rto_initial;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0;
+
+       /* sctpimpguide Section 2.12.2
+        * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the
+        * recommended value of 5 times 'RTO.Max'.
+        */
+        asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
+               = 5 * asoc->rto_max;
+
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] =
+               SCTP_DEFAULT_TIMEOUT_SACK;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] =
+               sp->autoclose * HZ;
+       
+       /* Initilizes the timers */
        for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) {
-               asoc->timeouts[i] = ep->timeouts[i];
                init_timer(&asoc->timers[i]);
                asoc->timers[i].function = sctp_timer_events[i];
                asoc->timers[i].data = (unsigned long) asoc;
@@ -157,10 +177,10 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
         * RFC 6 - A SCTP receiver MUST be able to receive a minimum of
         * 1500 bytes in one SCTP packet.
         */
-       if (sk->sk_rcvbuf < SCTP_DEFAULT_MINWINDOW)
+       if ((sk->sk_rcvbuf/2) < SCTP_DEFAULT_MINWINDOW)
                asoc->rwnd = SCTP_DEFAULT_MINWINDOW;
        else
-               asoc->rwnd = sk->sk_rcvbuf;
+               asoc->rwnd = sk->sk_rcvbuf/2;
 
        asoc->a_rwnd = asoc->rwnd;
 
@@ -172,6 +192,9 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
        /* Set the sndbuf size for transmit.  */
        asoc->sndbuf_used = 0;
 
+       /* Initialize the receive memory counter */
+       atomic_set(&asoc->rmem_alloc, 0);
+
        init_waitqueue_head(&asoc->wait);
 
        asoc->c.my_vtag = sctp_generate_tag(ep);
@@ -380,6 +403,8 @@ static void sctp_association_destroy(struct sctp_association *asoc)
                spin_unlock_bh(&sctp_assocs_id_lock);
        }
 
+       BUG_TRAP(!atomic_read(&asoc->rmem_alloc));
+
        if (asoc->base.malloced) {
                kfree(asoc);
                SCTP_DBG_OBJCNT_DEC(assoc);
index 96984f7a2d697ca0e847f6ab9af3443dacc66389..67bd53070ee0b31d0babb2221ccd57e03f81124b 100644 (file)
@@ -70,7 +70,6 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
                                                struct sock *sk,
                                                gfp_t gfp)
 {
-       struct sctp_sock *sp = sctp_sk(sk);
        memset(ep, 0, sizeof(struct sctp_endpoint));
 
        /* Initialize the base structure. */
@@ -100,33 +99,14 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
        /* Create the lists of associations.  */
        INIT_LIST_HEAD(&ep->asocs);
 
-       /* Set up the base timeout information.  */
-       ep->timeouts[SCTP_EVENT_TIMEOUT_NONE] = 0;
-       ep->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] =
-               msecs_to_jiffies(sp->rtoinfo.srto_initial);
-       ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] =
-               msecs_to_jiffies(sp->rtoinfo.srto_initial);
-       ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] =
-               msecs_to_jiffies(sp->rtoinfo.srto_initial);
-       ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0;
-       ep->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0;
-
-       /* sctpimpguide-05 Section 2.12.2
-        * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the
-        * recommended value of 5 times 'RTO.Max'.
-        */
-        ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
-               = 5 * msecs_to_jiffies(sp->rtoinfo.srto_max);
-
-       ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0;
-       ep->timeouts[SCTP_EVENT_TIMEOUT_SACK] = sctp_sack_timeout;
-       ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ;
-
        /* Use SCTP specific send buffer space queues.  */
        ep->sndbuf_policy = sctp_sndbuf_policy;
        sk->sk_write_space = sctp_write_space;
        sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
 
+       /* Get the receive buffer policy for this endpoint */
+       ep->rcvbuf_policy = sctp_rcvbuf_policy;
+
        /* Initialize the secret key used with cookie. */
        get_random_bytes(&ep->secret_key[0], SCTP_SECRET_SIZE);
        ep->last_key = ep->current_key = 0;
index 28f32243397f3b1b9755f42fcc70fa824d92dea0..b24ff2c1aef510ce9d4be716b19caa504baf08a9 100644 (file)
@@ -100,21 +100,6 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb)
        return 0;
 }
 
-/* The free routine for skbuffs that sctp receives */
-static void sctp_rfree(struct sk_buff *skb)
-{
-       atomic_sub(sizeof(struct sctp_chunk),&skb->sk->sk_rmem_alloc);
-       sock_rfree(skb);
-}
-
-/* The ownership wrapper routine to do receive buffer accounting */
-static void sctp_rcv_set_owner_r(struct sk_buff *skb, struct sock *sk)
-{
-       skb_set_owner_r(skb,sk);
-       skb->destructor = sctp_rfree;
-       atomic_add(sizeof(struct sctp_chunk),&sk->sk_rmem_alloc);
-}
-
 struct sctp_input_cb {
        union {
                struct inet_skb_parm    h4;
@@ -217,9 +202,6 @@ int sctp_rcv(struct sk_buff *skb)
                rcvr = &ep->base;
        }
 
-       if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
-               goto discard_release;
-
        /*
         * RFC 2960, 8.4 - Handle "Out of the blue" Packets.
         * An SCTP packet is called an "out of the blue" (OOTB)
@@ -256,8 +238,6 @@ int sctp_rcv(struct sk_buff *skb)
        }
        SCTP_INPUT_CB(skb)->chunk = chunk;
 
-       sctp_rcv_set_owner_r(skb,sk);
-
        /* Remember what endpoint is to handle this packet. */
        chunk->rcvr = rcvr;
 
index 26de4d3e1bd9cab236d563b4f17b3bbeb2be1617..f775d78aa59d3402ea467331c301e66acfdfd26e 100644 (file)
@@ -530,6 +530,9 @@ static void sctp_v4_get_saddr(struct sctp_association *asoc,
 {
        struct rtable *rt = (struct rtable *)dst;
 
+       if (!asoc)
+               return;
+
        if (rt) {
                saddr->v4.sin_family = AF_INET;
                saddr->v4.sin_port = asoc->base.bind_addr.port;  
@@ -1047,6 +1050,9 @@ SCTP_STATIC __init int sctp_init(void)
        /* Sendbuffer growth        - do per-socket accounting */
        sctp_sndbuf_policy              = 0;
 
+       /* Rcvbuffer growth         - do per-socket accounting */
+       sctp_rcvbuf_policy              = 0;
+
        /* HB.interval              - 30 seconds */
        sctp_hb_interval                = SCTP_DEFAULT_TIMEOUT_HEARTBEAT;
 
index f84173ea8ec165882fdc09ed0e209924a3693dca..823947170a335bac4dd074b654be41fe81a0f2fa 100644 (file)
@@ -385,7 +385,7 @@ sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = {
        NULL,
        sctp_generate_t4_rto_event,
        sctp_generate_t5_shutdown_guard_event,
-       sctp_generate_heartbeat_event,
+       NULL,
        sctp_generate_sack_event,
        sctp_generate_autoclose_event,
 };
@@ -689,9 +689,9 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds,
                 * increased due to timer expirations.
                 */
                asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] =
-                       asoc->ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT];
+                                               asoc->rto_initial;
                asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] =
-                       asoc->ep->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE];
+                                               asoc->rto_initial;
        }
 
        if (sctp_state(asoc, ESTABLISHED) ||
index 505c7de10c503f349cf850eb18c2f9faca07c132..475bfb4972d9ff9a3a4a610877f847031e48c161 100644 (file)
@@ -5160,6 +5160,8 @@ static int sctp_eat_data(const struct sctp_association *asoc,
        sctp_verb_t deliver;
        int tmp;
        __u32 tsn;
+       int account_value;
+       struct sock *sk = asoc->base.sk;
 
        data_hdr = chunk->subh.data_hdr = (sctp_datahdr_t *)chunk->skb->data;
        skb_pull(chunk->skb, sizeof(sctp_datahdr_t));
@@ -5169,6 +5171,26 @@ static int sctp_eat_data(const struct sctp_association *asoc,
 
        /* ASSERT:  Now skb->data is really the user data.  */
 
+       /*
+        * if we are established, and we have used up our receive
+        * buffer memory, drop the frame
+        */
+       if (asoc->state == SCTP_STATE_ESTABLISHED) {
+               /*
+                * If the receive buffer policy is 1, then each
+                * association can allocate up to sk_rcvbuf bytes
+                * otherwise, all the associations in aggregate
+                * may allocate up to sk_rcvbuf bytes
+                */
+               if (asoc->ep->rcvbuf_policy)
+                       account_value = atomic_read(&asoc->rmem_alloc);
+               else
+                       account_value = atomic_read(&sk->sk_rmem_alloc);
+
+               if (account_value > sk->sk_rcvbuf)
+                       return SCTP_IERROR_IGNORE_TSN;
+       }
+
        /* Process ECN based congestion.
         *
         * Since the chunk structure is reused for all chunks within
index b529af5e6f2a043515de3fa7a2c80c7b0d54e43e..abab81f3818f1a4c77742b315ad943853ad062ce 100644 (file)
@@ -1932,7 +1932,6 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
        if (copy_from_user(&sp->autoclose, optval, optlen))
                return -EFAULT;
 
-       sp->ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ;
        return 0;
 }
 
@@ -5115,8 +5114,10 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
                event = sctp_skb2event(skb);
                if (event->asoc == assoc) {
+                       sock_rfree(skb);
                        __skb_unlink(skb, &oldsk->sk_receive_queue);
                        __skb_queue_tail(&newsk->sk_receive_queue, skb);
+                       skb_set_owner_r(skb, newsk);
                }
        }
 
@@ -5144,8 +5145,10 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
                sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
                        event = sctp_skb2event(skb);
                        if (event->asoc == assoc) {
+                               sock_rfree(skb);
                                __skb_unlink(skb, &oldsp->pd_lobby);
                                __skb_queue_tail(queue, skb);
+                               skb_set_owner_r(skb, newsk);
                        }
                }
 
index 75b28dd634fe3e0c06b0a556716b7c4755b7c816..fcd7096c953d5d5698b3ce456f3512915b66c304 100644 (file)
@@ -120,6 +120,14 @@ static ctl_table sctp_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
+       {
+               .ctl_name       = NET_SCTP_RCVBUF_POLICY,
+               .procname       = "rcvbuf_policy",
+               .data           = &sctp_rcvbuf_policy,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
        {
                .ctl_name       = NET_SCTP_PATH_MAX_RETRANS,
                .procname       = "path_max_retrans",
index e049f41faa47cbcd7af477909b977c806f667685..ba97f974f57c3bb8c5109d547e9f9644a9609d26 100644 (file)
@@ -52,19 +52,6 @@ static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
                                       struct sctp_association *asoc);
 static void sctp_ulpevent_release_data(struct sctp_ulpevent *event);
 
-/* Stub skb destructor.  */
-static void sctp_stub_rfree(struct sk_buff *skb)
-{
-/* WARNING:  This function is just a warning not to use the
- * skb destructor.  If the skb is shared, we may get the destructor
- * callback on some processor that does not own the sock_lock.  This
- * was occuring with PACKET socket applications that were monitoring
- * our skbs.   We can't take the sock_lock, because we can't risk
- * recursing if we do really own the sock lock.  Instead, do all
- * of our rwnd manipulation while we own the sock_lock outright.
- */
-}
-
 /* Initialize an ULP event from an given skb.  */
 SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags)
 {
@@ -111,15 +98,19 @@ static inline void sctp_ulpevent_set_owner(struct sctp_ulpevent *event,
         */
        sctp_association_hold((struct sctp_association *)asoc);
        skb = sctp_event2skb(event);
-       skb->sk = asoc->base.sk;
        event->asoc = (struct sctp_association *)asoc;
-       skb->destructor = sctp_stub_rfree;
+       atomic_add(skb->truesize, &event->asoc->rmem_alloc);
+       skb_set_owner_r(skb, asoc->base.sk);
 }
 
 /* A simple destructor to give up the reference to the association. */
 static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event)
 {
-       sctp_association_put(event->asoc);
+       struct sctp_association *asoc = event->asoc;
+       struct sk_buff *skb = sctp_event2skb(event);
+
+       atomic_sub(skb->truesize, &asoc->rmem_alloc);
+       sctp_association_put(asoc);
 }
 
 /* Create and initialize an SCTP_ASSOC_CHANGE event.
@@ -922,7 +913,6 @@ done:
 /* Free a ulpevent that has an owner.  It includes releasing the reference
  * to the owner, updating the rwnd in case of a DATA event and freeing the
  * skb.
- * See comments in sctp_stub_rfree().
  */
 void sctp_ulpevent_free(struct sctp_ulpevent *event)
 {
index 8f97e90f36c8bb18b8ca403547fa0a4339d930d3..eb330d4f66d6ce79afb9a7badcc0706429abc127 100644 (file)
@@ -6,6 +6,9 @@
  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  */
 
+#include <linux/compiler.h>
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
 #include <linux/types.h>
 #include <linux/pagemap.h>
 #include <linux/udp.h>
@@ -165,6 +168,8 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
                return -1;
        if ((unsigned short)csum_fold(desc.csum))
                return -1;
+       if (unlikely(skb->ip_summed == CHECKSUM_HW))
+               netdev_rx_csum_fault(skb->dev);
        return 0;
 no_checksum:
        if (xdr_partial_copy_from_skb(xdr, 0, &desc, skb_read_bits) < 0)
index f16e7cdd6150a811f9523ca311de6b46c47f63ef..c6a51911e71e082a232f73444b3c36deb42a0d08 100644 (file)
@@ -623,12 +623,9 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
                /* we can use it in-place */
                rqstp->rq_arg.head[0].iov_base = skb->data + sizeof(struct udphdr);
                rqstp->rq_arg.head[0].iov_len = len;
-               if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
-                       if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
-                               skb_free_datagram(svsk->sk_sk, skb);
-                               return 0;
-                       }
-                       skb->ip_summed = CHECKSUM_UNNECESSARY;
+               if (skb_checksum_complete(skb)) {
+                       skb_free_datagram(svsk->sk_sk, skb);
+                       return 0;
                }
                rqstp->rq_skbuff = skb;
        }
@@ -1181,6 +1178,7 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
        arg->tail[0].iov_len = 0;
 
        try_to_freeze();
+       cond_resched();
        if (signalled())
                return -EINTR;
 
index 8aaf74e64183ff46972acb0ac1d312aed4c16bfb..2f45fd2969d09080c37e3b1b150179714c886602 100755 (executable)
@@ -117,6 +117,8 @@ use strict;
 # struct my_struct {
 #     int a;
 #     int b;
+# /* private: */
+#     int c;
 # };
 #
 # All descriptions can be multiline, except the short function description.
@@ -1304,6 +1306,12 @@ sub dump_struct($$) {
        # ignore embedded structs or unions
        $members =~ s/{.*?}//g;
 
+       # ignore members marked private:
+       $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
+       $members =~ s/\/\*.*?private:.*//gos;
+       # strip comments:
+       $members =~ s/\/\*.*?\*\///gos;
+
        create_parameterlist($members, ';', $file);
 
        output_declaration($declaration_name,
@@ -1329,6 +1337,7 @@ sub dump_enum($$) {
     my $x = shift;
     my $file = shift;
 
+    $x =~ s@/\*.*?\*/@@gos;    # strip comments.
     if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
         $declaration_name = $1;
         my $members = $2;
@@ -1365,6 +1374,7 @@ sub dump_typedef($$) {
     my $x = shift;
     my $file = shift;
 
+    $x =~ s@/\*.*?\*/@@gos;    # strip comments.
     while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
         $x =~ s/\(*.\)\s*;$/;/;
        $x =~ s/\[*.\]\s*;$/;/;
@@ -1420,7 +1430,7 @@ sub create_parameterlist($$$) {
            $type = $arg;
            $type =~ s/([^\(]+\(\*)$param/$1/;
            push_parameter($param, $type, $file);
-       } else {
+       } elsif ($arg) {
            $arg =~ s/\s*:\s*/:/g;
            $arg =~ s/\s*\[/\[/g;
 
@@ -1628,7 +1638,6 @@ sub process_state3_type($$) {
     my $x = shift;
     my $file = shift;
 
-    $x =~ s@/\*.*?\*/@@gos;    # strip comments.
     $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
     $x =~ s@^\s+@@gos; # strip leading spaces
     $x =~ s@\s+$@@gos; # strip trailing spaces
index d1f9da498729c96040a477311e7c67cc94d3fc99..c96c8a2aa1c2a68f35c52aa56f5d1dbbb2a82bd9 100644 (file)
@@ -275,9 +275,9 @@ static int pxa2xx_ac97_do_resume(snd_card_t *card)
        return 0;
 }
 
-static int pxa2xx_ac97_suspend(struct device *_dev, pm_message_t state)
+static int pxa2xx_ac97_suspend(struct platform_device *dev, pm_message_t state)
 {
-       snd_card_t *card = dev_get_drvdata(_dev);
+       snd_card_t *card = platform_get_drvdata(dev);
        int ret = 0;
 
        if (card)
@@ -286,9 +286,9 @@ static int pxa2xx_ac97_suspend(struct device *_dev, pm_message_t state)
        return ret;
 }
 
-static int pxa2xx_ac97_resume(struct device *_dev)
+static int pxa2xx_ac97_resume(struct platform_device *dev)
 {
-       snd_card_t *card = dev_get_drvdata(_dev);
+       snd_card_t *card = platform_get_drvdata(dev);
        int ret = 0;
 
        if (card)
@@ -302,7 +302,7 @@ static int pxa2xx_ac97_resume(struct device *_dev)
 #define pxa2xx_ac97_resume     NULL
 #endif
 
-static int pxa2xx_ac97_probe(struct device *dev)
+static int pxa2xx_ac97_probe(struct platform_device *dev)
 {
        snd_card_t *card;
        ac97_bus_t *ac97_bus;
@@ -315,8 +315,8 @@ static int pxa2xx_ac97_probe(struct device *dev)
        if (!card)
                goto err;
 
-       card->dev = dev;
-       strncpy(card->driver, dev->driver->name, sizeof(card->driver));
+       card->dev = &dev->dev;
+       strncpy(card->driver, dev->dev.driver->name, sizeof(card->driver));
 
        ret = pxa2xx_pcm_new(card, &pxa2xx_ac97_pcm_client, &pxa2xx_ac97_pcm);
        if (ret)
@@ -347,13 +347,13 @@ static int pxa2xx_ac97_probe(struct device *dev)
        snprintf(card->shortname, sizeof(card->shortname),
                 "%s", snd_ac97_get_short_name(pxa2xx_ac97_ac97));
        snprintf(card->longname, sizeof(card->longname),
-                "%s (%s)", dev->driver->name, card->mixername);
+                "%s (%s)", dev->dev.driver->name, card->mixername);
 
        snd_card_set_pm_callback(card, pxa2xx_ac97_do_suspend,
                                 pxa2xx_ac97_do_resume, NULL);
        ret = snd_card_register(card);
        if (ret == 0) {
-               dev_set_drvdata(dev, card);
+               platform_set_drvdata(dev, card);
                return 0;
        }
 
@@ -368,13 +368,13 @@ static int pxa2xx_ac97_probe(struct device *dev)
        return ret;
 }
 
-static int pxa2xx_ac97_remove(struct device *dev)
+static int pxa2xx_ac97_remove(struct platform_device *dev)
 {
-       snd_card_t *card = dev_get_drvdata(dev);
+       snd_card_t *card = platform_get_drvdata(dev);
 
        if (card) {
                snd_card_free(card);
-               dev_set_drvdata(dev, NULL);
+               platform_set_drvdata(dev, NULL);
                GCR |= GCR_ACLINK_OFF;
                free_irq(IRQ_AC97, NULL);
                pxa_set_cken(CKEN2_AC97, 0);
@@ -383,23 +383,24 @@ static int pxa2xx_ac97_remove(struct device *dev)
        return 0;
 }
 
-static struct device_driver pxa2xx_ac97_driver = {
-       .name           = "pxa2xx-ac97",
-       .bus            = &platform_bus_type,
+static struct platform_driver pxa2xx_ac97_driver = {
        .probe          = pxa2xx_ac97_probe,
        .remove         = pxa2xx_ac97_remove,
        .suspend        = pxa2xx_ac97_suspend,
        .resume         = pxa2xx_ac97_resume,
+       .driver         = {
+               .name   = "pxa2xx-ac97",
+       },
 };
 
 static int __init pxa2xx_ac97_init(void)
 {
-       return driver_register(&pxa2xx_ac97_driver);
+       return platform_driver_register(&pxa2xx_ac97_driver);
 }
 
 static void __exit pxa2xx_ac97_exit(void)
 {
-       driver_unregister(&pxa2xx_ac97_driver);
+       platform_driver_unregister(&pxa2xx_ac97_driver);
 }
 
 module_init(pxa2xx_ac97_init);
index d9ee27ae9a510a2a1e5ff23e767fda896a9e5e37..33813f92ab523855d473a011a185b6c8a73d36c6 100644 (file)
@@ -674,23 +674,24 @@ struct snd_generic_device {
        snd_card_t *card;
 };
 
-#define get_snd_generic_card(dev)      container_of(to_platform_device(dev), struct snd_generic_device, pdev)->card
+#define get_snd_generic_card(dev)      container_of(dev, struct snd_generic_device, pdev)->card
 
 #define SND_GENERIC_NAME       "snd_generic"
 
 #ifdef CONFIG_PM
-static int snd_generic_suspend(struct device *dev, pm_message_t state);
-static int snd_generic_resume(struct device *dev);
+static int snd_generic_suspend(struct platform_device *dev, pm_message_t state);
+static int snd_generic_resume(struct platform_device *dev);
 #endif
 
 /* initialized in sound.c */
-struct device_driver snd_generic_driver = {
-       .name           = SND_GENERIC_NAME,
-       .bus            = &platform_bus_type,
+struct platform_driver snd_generic_driver = {
 #ifdef CONFIG_PM
        .suspend        = snd_generic_suspend,
        .resume         = snd_generic_resume,
 #endif
+       .driver         = {
+               .name   = SND_GENERIC_NAME,
+       },
 };
 
 void snd_generic_device_release(struct device *dev)
@@ -821,7 +822,7 @@ int snd_card_set_pm_callback(snd_card_t *card,
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
 /* suspend/resume callbacks for snd_generic platform device */
-static int snd_generic_suspend(struct device *dev, pm_message_t state)
+static int snd_generic_suspend(struct platform_device *dev, pm_message_t state)
 {
        snd_card_t *card;
 
@@ -834,7 +835,7 @@ static int snd_generic_suspend(struct device *dev, pm_message_t state)
        return 0;
 }
 
-static int snd_generic_resume(struct device *dev)
+static int snd_generic_resume(struct platform_device *dev)
 {
        snd_card_t *card;
 
index 1139dd8ca8eb0d38aa3dcd1f22857ad6b888669f..6e7cad1e947e9fbf4cc3884fa92aede2ca6f80b9 100644 (file)
@@ -32,7 +32,7 @@
 #include <sound/initval.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 
 #define SNDRV_OS_MINORS 256
 
@@ -329,7 +329,7 @@ int __exit snd_minor_info_done(void)
  */
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
-extern struct device_driver snd_generic_driver;
+extern struct platform_driver snd_generic_driver;
 #endif
 
 static int __init alsa_sound_init(void)
@@ -357,7 +357,7 @@ static int __init alsa_sound_init(void)
        }
        snd_info_minor_register();
 #ifdef CONFIG_SND_GENERIC_DRIVER
-       driver_register(&snd_generic_driver);
+       platform_driver_register(&snd_generic_driver);
 #endif
        for (controlnum = 0; controlnum < cards_limit; controlnum++)
                devfs_mk_cdev(MKDEV(major, controlnum<<5), S_IFCHR | device_mode, "snd/controlC%d", controlnum);
@@ -375,7 +375,7 @@ static void __exit alsa_sound_exit(void)
                devfs_remove("snd/controlC%d", controlnum);
 
 #ifdef CONFIG_SND_GENERIC_DRIVER
-       driver_unregister(&snd_generic_driver);
+       platform_driver_unregister(&snd_generic_driver);
 #endif
        snd_info_minor_unregister();
        snd_info_done();
index 7c835abd99bc9ab2abc919b3cb8da9c48341004c..3f30c57676c18c816e2653245833c67214791839 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/module.h>
 #include <linux/stddef.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/isapnp.h>
 #include <linux/pnp.h>
 #include <linux/spinlock.h>
index d0d3963e1b83f1010d5b01496f10f6371de4f41a..adc689649fe1c06e5ce3d6fc568d4b523fd0741d 100644 (file)
@@ -298,6 +298,7 @@ struct cs4281_state {
        struct cs4281_pipeline pl[CS4281_NUMBER_OF_PIPELINES];
 };
 
+#include <linux/pm_legacy.h>
 #include "cs4281pm-24.c"
 
 #if CSDEBUG
index 3dce504e6d6d764ee330e47392238553e7fccf8a..3abd3541cbc724cd940a1ba4eedc76b799dc78a4 100644 (file)
 #include <asm/uaccess.h>
 
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 static int maestro_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *d);
 
 #include "maestro.h"
index 66970062eb363a3bd48493039d4e0f239525f798..0ce2c404a730782ca234eb5827aa2fa045003fce 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include <linux/delay.h>
 #include <linux/spinlock.h>
 #include "sound_config.h"
index 2efbd865109bf350f7c1f1c8809ea70c20106ab0..cd41d0e4706a90721ee09982b1d50a3f66eeb819 100644 (file)
@@ -70,6 +70,7 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/pm.h>
+#include <linux/pm_legacy.h>
 #include "sound_config.h"
 
 #include "ad1848.h"
@@ -138,7 +139,7 @@ typedef struct {
        struct pnp_dev* pdev;
        int activated;                  /* Whether said devices have been activated */
 #endif
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
        unsigned int    in_suspend;
        struct pm_dev   *pmdev;
 #endif
@@ -341,7 +342,7 @@ static void opl3sa2_mixer_reset(opl3sa2_state_t* devc)
 }
 
 /* Currently only used for power management */
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
 static void opl3sa2_mixer_restore(opl3sa2_state_t* devc)
 {
        if (devc) {
@@ -354,7 +355,7 @@ static void opl3sa2_mixer_restore(opl3sa2_state_t* devc)
                }
        }
 }
-#endif
+#endif /* CONFIG_PM_LEGACY */
 
 static inline void arg_to_vol_mono(unsigned int vol, int* value)
 {
@@ -831,7 +832,8 @@ static struct pnp_driver opl3sa2_driver = {
 
 /* End of component functions */
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
+
 static DEFINE_SPINLOCK(opl3sa2_lock);
 
 /* Power Management support functions */
@@ -906,7 +908,7 @@ static int opl3sa2_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *dat
        }
        return 0;
 }
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM_LEGACY */
 
 /*
  * Install OPL3-SA2 based card(s).
@@ -1019,12 +1021,12 @@ static int __init init_opl3sa2(void)
 
                /* ewww =) */
                opl3sa2_state[card].card = card;
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
                /* register our power management capabilities */
                opl3sa2_state[card].pmdev = pm_register(PM_ISA_DEV, card, opl3sa2_pm_callback);
                if (opl3sa2_state[card].pmdev)
                        opl3sa2_state[card].pmdev->data = &opl3sa2_state[card];
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM_LEGACY */
 
                /*
                 * Set the Yamaha 3D enhancement mode (aka Ymersion) if asked to and
@@ -1081,7 +1083,7 @@ static void __exit cleanup_opl3sa2(void)
        int card;
 
        for(card = 0; card < opl3sa2_cards_num; card++) {
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_LEGACY
                if (opl3sa2_state[card].pmdev)
                        pm_unregister(opl3sa2_state[card].pmdev);
 #endif
index e72ccd1a004f9dce58479a507dfced1a8f8374cd..1fdae678a34526e430ad564ca3643321f27dd964 100644 (file)
@@ -1067,7 +1067,6 @@ MODULE_DEVICE_TABLE(pci, snd_ad1889_ids);
 
 static struct pci_driver ad1889_pci = {
        .name = "AD1889 Audio",
-       .owner = THIS_MODULE,
        .id_table = snd_ad1889_ids,
        .probe = snd_ad1889_probe,
        .remove = __devexit_p(snd_ad1889_remove),
index 4e76c4a636d93e9de0d6116fd3d4fde9edd72077..feffbe73387e5e4655d056da24cc37e3c638caff 100644 (file)
@@ -2403,7 +2403,6 @@ static void __devexit snd_ali_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ALI 5451",
-       .owner = THIS_MODULE,
        .id_table = snd_ali_ids,
        .probe = snd_ali_probe,
        .remove = __devexit_p(snd_ali_remove),
index 7c61561f297fc266466120e9b52b6754b4a4dc70..1904df65026588210b95ac4a36c203f159b0dc81 100644 (file)
@@ -768,7 +768,6 @@ static void __devexit snd_card_als4000_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ALS4000",
-       .owner = THIS_MODULE,
        .id_table = snd_als4000_ids,
        .probe = snd_card_als4000_probe,
        .remove = __devexit_p(snd_card_als4000_remove),
index f5dad9248e3999b8a69290391e9a6c3845d33975..8bae10d93529b5c273ca6ebe8f12f42997bde39b 100644 (file)
@@ -1635,7 +1635,6 @@ static void __devexit snd_atiixp_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ATI IXP AC97 controller",
-       .owner = THIS_MODULE,
        .id_table = snd_atiixp_ids,
        .probe = snd_atiixp_probe,
        .remove = __devexit_p(snd_atiixp_remove),
index 0cf2020795718e358ce79f5baa6d91a1ddbf1f98..3174b6625419607fca5f6d9278ad4e6180b17875 100644 (file)
@@ -1309,7 +1309,6 @@ static void __devexit snd_atiixp_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ATI IXP MC97 controller",
-       .owner = THIS_MODULE,
        .id_table = snd_atiixp_ids,
        .probe = snd_atiixp_probe,
        .remove = __devexit_p(snd_atiixp_remove),
index 6af3b13f2fd1d856b59e5c9abe71bb7d3f70cdaa..d965609d8b380488899457dfeb24e2406f96a9b8 100644 (file)
@@ -373,7 +373,6 @@ static void __devexit snd_vortex_remove(struct pci_dev *pci)
 // pci_driver definition
 static struct pci_driver driver = {
        .name = CARD_NAME_SHORT,
-       .owner = THIS_MODULE,
        .id_table = snd_vortex_ids,
        .probe = snd_vortex_probe,
        .remove = __devexit_p(snd_vortex_remove),
index da99b1be2e8fd36e3cf639abc065ff1e85d40376..ab737d6df41d13ede9cd02b064522bbb34281fe3 100644 (file)
@@ -1838,7 +1838,6 @@ snd_azf3328_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "AZF3328",
-       .owner = THIS_MODULE,
        .id_table = snd_azf3328_ids,
        .probe = snd_azf3328_probe,
        .remove = __devexit_p(snd_azf3328_remove),
index 01d98eeb242e94b695878abc677508ca008ba730..8feca228c6d4f3b32d18ec5b8d7a93b43702f7b9 100644 (file)
@@ -897,14 +897,13 @@ static void __devexit snd_bt87x_remove(struct pci_dev *pci)
 /* default entries for all Bt87x cards - it's not exported */
 /* driver_data is set to 0 to call detection */
 static struct pci_device_id snd_bt87x_default_ids[] = {
-       BT_DEVICE(878, PCI_ANY_ID, PCI_ANY_ID, 0),
-       BT_DEVICE(879, PCI_ANY_ID, PCI_ANY_ID, 0),
+       BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, PCI_ANY_ID, PCI_ANY_ID, 0),
+       BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, PCI_ANY_ID, PCI_ANY_ID, 0),
        { }
 };
 
 static struct pci_driver driver = {
        .name = "Bt87x",
-       .owner = THIS_MODULE,
        .id_table = snd_bt87x_ids,
        .probe = snd_bt87x_probe,
        .remove = __devexit_p(snd_bt87x_remove),
index ee58d16002e565520b05ede5342c610e7ad331c1..389d967c97f44f1ed58fbb6b1561041154c4e5ff 100644 (file)
@@ -1499,7 +1499,6 @@ MODULE_DEVICE_TABLE(pci, snd_ca0106_ids);
 // pci_driver definition
 static struct pci_driver driver = {
        .name = "CA0106",
-       .owner = THIS_MODULE,
        .id_table = snd_ca0106_ids,
        .probe = snd_ca0106_probe,
        .remove = __devexit_p(snd_ca0106_remove),
index 57e8e433d56f9bcdb2cd27bcc3178d2ca273df72..db605373b3bcb09d9e0e576ba9097fafe80469a2 100644 (file)
@@ -3053,7 +3053,6 @@ static void __devexit snd_cmipci_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "C-Media PCI",
-       .owner = THIS_MODULE,
        .id_table = snd_cmipci_ids,
        .probe = snd_cmipci_probe,
        .remove = __devexit_p(snd_cmipci_remove),
index aea2c47712f91068033f13d5e70b3db5f6fcfe36..034ff3755a3b039ff9c7793e93a029f45cb39957 100644 (file)
@@ -2106,7 +2106,6 @@ static int cs4281_resume(snd_card_t *card)
 
 static struct pci_driver driver = {
        .name = "CS4281",
-       .owner = THIS_MODULE,
        .id_table = snd_cs4281_ids,
        .probe = snd_cs4281_probe,
        .remove = __devexit_p(snd_cs4281_remove),
index 32b4f8465cefb898c2fd107188621eda60109502..b9fff4ee6f9dc789db6285c08cf18bf2332b6260 100644 (file)
@@ -163,7 +163,6 @@ static void __devexit snd_card_cs46xx_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Sound Fusion CS46xx",
-       .owner = THIS_MODULE,
        .id_table = snd_cs46xx_ids,
        .probe = snd_card_cs46xx_probe,
        .remove = __devexit_p(snd_card_cs46xx_remove),
index dd1ea9d3b81ae77a4d96555d9ecb4e9aca43ab5a..78270f8710ff0848ff5c29e5fe5eff3e5b989f06 100644 (file)
@@ -223,7 +223,6 @@ static void __devexit snd_card_emu10k1_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "EMU10K1_Audigy",
-       .owner = THIS_MODULE,
        .id_table = snd_emu10k1_ids,
        .probe = snd_card_emu10k1_probe,
        .remove = __devexit_p(snd_card_emu10k1_remove),
index cbb689474e7d12297981e62b2d23883c5a9bd57e..795577716a5dc61562e65f4d958fed23df06f023 100644 (file)
@@ -1613,7 +1613,6 @@ MODULE_DEVICE_TABLE(pci, snd_emu10k1x_ids);
 // pci_driver definition
 static struct pci_driver driver = {
        .name = "EMU10K1X",
-       .owner = THIS_MODULE,
        .id_table = snd_emu10k1x_ids,
        .probe = snd_emu10k1x_probe,
        .remove = __devexit_p(snd_emu10k1x_remove),
index 92ff7c510f2b8453705c5eefccdcbef454e7a3c2..2daa575f43ff98daf82566054f5e30fbb74411f7 100644 (file)
@@ -2386,7 +2386,6 @@ static void __devexit snd_audiopci_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = DRIVER_NAME,
-       .owner = THIS_MODULE,
        .id_table = snd_audiopci_ids,
        .probe = snd_audiopci_probe,
        .remove = __devexit_p(snd_audiopci_remove),
index 78f90defcab185eca25ac430d8b6c21c69489ea3..c134f48152b0d2ccfca21f3423c15a6d52f66258 100644 (file)
@@ -1758,7 +1758,6 @@ static void __devexit snd_es1938_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ESS ES1938 (Solo-1)",
-       .owner = THIS_MODULE,
        .id_table = snd_es1938_ids,
        .probe = snd_es1938_probe,
        .remove = __devexit_p(snd_es1938_remove),
index ac8294e21cc17eeb8ee3a28fe747ba49bdea461b..50079dc90743cd70b57cc0feb3422a51ff3d640c 100644 (file)
@@ -2761,7 +2761,6 @@ static void __devexit snd_es1968_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ES1968 (ESS Maestro)",
-       .owner = THIS_MODULE,
        .id_table = snd_es1968_ids,
        .probe = snd_es1968_probe,
        .remove = __devexit_p(snd_es1968_remove),
index 4c7c8d225c7f69825e77b9261675eddd5208b416..4e1d3434888d39eff8364a479e1f7cbba30c2f72 100644 (file)
@@ -1459,7 +1459,6 @@ static void __devexit snd_card_fm801_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "FM801",
-       .owner = THIS_MODULE,
        .id_table = snd_fm801_ids,
        .probe = snd_card_fm801_probe,
        .remove = __devexit_p(snd_card_fm801_remove),
index 9d1412a9f2f85f0d93c63913a3cb9eb790b4fd5f..ed525c03c996fd6b6f5209b369d2e1fdd66a5e53 100644 (file)
@@ -1616,7 +1616,6 @@ MODULE_DEVICE_TABLE(pci, azx_ids);
 /* pci_driver definition */
 static struct pci_driver driver = {
        .name = "HDA Intel",
-       .owner = THIS_MODULE,
        .id_table = azx_ids,
        .probe = azx_probe,
        .remove = __devexit_p(azx_remove),
index 5aca37798c3233a68fd266eca705b0a53b21d9fb..bd71bf424549afa419ad80a44d767650e3dcf153 100644 (file)
@@ -2735,7 +2735,6 @@ static void __devexit snd_ice1712_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ICE1712",
-       .owner = THIS_MODULE,
        .id_table = snd_ice1712_ids,
        .probe = snd_ice1712_probe,
        .remove = __devexit_p(snd_ice1712_remove),
index 5b4293f5a6522bad4e254839644573b7db8f90dc..0b5389ee26d50af4c025ec49452794a4f53327c1 100644 (file)
@@ -2332,7 +2332,6 @@ static void __devexit snd_vt1724_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "ICE1724",
-       .owner = THIS_MODULE,
        .id_table = snd_vt1724_ids,
        .probe = snd_vt1724_probe,
        .remove = __devexit_p(snd_vt1724_remove),
index 0801083f32ddd75544755c03dbe43fd7c463546a..cf7801d2dd10fff1490a5aeec7dd56b5eceb17f3 100644 (file)
@@ -2876,7 +2876,6 @@ static void __devexit snd_intel8x0_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Intel ICH",
-       .owner = THIS_MODULE,
        .id_table = snd_intel8x0_ids,
        .probe = snd_intel8x0_probe,
        .remove = __devexit_p(snd_intel8x0_remove),
index acfb197a833cddc9a17f14f4d80ed71e87e94725..a42091860da7c9af20da2e9f040de8f45676d8d4 100644 (file)
@@ -1317,7 +1317,6 @@ static void __devexit snd_intel8x0m_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Intel ICH Modem",
-       .owner = THIS_MODULE,
        .id_table = snd_intel8x0m_ids,
        .probe = snd_intel8x0m_probe,
        .remove = __devexit_p(snd_intel8x0m_remove),
index 5561fd4091e8089a1bb53d5881fb8eef9a1bdf72..a110d664f62652d10d37782af38fb165c14115fa 100644 (file)
@@ -2534,7 +2534,6 @@ static void __devexit snd_korg1212_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "korg1212",
-       .owner = THIS_MODULE,
        .id_table = snd_korg1212_ids,
        .probe = snd_korg1212_probe,
        .remove = __devexit_p(snd_korg1212_remove),
index 99eb76c56f81059e6b0709c598108d5c9e18d7d1..ede7a75bfe08169f561d40ddfab498eafab9d89a 100644 (file)
@@ -2858,7 +2858,6 @@ static void __devexit snd_m3_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Maestro3",
-       .owner = THIS_MODULE,
        .id_table = snd_m3_ids,
        .probe = snd_m3_probe,
        .remove = __devexit_p(snd_m3_remove),
index c341c99ec783d97f97dc110c52dfabd99ed88e4a..b3090a13edab85c31337bad8ccdef244c5f028bf 100644 (file)
@@ -1423,7 +1423,6 @@ static void __devexit snd_mixart_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Digigram miXart",
-       .owner = THIS_MODULE,
        .id_table = snd_mixart_ids,
        .probe = snd_mixart_probe,
        .remove = __devexit_p(snd_mixart_remove),
index e7aa15178453bf6366afaccaa6a1d31737d0eedb..089d23b4a002287b4a8eea4e8b3100c16dbe9ea1 100644 (file)
@@ -1673,7 +1673,6 @@ static void __devexit snd_nm256_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "NeoMagic 256",
-       .owner = THIS_MODULE,
        .id_table = snd_nm256_ids,
        .probe = snd_nm256_probe,
        .remove = __devexit_p(snd_nm256_remove),
index e6627b0e38e40f7136fdeecedbcbe48629063318..783df7625c1c34084940857e9768bc63237c9fe4 100644 (file)
@@ -2012,7 +2012,6 @@ static void __devexit snd_rme32_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name =         "RME Digi32",
-       .owner =        THIS_MODULE,
        .id_table =     snd_rme32_ids,
        .probe =        snd_rme32_probe,
        .remove =       __devexit_p(snd_rme32_remove),
index 0eddeb16a10f4bbce5aa19c5496ab457a2236eff..6d422ef6499911ece8f4fadae8314e66dd755ea2 100644 (file)
@@ -2413,7 +2413,6 @@ static void __devexit snd_rme96_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "RME Digi96",
-       .owner = THIS_MODULE,
        .id_table = snd_rme96_ids,
        .probe = snd_rme96_probe,
        .remove = __devexit_p(snd_rme96_remove),
index 845158b01b0295ac089b16b56110bc1f30bf47c3..d15ffb3e9b0a58195744bf35944b07c27e7cb533 100644 (file)
@@ -5062,7 +5062,6 @@ static void __devexit snd_hdsp_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name =     "RME Hammerfall DSP",
-       .owner =    THIS_MODULE,
        .id_table = snd_hdsp_ids,
        .probe =    snd_hdsp_probe,
        .remove = __devexit_p(snd_hdsp_remove),
index 60a1141f13271241b84daac4a14bed74e790fe8e..a1aef6f6767ea64e5c081b0aec215b89e291fe93 100644 (file)
@@ -3639,7 +3639,6 @@ static void __devexit snd_hdspm_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "RME Hammerfall DSP MADI",
-       .owner = THIS_MODULE,
        .id_table = snd_hdspm_ids,
        .probe = snd_hdspm_probe,
        .remove = __devexit_p(snd_hdspm_remove),
index 59fcef9b6b81d0b7e7859ec3ca6882a3e07cec31..f9d0c126c2131bc6120715290431d22a895e5f59 100644 (file)
@@ -2654,7 +2654,6 @@ static void __devexit snd_rme9652_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name     = "RME Digi9652 (Hammerfall)",
-       .owner    = THIS_MODULE,
        .id_table = snd_rme9652_ids,
        .probe    = snd_rme9652_probe,
        .remove   = __devexit_p(snd_rme9652_remove),
index 9a35474aad052fcee67e161124fcce5f06437553..e92ef3ae2ca121f92d83b3a465f59ee12c9c3650 100644 (file)
@@ -1502,7 +1502,6 @@ static void __devexit snd_sonic_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "S3 SonicVibes",
-       .owner = THIS_MODULE,
        .id_table = snd_sonic_ids,
        .probe = snd_sonic_probe,
        .remove = __devexit_p(snd_sonic_remove),
index a8ca8e17853f3b0142241bd807818c738761da4e..940d531575c098cd736776420b0b674c45094e3d 100644 (file)
@@ -177,7 +177,6 @@ static void __devexit snd_trident_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Trident4DWaveAudio",
-       .owner = THIS_MODULE,
        .id_table = snd_trident_ids,
        .probe = snd_trident_probe,
        .remove = __devexit_p(snd_trident_remove),
index 523eace250f7c4e96ad081ea774d494b9776ec36..fad2a2413bf62c03bb34f913415966cfa2d260fb 100644 (file)
@@ -2478,7 +2478,6 @@ static void __devexit snd_via82xx_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "VIA 82xx Audio",
-       .owner = THIS_MODULE,
        .id_table = snd_via82xx_ids,
        .probe = snd_via82xx_probe,
        .remove = __devexit_p(snd_via82xx_remove),
index 011f0fb63bf9e5b288675b77df5bbb4841039b38..b83660bd05b0685dedef9420c5f41c10deeb648c 100644 (file)
@@ -1198,7 +1198,6 @@ static void __devexit snd_via82xx_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "VIA 82xx Modem",
-       .owner = THIS_MODULE,
        .id_table = snd_via82xx_modem_ids,
        .probe = snd_via82xx_probe,
        .remove = __devexit_p(snd_via82xx_remove),
index 2a7ad9dec02175409a54d8f5d2560f6150d2a51a..dca6bd2c75806298eeacf5e5468f7141a7141240 100644 (file)
@@ -252,7 +252,6 @@ static void __devexit snd_vx222_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Digigram VX222",
-       .owner = THIS_MODULE,
        .id_table = snd_vx222_ids,
        .probe = snd_vx222_probe,
        .remove = __devexit_p(snd_vx222_remove),
index 1bbba32517ff7c08f89593502d52df4c417a64a6..d013237205d800bc436b3da3dd7b592a0f5d1f2e 100644 (file)
@@ -344,7 +344,6 @@ static void __devexit snd_card_ymfpci_remove(struct pci_dev *pci)
 
 static struct pci_driver driver = {
        .name = "Yamaha DS-XG PCI",
-       .owner = THIS_MODULE,
        .id_table = snd_ymfpci_ids,
        .probe = snd_card_ymfpci_probe,
        .remove = __devexit_p(snd_card_ymfpci_remove),
index 65384afcfc3f39480e95b226806033421419ee8e..d74bfabe5300c9e20893bf3edbb4a48a75525ac1 100644 (file)
@@ -1194,8 +1194,14 @@ static void tumbler_resume(pmac_t *chip)
        tumbler_set_master_volume(mix);
        if (chip->update_automute)
                chip->update_automute(chip, 0);
-       if (mix->headphone_irq >= 0)
+       if (mix->headphone_irq >= 0) {
+               unsigned char val;
+
                enable_irq(mix->headphone_irq);
+               /* activate headphone status interrupts */
+               val = do_gpio_read(&mix->hp_detect);
+               do_gpio_write(&mix->hp_detect, val | 0x80);
+       }
        if (mix->lineout_irq >= 0)
                enable_irq(mix->lineout_irq);
 }